一道常见面试题:谈谈你对Zygote的理解。
分三个方面来回答:
1.Zygote是什么东西(what)
2.Zygote是如何被启动的(how)
3.Zygote是如何启动app进程的(why)
基于Android 23分析
1. Zygote是什么东西
Zygote就是由init进程fork出来,而我们都是由Zygote fork出来的。
2. Zygote是如何被启动的
Zygote启动分Native层和Java层,先是Native层,在AndroidRuntime::start方法,启动虚拟机、读取配置信息,最后通过JNI调用Java层的方法。
ZygoteInit.main
主要工作:
(1) ,注册一个Socket Server接收AMS请求,socketName以ANDROID_SOCKET_开头;
(2) ,预加载资源,例如常用类、颜色、drawable、JNI函数;
以预加载类为例,读取/system/etc/preloaded-classes文件中配置的类名,通过Class.forName反射加载,常用类Activity、intent、String、Integer、TextView、Button;
(3) ,内部通过Zygote.forkSystemServer启动SystemServer;
SystemServer是什么,可以参考https://www.jianshu.com/p/4573cf791f56
(4) ,内部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启动流程.png4.总结:
(1)Zygote是fork应用进程以及SystemServer的;
(2)Zygote是由init进程启动的,启动完以后注册SocketServer、预加载资源、启动SystemServer、等待请求;
以上分析有不对的地方,请指出,互相学习,谢谢哦!
网友评论