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