Android init.rc的启动流程

  
Android开机优化系列文档-CSDN博客

  • Android 14 开机时间优化措施汇总-CSDN博客
  • Android 14 开机时间优化措施-CSDN博客
  • 根据systrace报告优化系统时需要关注的指标和优化策略-CSDN博客
  • Android系统上常见的性能优化工具-CSDN博客
  • Android上如何使用perfetto分析systrace-CSDN博客
  • Android系统设置kernel log level的方法-CSDN博客
  • Android14系统应用统一裁剪方案_android 开机 服务 裁剪-CSDN博客
  • Android系统上Bootchart的使用_android bootchart-CSDN博客
  • Android init.rc如何并行执行任务-CSDN博客
  • Android init常用调试工具-CSDN博客
  • 如何识别Android init 中的缓慢操作-CSDN博客
  • Android init 中的wait_for_property指令-CSDN博客
  • Android init.rc各阶段的定义和功能-CSDN博客
  • Android init.rc的启动流程-CSDN博客

Android init.rc的启动流程

在 Android 系统中,init.rc 文件是系统初始化的重要配置文件之一。它定义了系统启动过程中各个阶段的程序和服务启动的顺序。理解这个顺序对调试和优化 Android 系统非常重要。以下是 init.rc 的启动流程详细解释,以及如何在文件中指定服务的启动顺序。

1. init.rc 文件中的主要内容

init.rc 文件通常包括以下几个部分:

1.1. 设置属性

init.rc 中,可以定义系统属性。属性通常用于在运行时传递配置信息:

# 设置一个系统属性
export PROPERTY_NAME PROPERTY_VALUE

1.2. 挂载文件系统

init.rc 会定义文件系统的挂载点:

# 挂载 /system 分区
mount ext4 /dev/block/bootdevice/by-name/system /system

1.3. 启动服务

服务通常由 service 指令启动。每个服务由一个名称、一个可执行文件路径和启动参数组成:

# 启动名为 'logcat' 的服务
service logcat /system/bin/logcat

1.4. 定义事件和动作

可以设置不同的事件和这些事件触发时要执行的动作:

# 当系统启动时
on boot {# 执行某些操作start logcat
}

2.init启动过程概述

Android 系统的启动过程分为几个主要阶段,每个阶段负责不同的初始化任务。在 Android 启动时,init 程序是第一个运行的用户空间进程。init 负责启动系统服务、挂载文件系统、设置权限等任务。init.rcinit 程序的配置文件,定义了这些启动任务和服务的详细信息,文件中的指令会按照特定的顺序执行来完成这些任务。

2.1. 启动 init 程序

当 Android 系统启动时,内核会加载并启动 init 程序。init 是系统中第一个用户空间进程,其进程 ID(PID)为 1。

2.2. 解析 init.rc

init 程序开始运行时,会读取并解析 init.rc 文件。这个文件通常位于 /system/etc/ 目录下,但也可能会有不同的路径,具体取决于设备和 Android 版本。

2.3. 处理 init.rc 中的指令

init.rc 文件中包含的指令会被 init 程序逐行读取和执行。以下是一些常见的 init.rc 指令和其功能:

  • on: 定义事件触发时的行为。例如,on boot 事件在系统启动时触发。

  • service: 启动和管理系统服务的指令。例如,service foo /system/bin/foo 用于启动名为 foo 的服务。

  • import: 导入其他配置文件。例如,import /vendor/etc/init/hw/init.rc 可以导入其他配置文件。

  • mount: 挂载文件系统。例如,mount ext4 /dev/block/bootdevice/by-name/system /system 用于挂载 system 分区。

2.4.init.rc详细启动顺序

以下是init.rc 大致的启动顺序:

  1. 加载 init.rc 配置文件

  2. 解析文件init 程序读取并解析 init.rc 文件。

  3. 挂载文件系统:执行文件系统挂载等操作。

  4. 设置系统属性:根据 export 指令设置系统属性。

  5. 启动基本服务:根据 service 指令启动系统服务。

  6. 处理事件:根据 on 事件指令执行特定动作。

    1. 执行系统初始化任务

    2. 启动应用框架服务

    3. 启动用户空间应用程序

3.init.rc详细启动流程和指令

3.1. 加载和解析 init.rc 文件

init 程序在启动时首先会读取 init.rc 文件,解析文件中的指令。

