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位系统)

xml 复制代码
# 服务定义
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   # 写入 cgroup

2. init.zygote32.rc(32位系统)

xml 复制代码
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 的启动模式
xml 复制代码
service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server
#            ↑ 可执行文件              ↑ 参数传递给 app_process

app_process 是入口程序,它内部会:

  • 启动 ART 虚拟机
  • 加载 ZygoteInit 类
  • 调用 ZygoteInit.main()

原因 3:创建通信 Socket

rc 文件中这一行至关重要:

java 复制代码
socket zygote stream 660 root system
作用 说明
创建 Socket 文件 /dev/socket/zygote
权限 660(root 读写,system 组读写)
用途 AMS 通过此 Socket 发送 fork 请求

为什么用 Socket 而不是 Binder?

  • Zygote 启动时,Binder 驱动还没准备好(或不需要)
  • Socket 更简单,fork 后子进程不需要继承复杂的 Binder 状态
  • 这是 Linux 原生 IPC,不依赖 Android 特有的 Binder 机制

原因 4:定义重启策略

java 复制代码
onrestart write /sys/android_power/request_state wake
onrestart restart audioserver
onrestart restart cameraserver
...

Zygote 是守护进程(daemon),如果崩溃,init 会自动重启它。onrestart 定义了重启时需要联动的其他服务。

原因 5:资源隔离与权限控制

java 复制代码
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、重启策略)
  • 解耦(修改启动方式无需重新编译系统)
相关推荐
千里马学框架3 天前
一起学 Android 14:ShellTransition 屏幕旋转过程深度剖析
android·智能手机·性能优化·framework·性能·屏幕旋转·rotation
美狐美颜SDK开放平台3 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
AFinalStone3 天前
Android7 SystemUI源码解析(七)Keyguard锁屏模块深度解析
android·systemui
致远ccc3 天前
Google Play 上架前如何测试 App?多国家 Android 环境测试
android·app测试·googleplay·多国家应用测试
ttyyttemo3 天前
Kotlin 协程中的 Job 结构化并发与取消
android
sun0077003 天前
tbox 4g/5g切换,导致wan ip 改变,导致车机旧网络不可用。需要重启车机才行
android
其实防守也摸鱼3 天前
内网穿透与反向代理:原理、工具与实战指南
android·大数据·运维·安全·网络安全·自动化·渗透
AFinalStone3 天前
Android7 SystemUI 源码解析(四)NavigationBar 导航栏与 SystemBars
android·systemui
JMchen3 天前
属性动画原理与高级动画实现
android·kotlin·canvas
AFinalStone3 天前
Android7 SystemUI 源码解析(二)启动流程深度解析
android·systemui