Android init.rc各阶段的定义和功能

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

Android init.rc各阶段的定义和功能

在 Android 的 init.rc 文件中,early-initinitlate-initearly-sffspost-fs-dataearly-bootbootservice 等不同阶段(phases)用于定义系统初始化的不同任务和服务的启动顺序。

这些阶段也基本上init.rc启动的流程,我们再按init.rc中定义的这些阶段来梳理下init.rc的启动流程,以和之前分析逻辑流程相互对应。启动流程如下:

bash 复制代码
1) early-init 
    a) wait_for_coldboot_done 
    b) property_init 
    c) keychord_int 
    d) console_init 
    e) set_init_properties
 
2) init
3) late-init
4) early-fs
 
5) fs
 
6) post-fs 
    f) property_service_init 
    g) signal_init 
    h) check_startup
 
7) early-boot
 
8) boot
 
9) service

init.rc中的程序大致会按照这个顺序执行,靠前的(early-init init)是在init.cpp中触发启动的,后面的是在这些命令靠trigger来触发的。

service有class core、main、hal 、default 、late_start等这些service也是通过on boot 中class_start来统一启动的。 还有一种就是on property: 例如on property:sys.boot_completed=1,是通过设置系统属性来触发启动的。

下面是这些阶段的详细定义、功能和在 init.rc 文件中的配置方法。

1.各阶段的定义和功能

1.1 early-init 阶段

定义early-init 是系统启动的最初阶段,用于完成最基本的系统初始化任务。

功能

  • 挂载关键分区 :如 /system/data/vendor

  • 设置基本系统属性

  • 进行一些基础的初始化操作

配置示例

bash 复制代码
# early-init 阶段的任务
on early-init {
    # 挂载系统分区
    mount ext4 /dev/block/bootdevice/by-name/system /system

    # 设置基本系统属性
    export ro.build.id=PQ1A.190406.012
}

触发时机 : 在 init 进程开始运行后立即执行,通常在内核完成启动后最初的阶段。

功能总结

  • 挂载分区。

  • 设置系统属性。

  • 基础初始化任务。

1.2 init 阶段

定义init 阶段是 init 进程的主要执行阶段,负责启动核心系统服务和进行系统初始化任务。

功能

  • 启动关键服务 :如 zygote(应用进程的启动器)、surfaceflinger(图形显示管理器)。

  • 执行系统配置脚本

配置示例

bash 复制代码
# init 阶段的任务
on init {
    # 启动 Zygote 进程
    start zygote

    # 启动 SurfaceFlinger 服务
    start surfaceflinger
}

触发时机 : 在 early-init 完成后进行。

功能总结

  • 启动系统服务。

  • 执行系统配置任务。

1.3 late-init 阶段

定义late-init 阶段是 init 阶段完成之后进行的,通常用于应用层服务的启动。

功能

  • 启动应用框架服务 :如 ActivityManagerPackageManager

  • 执行系统初始化后的配置任务

配置示例

bash 复制代码
# late-init 阶段的任务
on late-init {
    # 启动 Activity Manager 服务
    start activity

    # 启动 Package Manager 服务
    start package
}

触发时机 : 在 init 阶段完成后进行。

功能总结

  • 启动应用框架服务。

  • 执行系统初始化后的任务。

1.4 early-sf 阶段

定义early-sfinit 进程中的一个特殊阶段,专注于启动 SurfaceFlinger 服务。

功能

  • 启动 SurfaceFlinger:图形层管理器,用于处理图形显示和合成。

配置示例

bash 复制代码
# early-sf 阶段的任务
on early-sf {
    # 启动 SurfaceFlinger 服务
    start surfaceflinger
}

触发时机 : 在 init 阶段中,SurfaceFlinger 配置完成后执行。

功能总结

  • 启动 SurfaceFlinger,管理图形显示层。

1.5 fs 阶段

定义fs 阶段用于挂载文件系统和执行文件系统相关的操作。

功能

  • 挂载额外的文件系统

  • 设置文件系统的相关操作

配置示例

bash 复制代码
# fs 阶段的任务
on fs {
    # 挂载文件系统
    mount ext4 /dev/block/bootdevice/by-name/data /data
}

触发时机 : 在 early-init 之后、post-fs-data 之前进行。

功能总结

  • 挂载额外的文件系统。

  • 文件系统操作。

1.6 post-fs-data 阶段

定义post-fs-data 阶段是在文件系统挂载后执行的阶段。

功能

  • 执行数据相关的任务:如设置文件权限、初始化文件内容等。

