Android Zygote 启动流程
Zygote 进程介绍
介绍
- 在 Android 中,DVM、ART、和应用程序进程以及系统关键服务的 SystemServer 进程都是由 Zygote 进程创建,它被称为孵化器
- 通过 fork 方式,创建应用程序进程和 SystemServer 进程,由于 Zygote 进程在启动的时候会创建 DVM 或者 ART,因为通过 fork 而创建的应用程序和 SystemServer 进程可以在内部获取一个 DVM 或者 ART 实例
Zygote 启动
- Zygote 的启动是由 init.rc 脚本文件拉起来的。由 Android Init Language 编写而成的
- 这些 zygote 启动脚本都放在 Android 源码的
system/core/rootdir
目录中
//init.rc
import /init.${ro.zygote}.rc
在 init.rc 中,启动 Zygote 并不是直接将启动的文件写死,而是根据 ro.zygote
的属性值来决定导入哪个版本的文件。
ro.zygote
取值有 4 种,也就意味着 Zygote 支持 4 种版本
init.zygote32.rc
init.zygote32_64.rc
init.zygote64.rc
init.zygote64_32.rc
init.zygote32.rc
只支持 32 bit 应用程序
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
class main
priority -20
user root
group root readproc reserved_disk
socket zygote stream 660 root system
# onrestart write /sys/android_power/request_state wake
# onrestart write /sys/power/state on
# onrestart restart audioserver
# onrestart restart cameraserver
# onrestart restart media
onrestart restart netd
onrestart restart wificond
writepid /dev/cpuset/foreground/tasks
- 根据 Service 类型语句的格式,得知函数名为 zygote,执行程序路径为 /system/bin/app_process/,类名为 main
init.zygote32_64.rc
表示既支持 32 bit,又支持 64 bit 应用程序
service zygote /system/bin/app_process32 -Xzygote /system/bin --zygote --start-system-server --socket-name=zygote
class main
priority -20
user root
group root readproc reserved_disk
socket zygote stream 660 root system
onrestart write /sys/android_power/request_state wake
onrestart write /sys/power/state on
onrestart restart audioserver
onrestart restart cameraserver
onrestart restart media
onrestart restart netd
onrestart restart wificond
writepid /dev/cpuset/foreground/tasks
service zygote_secondary /system/bin/app_process64 -Xzygote /system/bin --zygote --socket-name=zygote_secondary
class main
priority -20
user root
group root readproc reserved_disk
socket zygote_secondary stream 660 root system
onrestart restart zygote
writepid /dev/cpuset/foreground/tasks
- 脚本会启动两个 Service,也就说会启动两个 Zygote 进程,一个名称叫 zygote,执行程序路径为 /system/bin/app_process32,作为主模式,另一个是 zygote_secondary,执行程序路径为 /system/bin/app_process64,作为辅模式
init.zygote64.rc 和 init.zygote64_32.rc
与上两个脚本类似,不在赘述
Zygote 启动过程
main() 函数
脚本启动 Zygote 后首先执行 frameworks/base/cmds/app_process/app_main.cpp/main()
中的代码
- main 会启动 zygote,systemserver 和 application 三种类型的进程。根据传入的参数区别去启动不同类型的进程。
- 启动进程的方法是使用
AppRuntime
类去调用AndroidRuntime
启动 Android 进程。
AndroidRuntime.cpp
- 该文件位于
frameworks/base/core/
文件夹中 - 该文件是用于启动 Android 服务的,包括 Zygote,SystemServer,application 等
ZygoteInit.java
- ZygoteInit.java 文件位于
/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
中 - ZygoteInit的main方法主要做了4件事:
- 创建一个Server端的Socket。
- 预加载类和资源。
- 启动SystemServer进程。
- 等待AMS请求创建新的应用程序进程。
Zygote 进程总结
- 创建一个 AppRuntime 并调用其 start 方法,启动 Zygote 进程
- 创建 Java 虚拟机,并为 Java 虚拟机注册 JNI 方法
- 通过 JNI 调用 ZygoteInit 的 main() 函数进入 Zygote 的 Java 框架层
- 通过 registerZygoteSocket() 创建服务端 Socket,并通过 runSelectLoop() 方法等待 AMS 请求创建新的应用进程
- 启动 SystemServer 进程