Android init.rc的启动流程

Android开机优化系列文档-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.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 文件,解析文件中的指令。

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.rcdevice.rc,这些文件可以通过 import 指令导入到 init.rc 中。

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

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

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

参考文档

参考链接

相关推荐
帅得不敢出门2 分钟前
Gradle命令编译Android Studio工程项目并签名
android·ide·android studio·gradlew
problc42 分钟前
Flutter中文字体设置指南:打造个性化的应用体验
android·javascript·flutter
前端青山8 小时前
Node.js-增强 API 安全性和性能优化
开发语言·前端·javascript·性能优化·前端框架·node.js
帅得不敢出门11 小时前
安卓设备adb执行AT指令控制电话卡
android·adb·sim卡·at指令·电话卡
我又来搬代码了13 小时前
【Android】使用productFlavors构建多个变体
android
青云交13 小时前
大数据新视界 -- 大数据大厂之 Impala 性能优化:应对海量复杂数据的挑战(上)(7/30)
大数据·性能优化·impala·数据分区·查询优化·海量复杂数据·经典案例
德育处主任14 小时前
Mac和安卓手机互传文件(ADB)
android·macos
芦半山14 小时前
Android“引用们”的底层原理
android·java
迃-幵15 小时前
力扣:225 用队列实现栈
android·javascript·leetcode
大风起兮云飞扬丶15 小时前
Android——从相机/相册获取图片
android