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

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