源码分析->Zygote是什么鬼

2020-07-17  本文已影响0人  杨0612

一道常见面试题:谈谈你对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、等待请求;

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

上一篇 下一篇

猜你喜欢

热点阅读