美文网首页
源码分析->Zygote是什么鬼

源码分析->Zygote是什么鬼

作者: 杨0612 | 来源:发表于2020-07-17 11:28 被阅读0次

    一道常见面试题:谈谈你对Zygote的理解。
    分三个方面来回答:
    1.Zygote是什么东西(what)
    2.Zygote是如何被启动的(how)
    3.Zygote是如何启动app进程的(why)

    基于Android 23分析

    1. Zygote是什么东西

    Zygote就是由init进程fork出来,而我们\color{green}{开发app的进程以及SystemServer进程}都是由Zygote fork出来的。

    2. Zygote是如何被启动的

    Zygote启动分Native层和Java层,先是Native层,在AndroidRuntime::start方法,启动虚拟机、读取配置信息,最后通过JNI调用Java层的\color{green}{ZygoteInit.main}方法。

    ZygoteInit.main

    主要工作:
    (1) \color{green}{registerZygoteSocket(socketName)},注册一个Socket Server接收AMS请求,socketName以ANDROID_SOCKET_开头;
    (2) \color{green}{preload()},预加载资源,例如常用类、颜色、drawable、JNI函数;
    以预加载类为例,读取/system/etc/preloaded-classes文件中配置的类名,通过Class.forName反射加载,常用类Activity、intent、String、Integer、TextView、Button;
    (3) \color{green}{startSystemServer(abiList, socketName)},内部通过Zygote.forkSystemServer启动SystemServer;

    SystemServer是什么,可以参考https://www.jianshu.com/p/4573cf791f56

    (4) \color{green}{runSelectLoop(abiList)},内部while(true)监听请求。

    public static void main(String argv[]) {
                ......
                registerZygoteSocket(socketName);
                ......
                preload();
                ......
               startSystemServer(abiList, socketName);
                ......
                runSelectLoop(abiList);
                 ......
        }
    
    3.Zygote是如何启动app进程的

    可以参考https://www.jianshu.com/p/0b12937581b0

    Zygote启动流程.png
    4.总结:

    (1)Zygote是fork应用进程以及SystemServer的;
    (2)Zygote是由init进程启动的,启动完以后注册SocketServer、预加载资源、启动SystemServer、等待请求;

    以上分析有不对的地方,请指出,互相学习,谢谢哦!

    相关文章

      网友评论

          本文标题:源码分析->Zygote是什么鬼

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