之前只知道它跟用户进程启动有关,一起看下它是何方神圣吧,主要围绕作用以及如何启动的。
基于Android 23分析
Zygote作用
它是由init进程fork出来,而我们开发的应用进程以及SystemServer进程都是由Zygote fork出来的。
Zygote启动描述
它的启动主要分两块:Native层和Java层;
Native层:init读取app_main.cpp文件,文件主要描述如何启动Zygote。先是启动虚拟机,接着注册JNI函数(为了Java跟Native间能通讯),JNI函数在androidruntime.cpp文件中描述;
Java层:Native层处理完,会通过反射调用ZygoteInit.main函数,该层主要负责预加载资源、类、启动SystemServer、启动Socket服务(等待启动应用进程的请求)的工作。
Zygote Java层启动流程
- ZygoteInit.main是主要入口
//ZygoteInit类中
public static void main(String argv[]) {
......
registerZygoteSocket(socketName);//1
......
preload();//2
......
startSystemServer(abiList, socketName);//3
......
runSelectLoop(abiList);//4
......
}
- 注释1:注册一个Socket Server接收AMS请求,socketName以ANDROID_SOCKET_开头;
- 注释2:预加载资源,例如常用类、颜色、drawable、JNI函数;以预加载类为例,读取/system/etc/preloaded-classes文件中配置的类名,通过反射加载,常用类Activity、intent、String、Integer、TextView、Button;
- 注释3:内部通过Zygote.forkSystemServer启动SystemServer;
- 注册4:内部while(true)监听请求;
流程图
绿色部分为Native层;蓝色部分为Native层;
总结:
- Zygote是负责fork应用进程以及SystemServer的;
- Zygote是由init进程启动的,启动完以后注册SocketServer、预加载资源、启动SystemServer、等待请求;
以上分析有不对的地方,请指出,互相学习,谢谢哦!