Zygote

作者: zhi5ai | 来源:发表于2018-11-28 14:36 被阅读0次

    在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的启动过程:

    1. init 根据 init.rc 运行 app_process, 并携带 '--zygote' 和 '--startSystemServer' 参数
    2. AndroidRuntime.cpp::start() 里将启动JavaVM,并且注册所有framework相关的系统JNI接口。
    3. 第一次进入Java世界,运行ZygoteInit.java::main() 函数初始化Zygote。Zygote并创建Socket的server端。
    4. 然后fork一个新的进程并在新进程里初始化SystemServer。Fork之前,Zygote会preload常用的Java类库,以及系统的resources,同时GC()清理内存空间,为子进程省去重复的工作。
    5. SystemServer 里将所有的系统Service初始化,包括ActivityManager 和 WindowManager,他们是应用程序运行起来的前提。
    6. 依次同时,Zygote监听服务端Socket,等待新的应用启动请求。
    7. ActivityManager ready 之后寻找系统的 "Startup" Application,将请求发给Zygote。
    8. Zygote收到请求后,fork出一个新的进程。
    9. Zygote监听并处理SystemServer 的 SIGCHID 信号一旦System Server崩溃,立即将自己杀死。init会重启Zygote。

    图解Android - Zygote, System Server 启动分析
    Android进程系列第二篇---Zygote进程的启动流程
    Android系统启动流程(二)解析Zygote进程
    Zygote
    Android 8.1 源码_启动篇(二) -- 深入研究 zygote

    相关文章

      网友评论

          本文标题:Zygote

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