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

相关推荐
DS小龙哥几秒前
QT For Android开发-打开PPT文件
android·qt·powerpoint
试行1 小时前
Android实现自定义下拉列表绑定数据
android·java
Dingdangr6 小时前
Android中的Intent的作用
android
技术无疆6 小时前
快速开发与维护:探索 AndroidAnnotations
android·java·android studio·android-studio·androidx·代码注入
GEEKVIP6 小时前
Android 恢复挑战和解决方案:如何从 Android 设备恢复删除的文件
android·笔记·安全·macos·智能手机·电脑·笔记本电脑
Jouzzy13 小时前
【Android安全】Ubuntu 16.04安装GDB和GEF
android·ubuntu·gdb
极客先躯13 小时前
java和kotlin 可以同时运行吗
android·java·开发语言·kotlin·同时运行
Good_tea_h16 小时前
Android中的单例模式
android·单例模式
黑狼传说17 小时前
前端项目优化:极致最优 vs 相对最优 —— 深入探索与实践
前端·性能优化
Lill_bin20 小时前
Lua编程语言简介与应用
开发语言·数据库·缓存·设计模式·性能优化·lua