美文网首页
Zygote进程解析

Zygote进程解析

作者: linheimx | 来源:发表于2019-02-28 14:16 被阅读0次

    简介

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

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

    启动流程

    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;
            }
        }
    

    大致如下:


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

    创建SystemServer

    创建App

    参考

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

    相关文章

      网友评论

          本文标题:Zygote进程解析

          本文链接:https://www.haomeiwen.com/subject/yrbhuqtx.html