- 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
中,可以定义系统属性。属性通常用于在运行时传递配置信息:
bash
# 设置一个系统属性
export PROPERTY_NAME PROPERTY_VALUE
1.2. 挂载文件系统
init.rc
会定义文件系统的挂载点:
bash
# 挂载 /system 分区
mount ext4 /dev/block/bootdevice/by-name/system /system
1.3. 启动服务
服务通常由 service
指令启动。每个服务由一个名称、一个可执行文件路径和启动参数组成:
bash
# 启动名为 'logcat' 的服务
service logcat /system/bin/logcat
1.4. 定义事件和动作
可以设置不同的事件和这些事件触发时要执行的动作:
bash
# 当系统启动时
on boot {
# 执行某些操作
start logcat
}
2.init启动过程概述
Android 系统的启动过程分为几个主要阶段,每个阶段负责不同的初始化任务。在 Android 启动时,init
程序是第一个运行的用户空间进程。init
负责启动系统服务、挂载文件系统、设置权限等任务。init.rc
是 init
程序的配置文件,定义了这些启动任务和服务的详细信息,文件中的指令会按照特定的顺序执行来完成这些任务。
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
大致的启动顺序:
-
加载
init.rc
配置文件 -
解析文件 :
init
程序读取并解析init.rc
文件。 -
挂载文件系统:执行文件系统挂载等操作。
-
设置系统属性: 根据
export
指令设置系统属性。 -
启动基本服务: 根据
service
指令启动系统服务。 -
处理事件 :根据
on
事件指令执行特定动作。-
执行系统初始化任务
-
启动应用框架服务
-
启动用户空间应用程序
-
3.init.rc详细启动流程和指令
3.1. 加载和解析 init.rc
文件
init
程序在启动时首先会读取 init.rc
文件,解析文件中的指令。
bash
import /init.rc
-
init.rc
文件会被init
程序逐行读取。 -
文件中的指令会被解析并按照它们在文件中的顺序执行。
3.2. 挂载文件系统
文件系统的挂载通常是第一个被执行的任务。通过 mount
指令挂载必要的分区:
bash
mount ext4 /dev/block/bootdevice/by-name/system /system
-
mount
: 挂载不同的分区和文件系统。 -
on post-fs-data
: 指定在文件系统挂载完成后执行的任务。
bash
on post-fs-data
mount ext4 /dev/block/bootdevice/by-name/system /system
3.3. 设置系统属性
系统属性通常在挂载文件系统之后设置:
bash
export ro.build.id=PQ1A.190406.012
-
export
: 设置系统属性的指令。 -
on property:
: 指定在属性变更时执行的操作。
bash
on property:ro.build.type=eng
start debugging
3.4. 启动基本服务
在文件系统挂载和属性设置后,init
开始启动基本的系统服务:
bash
service zygote /system/bin/app_process /system/bin --zygote
socket zygote stream 660 system system
onrestart restart media
-
service
: 启动服务的指令。 -
on
: 触发条件,如on boot
。
bash
on boot {
start zygote
}
3.5. 执行系统初始化任务
系统初始化任务会在基本服务启动后执行,任务可以包括设置权限、启动其他服务等:
bash
on boot {
start zygote
start surfaceflinger
}
on
:on boot
触发条件,系统启动时执行。
3.6. 启动应用框架服务
应用框架服务包括 Activity Manager、Package Manager 等:
bash
service activity /system/bin/activity
service
: 定义应用框架服务。
3.7. 启动用户空间应用程序
系统服务启动后,用户空间的应用程序也会被启动:
bash
service myapp /system/bin/myapp
4.各阶段的示例
以下是不同阶段的 init.rc
文件内容示例,展示了启动顺序中的不同任务和指令:
示例 1: 基本配置
bash
# Import additional config files
import /vendor/etc/init/hw/init.rc
# Mount filesystems
on post-fs-data
mount ext4 /dev/block/bootdevice/by-name/system /system
示例 2: 启动服务
bash
# Start the zygote process
on boot {
start zygote
}
# Define the zygote service
service zygote /system/bin/app_process /system/bin --zygote
socket zygote stream 660 system system
onrestart restart media
示例 3: 启动应用框架
bash
shell
复制代码
# Start the Activity Manager and other services
on boot {
start activity
start package
}
5.启动顺序的详细控制
在 init.rc
中,启动顺序不仅依赖于文件中的指令顺序,还可以通过服务的依赖关系进行控制:
onrestart
: 定义服务重启时的行为。
bash
service foo /system/bin/foo
socket foo stream 660 system system
onrestart restart bar
on
事件 : 触发条件,例如on property:
、on boot:
。
bash
on property:sys.boot_completed=1
start myapp
6.服务的启动顺序控制
有些服务的启动顺序可以通过服务之间的依赖关系来控制:
bash
service foo /system/bin/foo
socket foo stream 660 system system
onrestart restart bar
service bar /system/bin/bar
socket bar stream 660 system system
在这个例子中,bar
服务将在 foo
服务重启时被重启。
7. init.rc
文件结构化示例
以下是一个简化的 init.rc
文件示例,展示了启动服务、挂载文件系统和设置属性的基本用法:
bash
# 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 --zygote
socket zygote stream 660 system system
onrestart restart media
service media /system/bin/media
socket media stream 660 system system
# Define actions on system events
on boot {
start zygote
start media
}
以下是一个更复杂的 init.rc
文件示例,展示了如何在不同的启动阶段定义服务和任务:
bash
# Import additional configuration files
import /vendor/etc/init/hw/init.rc
# Mount filesystems
on post-fs-data
mount ext4 /dev/block/bootdevice/by-name/system /system
mount 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 zygote
start surfaceflinger
start media
}
# Define the zygote service
service zygote /system/bin/app_process /system/bin --zygote
socket zygote stream 660 system system
onrestart restart media
# Define the surfaceflinger service
service surfaceflinger /system/bin/surfaceflinger
socket surfaceflinger stream 660 system system
# Define the media service
service media /system/bin/media
socket media stream 660 system system
8.常见问题和调试
常见问题:
-
服务启动顺序错误 :确保
init.rc
中的服务启动顺序符合服务之间的依赖关系。 -
服务无法启动:检查服务的路径和权限,确保所需的资源和依赖项已准备好。
调试工具:
-
adb logcat
:查看init
过程中的日志信息。 -
adb shell
:手动检查服务状态和执行命令。
9. 高级特性和扩展
除了 init.rc
,在 Android 中还有其他 .rc
文件用于更细粒度的配置,比如 vendor.rc
和 device.rc
,这些文件可以通过 import
指令导入到 init.rc
中。
对于高级配置和定制化需求,可以深入学习以下内容:
-
init
的启动机制 :了解init
启动机制的详细实现。 -
init
的 源代码 :可以从 AOSP 获取最新的init
源代码。