配置示例

bash 复制代码
# post-fs-data 阶段的任务
on post-fs-data {
    # 初始化数据分区
    ensure_path_mounted /data
}

触发时机 : 在 fs 阶段完成后进行。

功能总结

  • 完成文件系统的数据相关任务。

1.7 early-boot 阶段

定义early-boot 阶段是在 init 阶段之后进行的,主要处理系统启动的早期任务。

功能

  • 进行系统启动的早期任务

配置示例

bash 复制代码
# early-boot 阶段的任务
on early-boot {
    # 执行启动前的任务
    # (示例内容可以根据需求进行调整)
}

触发时机 : 在 post-fs-data 阶段之后、boot 阶段之前进行。

功能总结

  • 进行启动时的早期任务。

1.8 boot 阶段

定义boot 阶段是系统启动的主要阶段,用于执行系统启动的最后任务。

功能

  • 启动应用程序和系统服务

  • 进行系统启动的最后配置

配置示例

bash 复制代码
# boot 阶段的任务
on boot {
    # 启动服务和应用程序
    start some_service
}

触发时机 : 在 early-boot 阶段完成后进行。

功能总结

  • 启动服务。

  • 完成系统启动任务。

1.9 service 阶段

定义service 阶段用于定义和管理服务的启动和配置。

功能

  • 启动和管理系统服务

配置示例

bash 复制代码
# service 阶段的任务
service zygote /system/bin/app_process /system/bin --zygote
    socket zygote stream 660 system system
    onrestart restart media

触发时机 : 在 init 阶段中定义服务的具体配置。

功能总结

  • 定义服务的启动、配置和管理任务。

2. 各阶段的执行顺序

以下是 init.rc 文件中各阶段的标准执行顺序:

|--------------|-------------|----------------------|---------------------|
| 阶段 | 定义 | 主要任务 | 触发时机 |
| early-init | 系统启动的最初阶段 | 挂载分区、设置系统属性 | 内核启动后 init 进程开始时 |
| fs | 文件系统挂载阶段 | 挂载文件系统 | early-init 之后 |
| post-fs-data | 文件系统数据处理阶段 | 执行数据相关的任务 | fs 完成后 |
| early-boot | 启动的早期任务阶段 | 进行系统启动的早期任务 | post-fs-data 之后 |
| init | 主要的系统初始化阶段 | 启动核心服务、执行配置脚本 | early-boot 完成后 |
| early-sf | 图形显示管理器启动阶段 | 启动 SurfaceFlinger 服务 | init 阶段中 |
| boot | 系统启动的最后阶段 | 启动应用程序和系统服务 | early-boot 完成后 |
| late-init | 系统初始化完成后的阶段 | 启动应用框架服务、执行最终任务 | init 和 early-sf 完成后 |
| service | 服务定义和管理阶段 | 定义服务的启动和配置任务 | init 阶段中 |

3.各阶段任务的触发条件

以下是各阶段任务的触发条件:

  • early-init :在 init 进程开始运行时执行。

  • fs :在 early-init 完成后、post-fs-data 之前进行。

  • post-fs-data:在文件系统挂载后进行的数据任务阶段。

  • early-boot:在 `post-fs-data

相关推荐
桦说编程8 小时前
CompletableFuture 超时功能有大坑!使用不当直接生产事故!
java·性能优化·函数式编程·并发编程
恋猫de小郭9 小时前
Android Studio 正式版 10 周年回顾,承载 Androider 的峥嵘十年
android·ide·android studio
aaaweiaaaaaa12 小时前
php的使用及 phpstorm环境部署
android·web安全·网络安全·php·storm
工程师老罗14 小时前
Android记事本App设计开发项目实战教程2025最新版Android Studio
android
pengyu17 小时前
系统化掌握 Dart 编程之异常处理(二):从防御到艺术的进阶之路
android·flutter·dart
消失的旧时光-194318 小时前
android Camera 的进化
android
基哥的奋斗历程19 小时前
Openfga 授权模型搭建
android·adb
Pakho love1 天前
Linux:文件与fd(被打开的文件)
android·linux·c语言·c++
.生产的驴1 天前
MYSQL 商城系统设计 商品数据表的设计 商品 商品类别 商品选项卡 多表查询
数据库·mysql·搜索引擎·性能优化·云计算·状态模式·多分类
勿忘初心912 天前
Android车机DIY开发之软件篇(九) NXP AutomotiveOS编译
android·arm开发·经验分享·嵌入式硬件·mcu