一、Zygote的作用
- 启动SystemServer
- 孵化应用进程
实际上SystemServer也是从Zygote继承而来,SystemServer实际上需要用到一些Zygote中已经准备好的系统资源,比如,常用类,JNI函数,主题资源,共享库等,从而节约系统的资源,直接复用可以节约系统资源,提升性能。
二、Zygote的启动流程
对于Android中的任何独立进程的启动,可分为下面三段式,进程启动后作一些准备工作,然后进入线程的消息队列Loop中,
因此,Zygote的启动也会经过此过程,Zygote的启动是由Linux开机启动时Init进程通过读取init.rc配置文件读取来fork出zygote,直观效果图表示为
Zygote进程启动后实际上会做主要的两件事情,这两件事情实际上就是为Android系统的启动准备
1、Zygote的Native世界,为进入Java层作准备
- 启动Android的虚拟机(zygote的c++代码main函数中,通过JNI_CreateJavaVM函数)
- 注册Android的JNI函数
- 进入Java世界
2、Zygote的Java世界,启动Framwork中的java服务,以及启动Launcher等。
Zygote启动后会去Preload Resource,然后启动SystemServer, SystemServer与Looper之前通过Socket通信
SystemServer启动后,Loop循环中如何执行socket请求?
Zygote启动后会进入一个Loop循环,在这个循环中它会不断轮询runOnce函数
boolean runOnce() {
//跨进程传输过来的,如AMS,PMS等
String[] args = readArgumentList();
int pid = Zygote.forkAndSpecialize();
if(pid == 0) {
//in child,实际上是执行ActivityThread.main(),应用程序进程启动后,会调用ActivityThread.main()
handleChildProc(args, ...);
return true;
}
}
Zygote的启动要单线程,为什么?
不管父进程里面有多少线程,子进程在创建的时候只有一个单线程,因此父进程中的这些除主线程之外的其它进程挂起,等创建完子进程之后,再重启父进程中的其它线程。
Zygote的跨进程通IPC没有采用binder机制,而是采用本地的Socket通信。
三、谈谈你对 Zygote的理解?
what:Zygote的作用是什么?(两大作用)
How:zygote的启动流程是什么?(Init读取init.rc配置文件,fork出zygote)
why:zygote的工作原理是什么?(进程启动三段式,preloadRes, fork systemServer, loop作socket通信,通过关键函数runOnce)