Zygote进程解析

简介

Zygote:受精卵
名字很形象,由他可以孵化出别的进程。
那么这个受精卵包括了什么呢?或者说有哪些基因,别的进程可以继承?

在Android系统中,JavaVM、应用程序进程以及运行系统的关键服务的SystemServer进程
都是由Zygote进程来创建的。
它通过fork(复制进程)的形式来创建应用程序进程SystemServer进程
由于Zygote进程在启动时会创建JavaVM,因此通过fock而创建的应用程序进程和SystemServer进程可以在内部获取一个JavaVM的实例拷贝。

启动流程

Zygote进程解析_第1张图片
zygote启动流程
  1. 创建AppRuntime并调用其start方法,启动Zygote进程。
  2. 创建DVM并为DVM注册JNI.
  3. 通过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;
        }
    }

大致如下:


Zygote进程解析_第2张图片
init
  1. registerZygoteSocket
    创建LocalServerSocket,也就是服务端的Socket。
    当Zygote进程将SystemServer进程启动后,就会在这个服务端的Socket上来等待ActivityManagerService请求Zygote进程来创建新的应用程序进程。
  2. 启动SystemServer进程
  3. runSelectLoop
    监听新的socket链接

创建SystemServer

Zygote进程解析_第3张图片

创建App

Zygote进程解析_第4张图片

参考

《深入理解Android内核设计思想》
《Android系统源代码情景分析》
https://blog.csdn.net/itachi85/article/details/55047104

你可能感兴趣的:(Zygote进程解析)