在Android系统中,JavaVM(Java虚拟机)、应用程序进程以及运行系统的关键服务的SystemServer进程都是由Zygote进程来创建的,我们也将它称为孵化器。它通过fock(复制进程)的形式来创建应用程序进程和SystemServer进程,由于Zygote进程在启动时会创建JavaVM,因此通过fock而创建的应用程序进程和SystemServer进程可以在内部获取一个JavaVM的实例拷贝。
Zygote触发
在分析init进程时,可以看出init进程启动后,会解析init.rc文件,然后创建和加载service字段指定的进程。zygote进程就是以这种方式,被init进程加载的。
init.zygote32.rc
Zygote和System Server的启动过程:
- init 根据 init.rc 运行 app_process, 并携带 '--zygote' 和 '--startSystemServer' 参数
- AndroidRuntime.cpp::start() 里将启动JavaVM,并且注册所有framework相关的系统JNI接口。
- 第一次进入Java世界,运行ZygoteInit.java::main() 函数初始化Zygote。Zygote并创建Socket的server端。
- 然后fork一个新的进程并在新进程里初始化SystemServer。Fork之前,Zygote会preload常用的Java类库,以及系统的resources,同时GC()清理内存空间,为子进程省去重复的工作。
- SystemServer 里将所有的系统Service初始化,包括ActivityManager 和 WindowManager,他们是应用程序运行起来的前提。
- 依次同时,Zygote监听服务端Socket,等待新的应用启动请求。
- ActivityManager ready 之后寻找系统的 "Startup" Application,将请求发给Zygote。
- Zygote收到请求后,fork出一个新的进程。
- Zygote监听并处理SystemServer 的 SIGCHID 信号一旦System Server崩溃,立即将自己杀死。init会重启Zygote。
图解Android - Zygote, System Server 启动分析
Android进程系列第二篇---Zygote进程的启动流程
Android系统启动流程(二)解析Zygote进程
Zygote
Android 8.1 源码_启动篇(二) -- 深入研究 zygote
网友评论