简介
Zygote:受精卵
名字很形象,由他可以孵化出别的进程。
那么这个受精卵包括了什么呢?或者说有哪些基因,别的进程可以继承?
在Android系统中,JavaVM、应用程序进程以及运行系统的关键服务的SystemServer进程
都是由Zygote进程来创建的。
它通过fork(复制进程)的形式来创建应用程序进程和SystemServer进程,
由于Zygote进程在启动时会创建JavaVM,因此通过fock而创建的应用程序进程和SystemServer进程可以在内部获取一个JavaVM的实例拷贝。
启动流程
- 创建AppRuntime并调用其start方法,启动Zygote进程。
- 创建DVM并为DVM注册JNI.
- 通过JNI调用ZygoteInit的main函数进入Zygote的Java框架层。
ZygoteInit:main入口
public static void main(String argv[]) {
try {
// 注册Socket,作为服务端,接受ActivityManagerService的请求来创建app的进程
zygoteServer.registerServerSocket(socketName);
// preLoad
preLoad();
// 启动SystemServer进程
if (startSystemServer) {
startSystemServer(abiList, socketName, zygoteServer);
}
// loop
zygoteServer.runSelectLoop(abiList);
zygoteServer.closeServerSocket();
} catch (Zygote.MethodAndArgsCaller caller) {
caller.run();
} catch (Throwable ex) {
Log.e(TAG, "System zygote died with exception", ex);
zygoteServer.closeServerSocket();
throw ex;
}
}
大致如下:
- registerZygoteSocket
创建LocalServerSocket,也就是服务端的Socket。
当Zygote进程将SystemServer进程启动后,就会在这个服务端的Socket上来等待ActivityManagerService请求Zygote进程来创建新的应用程序进程。 - 启动SystemServer进程
- runSelectLoop
监听新的socket链接
创建SystemServer
创建App
参考
《深入理解Android内核设计思想》
《Android系统源代码情景分析》
https://blog.csdn.net/itachi85/article/details/55047104