Framework开发之Zygote进程2(基于开源的AOSP15)--init.rc在start zygote之后的事情(详细完整版逐行代码走读)

service zygote的完整执行过程解读

PS:上篇文章中讲到init.rc导入了配置文件

复制代码
import /system/etc/init/hw/init.${ro.zygote}.rc

在start zygote后就会去找该配置文件里面的service zygote,这里以64位操作系统的zygote为例,init.zygote64.rc

复制代码
1 service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server --socket-name=zygote
2     class main
3     priority -20
4     user root
5     group root readproc reserved_disk
6     socket zygote stream 660 root system
7     socket usap_pool_primary stream 660 root system
8     onrestart exec_background - system system -- /system/bin/vdc volume abort_fuse
9     onrestart write /sys/power/state on
10     # NOTE: If the wakelock name here is changed, then also
11     # update it in SystemSuspend.cpp
12     onrestart write /sys/power/wake_lock zygote_kwl
13     onrestart restart audioserver
14     onrestart restart cameraserver
15     onrestart restart media
16     onrestart restart --only-if-running media.tuner
17     onrestart restart netd
18     onrestart restart wificond
19     task_profiles ProcessCapacityHigh MaxPerformance
20     critical window=${zygote.critical_window.minute:-off} target=zygote-fatal

service zygote - 定义名为"zygote"的服务,fork出zygote进程

PS:这里会走到system/core/init/service.cpp里,调用fork()接口创建zygote进程,大概流程如下

复制代码
init进程执行service.cpp中的Start()
    ↓
调用fork()创建子进程
    ↓
子进程执行execv()替换为app_process64
    ↓
app_process64开始执行自己的main函数
    ↓
zygote进程独立运行,不再执行service.cpp代码

看了上篇文章的应该知道,这里大概是四部曲,trigger ->on ->start ->service ,真正的可执行文件app_process64是在service里面寻找的

复制代码
1 service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server --socket-name=zygote

/system/bin/app_process64 - 执行的可执行文件路径

-Xzygote - JVM参数,指定使用zygote模式

/system/bin - 应用程序根目录

--zygote - 启动参数,标识为zygote进程

--start-system-server - 启动system_server

--socket-name=zygote - 指定socket名称

复制代码
2     class main

class main -将zygote归类为"main"类服务,通常在系统启动时优先启动main类服务

主要 service class 的类型

Class 名称 说明 特点
main 主要系统服务 系统启动时优先启动,最重要的服务
core 核心系统服务 系统基本功能所需的服务
hal 硬件抽象层服务 硬件驱动相关服务
late_start 延迟启动服务 在main服务启动后启动
boot 启动服务 系统启动早期阶段的服务
default 默认服务 无特定分类的服务

**启动顺序(按优先级递减)

  1. boot 2. core 3. main 4. late_start 5. default**

    3 priority -20

priority -20 -设置进程优先级为-20(最高优先级),保证zygote作为核心系统进程获得高优先级

|-------------------|-------|------------------------------|
| -20 到 -10 | 极高优先级 | 系统关键进程,如zygote、system_server |
| -10 到 -1 | 高优先级 | 系统服务、关键应用 |
| 0 到 9 | 中等优先级 | 普通应用、服务 |
| 10 到 19 | 低优先级 | 后台应用、非关键服务 |

复制代码
4     user root

user root 以root用户身份运行,获得最高系统权限

复制代码
5     group root readproc reserved_disk

group root readproc reserved_disk

root - 主要组为root

readproc - 允许读取其他进程信息

reserved_disk - 允许访问保留磁盘空间

复制代码
6     socket zygote stream 660 root system
7     socket usap_pool_primary stream 660 root system

创建两个socket用于进程间通信:

socket zygote stream 660 root system

stream 660:流式socket,权限660(所有者可读写,组可读写)

socket usap_pool_primary stream 660 root system,usap_pool_primary socket:用于其他用途

root system:socket所有者和组

复制代码
8     onrestart exec_background - system system -- /system/bin/vdc volume abort_fuse
9     onrestart write /sys/power/state on
10     # NOTE: If the wakelock name here is changed, then also
11     # update it in SystemSuspend.cpp
12     onrestart write /sys/power/wake_lock zygote_kwl
13     onrestart restart audioserver
14     onrestart restart cameraserver
15     onrestart restart media
16     onrestart restart --only-if-running media.tuner
17     onrestart restart netd
18     onrestart restart wificond

onrestart指令是当zygote重启时执行的操作:

exec_background:后台执行vdc命令

write /sys/power/state on:唤醒系统

write /sys/power/wake_lock zygote_kwl:保持唤醒锁

onrestart restart audioserver

onrestart restart cameraserver

onrestart restart media

onrestart restart --only-if-running media.tuner

onrestart restart netd

onrestart restart wificond

重启zygote时,同时重启相关的重要系统服务

包括音频、相机、媒体、网络等服务

复制代码
19     task_profiles ProcessCapacityHigh MaxPerformance

task_profiles:设置任务性能配置

ProcessCapacityHigh MaxPerformance:高性能处理能力

复制代码
20     critical window=${zygote.critical_window.minute:-off} target=zygote-fatal

critical:设置关键窗口和目标,确保zygote的稳定

PS:为了学习完整流程,后续不会这么详细解读代码,涉及的类以及方法太多,后续大概流程如下,会慢慢补充。