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 源代码。

参考文档

参考链接

相关推荐
双鱼大猫16 分钟前
Android Dalvik虚拟机内存参数优化指南
android
双鱼大猫21 分钟前
深入解析adb install安装全流程
android
顾林海39 分钟前
Flutter Dart 运算符全面解析
android·前端
小白马丶41 分钟前
Jetpack源码解读(一)——Lifecycle
android·android jetpack
漫步云端的码农1 小时前
Three.js场景渲染优化
前端·性能优化·three.js
&有梦想的咸鱼&1 小时前
Android Glide 请求构建与管理模块原理深入剖析
android·glide
苏苏码不动了1 小时前
Android MVC、MVP、MVVM三种架构的介绍和使用。
android·架构·mvc
万里鹏程转瞬至1 小时前
开源项目介绍:Native-LLM-for-Android
android·深度学习·开源·大模型
A仔不会笑2 小时前
MySQL面试篇——性能优化
java·数据库·mysql·面试·性能优化
QING6184 小时前
Android_BLE 基于Jetpack Bluetooth实现文件传输指南。
android·kotlin·app