Zygote的启动流程
基于Android U
Zygote是由Init进程通过解析init.zygote.rc文件而创建的,Zygote所对应的可执行程序是app_process,所对应的源文件是app_main.cpp,进程名为zygote。Zygote启动过程的时序图如下:
app_main
1 |
|
- Zygote进程都是通过fork自身来创建子进程的,这样Zygote进程以及它的子进程都可以进入app_main.cpp的main函数,因此main函数中为了区分当前运行在哪个进程,会判断参数arg中是否包含了”–zygote”,如果包含了则说明main函数是运行在Zygote进程中的;如果包含了”–start-system-server”,则说明main函数是运行在SystemServer进程中。
- runtime是AppRuntime对象,AppRuntime中没有对应函数,而AppRuntime继承自AndroidRuntime,所以
runtime.start()
调用的是AndroidRuntime类中的start函数。
AndroidRuntime
1 |
|
主要做了三件事:
- 启动Java虚拟机
- 注册JNI函数
- 通过JNI调用ZygoteInit类的main方法
最后通过JNI调用ZygoteInit的main方法,是因为ZygoteInit的main方法是Java语言编写的,当前的运行逻辑是在Native中,这就需要通过JNI来调用Java,这样Zygote就从Native层进入了Java框架层。此前是没有任何代码进入Java框架层的,是Zygote开创了Java框架层。
ZygoteInit
1 |
|
- 主要做了四件事:
- 预加载资源;
- 创建一个server端的socket:ZygoteServer,接收应用进程fork请求;
- fork出SystemServer进程;
- 进入死循环,poll阻塞接收fork请求。
- 创建了2个socket,一个是systemServer socket,通过Zygote.initNativeState(isPrimaryZygote)来创建;一个是zygote socket,通过new ZygoteServer()来创建。
ZygoteServer
1 |
|
1 |
|
1 |
|
总结
- Zygote运行于单独的进程中,是所有应用程序进程的孵化器。
- Zygote进程启动做了以下几件事:
- 创建AppRuntime并调用其start方法,启动Zygote进程;
- 创建Java虚拟机并为Java虚拟机注册JNI方法;
- 通过JNI调用ZygoteInit的main函数进入Zygote的Java框架层;
- 预加载资源;
- 创建服务端socket,fork出SystemServer进程;
- 进入死循环,poll接收fork请求。
Zygote的启动流程
https://citrus-maxima.github.io/2024/03/10/Zygote启动流程/