Android随笔-启动Zygote的rc文件是什么?
Zygote 启动使用rc 文件(init 配置文件),是因为 Android 的启动流程基于 init 进程 的启动机制设计。
一、rc 文件是什么
| 属性 | 说明 |
|---|---|
| 全称 | init runtime configuration(init 运行时配置) |
| 格式 | Android init 语言,类似脚本 |
| 位置 | /system/etc/init/、/vendor/etc/init/等 |
| 作用 | 定义系统服务如何启动、何时启动、以什么权限启动 |
二、Zygote 的 rc 文件示例
Android 系统中有两个 Zygote 相关的 rc 文件:
1. init.zygote64.rc(64位系统)
# 服务定义 service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server class main # 属于 main 类别,系统启动时一起启动 priority -20 # 高优先级 user root # 以 root 用户运行 group root readproc reserved_disk socket zygote stream 660 root system # 创建 Socket,用于 AMS 连接 socket usap_pool_primary stream 660 root system # USAP 池 Socket onrestart write /sys/android_power/request_state wake # 重启时唤醒设备 onrestart restart audioserver onrestart restart cameraserver onrestart restart media onrestart restart media.tuner onrestart restart netd onrestart restart wificond writepid /dev/cpuset/foreground/tasks # 写入 cgroup2. init.zygote32.rc(32位系统)
service zygote /system/bin/app_process32 -Xzygote /system/bin --zygote --start-system-server class main ...三、为什么要用 rc 文件启动 Zygote
原因 1:统一的服务管理机制
Android 的init 进程(PID=1)是 Linux 内核启动后的第一个用户态进程,负责:
- 挂载文件系统
- 解析所有 rc 文件
- 按规则启动系统服务
rc 文件是 init 进程管理服务的标准方式,Zygote 作为系统核心服务,自然遵循这个机制。
原因 2:定义启动参数和命令行
rc 文件中的 service 行定义了:
- 可执行文件路径:/system/bin/app_process64
- 启动参数:-Xzygote /system/bin --zygote --start-system-server
- 这些参数决定了 Zygote 的启动模式
service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server # ↑ 可执行文件 ↑ 参数传递给 app_processapp_process 是入口程序,它内部会:
- 启动 ART 虚拟机
- 加载 ZygoteInit 类
- 调用 ZygoteInit.main()
原因 3:创建通信 Socket
rc 文件中这一行至关重要:
socket zygote stream660root system| 作用 | 说明 |
|---|---|
| 创建 Socket 文件 | /dev/socket/zygote |
| 权限 | 660(root 读写,system 组读写) |
| 用途 | AMS 通过此 Socket 发送 fork 请求 |
为什么用 Socket 而不是 Binder?
- Zygote 启动时,Binder 驱动还没准备好(或不需要)
- Socket 更简单,fork 后子进程不需要继承复杂的 Binder 状态
- 这是 Linux 原生 IPC,不依赖 Android 特有的 Binder 机制
原因 4:定义重启策略
onrestart write/sys/android_power/request_state wake onrestart restart audioserver onrestart restart cameraserver...Zygote是守护进程(daemon),如果崩溃,init 会自动重启它。onrestart 定义了重启时需要联动的其他服务。
原因 5:资源隔离与权限控制
user root group root readproc reserved_disk writepid/dev/cpuset/foreground/tasks- Zygote 以root运行(因为 fork 后需要降权到应用 UID)
- 通过 writepid 将进程加入 cgroup,实现资源调度
四、rc 文件 vs 直接启动的对比
| 方式 | 缺点 | rc 文件的优势 |
|---|---|---|
| 内核直接启动 Zygote | 无法管理服务生命周期 | init 统一守护,崩溃自动重启 |
| 硬编码在 init 代码中 | 修改需重新编译内核 | 修改 rc 文件即可,无需编译 |
| 用脚本启动 | 没有标准化机制 | Android init 语言标准化、可解析 |
| 手动创建 Socket | 容易出错 | rc 文件声明式定义,init 自动创建 |
五、完整启动链路
六、总结
rc 文件是 Android init 进程管理服务的标准配置方式。Zygote 通过 rc 文件启动,是为了:
- 统一由 init 管理(启动、重启、监控)
- 声明式配置(参数、权限、Socket、重启策略)
- 解耦(修改启动方式无需重新编译系统)