简介
Zygote进程由Kernel层init进程创建,是Android Java层第1个进程。所对应的可执行程序是app_process,所对应的源文件是App_main.cpp。Zygote进程启动后,会启动AndroidRunTime组件、fork出SystemServer进程及各种应用进程。
启动后做了些什么?
- 注册Java虚拟机,并设置虚拟机相关参数;
- 注册一些JNI函数;
- 创建一个服务端Socket,当监听到客户端请求时,fork出新进程;
- 预加载类和资源;
- 启动SystemServer进程;
fork应用进程
第一步,发起进程通过Binder机制向SystemServer进程发起请求。最终调用到Process.start()。
第二步,SystemServer进程向Zygote进程发起请求。
- 一些参数:
- 向Zygote进程发起Socket请求,并把上述参数发送过去;
- Zygote进程收到客户端请求后,把参数解析成Arguments对象,调用Zygote.forkAndSpecialize(),最终调用到Native层com_android_internal_os_Zygote.cpp -> ForkAndSpecializeCommon();
- TODO:Native层创建进程过程……
- 回到Java层新进程,调用handleChildProc()。
应用进程启动后的准备工作
- 关闭从Zygote进程继承下来的Socket;
- 设置进程名(为包名);
- 设置一些通用初始化(默认的未捕捉异常处理方法、时区、log配置等);
- 调用到Native层app_main.cpp -> onZygoteInit(),创建用于Binder通信的线程池;
- 设置虚拟机参数(内存利用率、targetSdkVersion等);
- 调用ActivityThread.main();