import /init.rc
  • init.rc 文件会被 init 程序逐行读取。

  • 文件中的指令会被解析并按照它们在文件中的顺序执行。

3.2. 挂载文件系统

文件系统的挂载通常是第一个被执行的任务。通过 mount 指令挂载必要的分区:

mount ext4 /dev/block/bootdevice/by-name/system /system
  • mount: 挂载不同的分区和文件系统。

  • on post-fs-data: 指定在文件系统挂载完成后执行的任务。

on post-fs-datamount ext4 /dev/block/bootdevice/by-name/system /system
3.3. 设置系统属性

系统属性通常在挂载文件系统之后设置:

export ro.build.id=PQ1A.190406.012
  • export: 设置系统属性的指令。

  • on property:: 指定在属性变更时执行的操作。

on property:ro.build.type=engstart debugging
3.4. 启动基本服务

在文件系统挂载和属性设置后,init 开始启动基本的系统服务:

service zygote /system/bin/app_process /system/bin --zygotesocket zygote stream 660 system systemonrestart restart media
  • service: 启动服务的指令。

  • on: 触发条件,如 on boot

on boot {start zygote
}
3.5. 执行系统初始化任务

系统初始化任务会在基本服务启动后执行,任务可以包括设置权限、启动其他服务等:

on boot {start zygotestart surfaceflinger
}
  • on: on boot 触发条件,系统启动时执行。

3.6. 启动应用框架服务

应用框架服务包括 Activity Manager、Package Manager 等:

service activity /system/bin/activity
  • service: 定义应用框架服务。

3.7. 启动用户空间应用程序

系统服务启动后,用户空间的应用程序也会被启动:

service myapp /system/bin/myapp

4.各阶段的示例

以下是不同阶段的 init.rc 文件内容示例,展示了启动顺序中的不同任务和指令:

示例 1: 基本配置
# Import additional config files
import /vendor/etc/init/hw/init.rc# Mount filesystems
on post-fs-datamount ext4 /dev/block/bootdevice/by-name/system /system
示例 2: 启动服务
# Start the zygote process
on boot {start zygote
}# Define the zygote service
service zygote /system/bin/app_process /system/bin --zygotesocket zygote stream 660 system systemonrestart restart media
示例 3: 启动应用框架
shell
复制代码
# Start the Activity Manager and other services
on boot {start activitystart package
}

5.启动顺序的详细控制

init.rc 中,启动顺序不仅依赖于文件中的指令顺序,还可以通过服务的依赖关系进行控制:

  • onrestart: 定义服务重启时的行为。

service foo /system/bin/foosocket foo stream 660 system systemonrestart restart bar
  • on 事件: 触发条件,例如 on property:on boot:

on property:sys.boot_completed=1start myapp

6.服务的启动顺序控制

有些服务的启动顺序可以通过服务之间的依赖关系来控制:

service foo /system/bin/foosocket foo stream 660 system systemonrestart restart bar
service bar /system/bin/barsocket bar stream 660 system system

在这个例子中,bar 服务将在 foo 服务重启时被重启。

7. init.rc 文件结构化示例

以下是一个简化的 init.rc 文件示例,展示了启动服务、挂载文件系统和设置属性的基本用法:

# Define system properties
export ro.build.id=PQ1A.190406.012
export ro.build.version.incremental=eng.example.20210705.0100# Mount partitions
mount ext4 /dev/block/platform/bootdevice/by-name/system /system# Define services
service zygote /system/bin/app_process /system/bin --zygotesocket zygote stream 660 system systemonrestart restart mediaservice media /system/bin/mediasocket media stream 660 system system# Define actions on system events
on boot {start zygotestart media
}

以下是一个更复杂的 init.rc 文件示例,展示了如何在不同的启动阶段定义服务和任务:

# Import additional configuration files
import /vendor/etc/init/hw/init.rc# Mount filesystems
on post-fs-datamount ext4 /dev/block/bootdevice/by-name/system /systemmount ext4 /dev/block/bootdevice/by-name/data /data# Set system properties
export ro.build.id=PQ1A.190406.012# Start services on boot
on boot {start zygotestart surfaceflingerstart media
}# Define the zygote service
service zygote /system/bin/app_process /system/bin --zygotesocket zygote stream 660 system systemonrestart restart media# Define the surfaceflinger service
service surfaceflinger /system/bin/surfaceflingersocket surfaceflinger stream 660 system system# Define the media service
service media /system/bin/mediasocket media stream 660 system system

8.常见问题和调试

常见问题

  • 服务启动顺序错误:确保 init.rc 中的服务启动顺序符合服务之间的依赖关系。

  • 服务无法启动:检查服务的路径和权限,确保所需的资源和依赖项已准备好。

调试工具

  • adb logcat:查看 init 过程中的日志信息。

  • adb shell:手动检查服务状态和执行命令。

9. 高级特性和扩展

除了 init.rc,在 Android 中还有其他 .rc 文件用于更细粒度的配置,比如 vendor.rcdevice.rc,这些文件可以通过 import 指令导入到 init.rc 中。

对于高级配置和定制化需求,可以深入学习以下内容:

  • init 的启动机制:了解 init 启动机制的详细实现。

  • init源代码:可以从 AOSP 获取最新的 init 源代码。

参考文档

  • AOSP init 代码库

  • Android Developer Guide

参考链接

  • Android init 进程解析

  • Android init.rc 文件详细介绍

  • init 系统服务和事件

  • Android init 及服务管理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/48837.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++中的atomic:原子

在多线程编程中&#xff0c;原子操作是一种重要的技术&#xff0c;可以确保在并发环境中进行无锁操作。C11 引入了 std::atomic<>&#xff0c;提供了一种无锁的机制来操作变量&#xff0c;确保在并发环境中访问和修改变量时没有数据竞争。本文将介绍 std::atomic<>…

HarmonyOS应用开发者高级认证,Next版本发布后最新题库 - 单选题序号1

本来打算找到工作再整理高级的题库&#xff0c;但一直没什么面试机会。宅在家里也不知道干些什么。索性就把高级的题库整理出来了。也算有头有尾。高级的题库更新之后&#xff0c;专业性更强了&#xff0c;不是真正从事这一行的&#xff0c;很难做出来。本人就是个小菜鸡&#…

【.NET全栈】ASP.NET开发Web应用——用户控件和绘图

文章目录 前言一、用户控件1、创建用户控件2、使用用户控件3、在web.config中注册用户控件4、用户控件中公开属性5、用户控件事件6、动态加载用户控件 二、动态绘图1、基本绘图2、绘制一个自定义的图片3、在Web页面放置自定义图片4、图片格式和质量5、一个Web绘图示例程序 前言…

matlab simulink气隙局部放电仿真技术研究

1、内容简介 略 87-可以交流、咨询、答疑 2、内容说明 略 为了解决目前国内外局部放电仿真方法难以计算气隙局部放电暂态过程的问题 , 利用 MATLAB (SIMULINK ) 的公共模块库和电力系统专业模块库 , 根据单气隙局部放电仿真物理模型 , 构造了气隙局部放 电仿真计算的电…

Python运算

目录 1. 算术运算符 2. 赋值运算符 3. 比较运算符 4. 逻辑运算符 5. 位运算符 6. 成员运算符 7. 身份运算符 1. 算术运算符 运算符描述示例加法a b-减法a - b*乘法a * b/除法a / b//取整除a // b%取余数a % b**幂运算a ** b 示例&#xff1a; a 10 b 3 print(a b…

打造安全堡垒:Xcode应用权限管理全解析

打造安全堡垒&#xff1a;Xcode应用权限管理全解析 在移动应用开发中&#xff0c;权限管理是确保用户数据安全和应用正常运行的关键环节。Xcode&#xff0c;作为iOS和macOS应用开发的集成环境&#xff0c;提供了一套完善的权限管理系统。本文将深入探讨Xcode中应用权限管理的策…

树状数组优化dp

这个题目怎么去想呢&#xff0c;我们先构造前缀和&#xff0c;一般思路肯定是用两层循环&#xff0c;但是一定会超时&#xff0c;我们的数据范围是 1e5&#xff0c;那我们必须找到复杂度为 nlog n 的才行&#xff0c;所以我们可以考虑每次计算以 i 结尾的子数组的数量&#xff…

移动硬盘在苹果电脑上使用后在windows中无法读取 Win和Mac的硬盘怎么通用

在日益普及的跨平台工作环境中&#xff0c;苹果电脑与Windows PC之间的数据交换成为日常需求。然而&#xff0c;用户常面临一个困扰&#xff1a;为何苹果电脑的硬盘能在macOS下流畅运行&#xff0c;却在Windows系统中变得“水土不服”&#xff1f;这一问题核心在于硬盘格式的不…

MT19937

MT19937 文章目录 MT19937题型1 逆向extract_number[SUCTF2019]MT 题型2 预测随机数[GKCTF 2021]Random 题型3逆向twist[V&N2020 公开赛]Backtrace 题型4 逆向init扩展题型WKCTF easy_random 现成模块randcrack库Extend MT19937 Predictor库 MT19937是一种周期很长的伪随机…

安全防御:过滤技术

目录 一、URL过滤 URL过滤的方式 二、HTTP与HTTPS HTTP协议获取URL的方式 HTTP协议做控制管理的流程 HTTPS 1&#xff0c;配置SSL的解密功能 2&#xff0c;直接针对加密流量进行过滤 需求&#xff1a; 三、DNS过滤 四、内容过滤 文件过滤技术 文件过滤技术的处理流…

抖音私信卡片制作教程,使用W外链创建抖音/快手/小红书卡片

在数字营销和社交媒体日益繁荣的今天&#xff0c;利用外部链接&#xff08;W外链平台&#xff09;为抖音平台创建卡片已成为一种有效的推广手段。抖音卡片不仅可以直接将观众导向目标网页或产品&#xff0c;还能提高用户的参与度和品牌的曝光度。下面&#xff0c;我们将详细介绍…

java-selenium 截取界面验证码图片并对图片文本进行识别

参考链接 1、需要下载Tesseract工具并配置环境变量&#xff0c;步骤如下 Tesseract-OCR 下载安装和使用_tesseract-ocr下载-CSDN博客 2、需要在IDEA中导入tess4j 包&#xff1b;在pom.xml文件中输入如下内容 <!--导入Tesseract 用于识别验证码--><dependency>&l…

微信小程序开发:基础架构与配置文件

✨✨ 欢迎大家来访Srlua的博文&#xff08;づ&#xffe3;3&#xffe3;&#xff09;づ╭❤&#xff5e;✨✨ &#x1f31f;&#x1f31f; 欢迎各位亲爱的读者&#xff0c;感谢你们抽出宝贵的时间来阅读我的文章。 我是Srlua小谢&#xff0c;在这里我会分享我的知识和经验。&am…

基于支持向量机(SVM)的数据回归预测

代码原理及流程 支持向量机&#xff08;SVM&#xff09;是一种强大的机器学习算法&#xff0c;既可以用于分类问题&#xff0c;也可以用于回归问题。在回归问题中&#xff0c;SVM 的目标是找到一个函数&#xff0c;使得预测值与实际值之间的误差最小化&#xff0c;并且保持在一…

set(集合),multiset容器及pair队组的创建

1.set的基本概念&#xff1a;所有元素再插入时自动按升序排序&#xff0c;set/multiset属于关联式容器&#xff0c;底层结构是用二叉树实现的 set与multiset区别&#xff1a; set中不允许容器中有重复的元素 multiset允许容器中有重复的元素 2.set的构造函数 3.set的大小和…

【NLP】关于参数do_sample的解释

在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;特别是在使用神经网络模型进行文本生成时&#xff0c;do_sample是一个常见的参数&#xff0c;用于控制模型生成文本的方式。具体来说&#xff0c;do_sample参数决定模型是否采用随机采样&#xff08;sampling&#x…

python—爬虫爬取视频样例

下面是一个使用Python爬虫爬取视频的基本例子。创建一个Python爬虫来爬取视频通常涉及到几个步骤&#xff1a;发送HTTP请求、解析网页内容、提取视频链接、下载视频文件。 import jsonimport requests from lxml import etreeif __name__ __main__:# UA伪装head {"User…

【js自学打卡11】生成器函数(generator函数)的使用总结+代码举例

力扣的js入门免费题刷完了&#xff0c;开始自己找题练练&#xff0c;顺便捡捡知识点 力扣2649 1.思路 一眼递归&#xff0c;但事实证明也可以直接flat手撕。 arr.flat(Infinity) //直接扁平化到最底层涉及到了一些关于生成器和异步编程相关的知识点&#xff0c;学一下。 2.…

web前端 React 框架面试200题(三)

面试题 65. 在使用 React Router时&#xff0c;如何获取当前页面的路由或浏览器中地址栏中的地址&#xff1f; 参考回答&#xff1a; 在当前组件的 props中&#xff0c;包含 location属性对象&#xff0c;包含当前页面路由地址信息&#xff0c;在 match中存储当前路由的参数等…