详细分析Android-Zygote的启动过程

 更新时间:2021年06月21日 08:48:39   作者:Jevely5400  
在Android系统中,所有的应用程序进程以及系统服务进程SystemServer都是由Zygote进程孕育(fork)出来的,这也许就是为什么要把它称为Zygote(受精卵)的原因吧。由于Zygote进程在Android系统中有着如此重要的地位,本文将详细分析它的启动过程

Android系统中,DVM,ART,应用程序进程和运行系统的关键服务的SystemServer进程都是Zygote创建的。他通过fork的形式来创建。由于Zygote在启动时会创建DVM或者ART,因此通过fork而创建的应用程序进程和SystemServer进程可以在内部获取一个DVM或者ART的实例副本。

在启动Zygote的时候,会根据ro.zygote属性来控制使用不同的Zygote启动脚本。启动脚本放在System/core/rootdir目录中。

Zygote在启动的时候会走到ZygoteInit的main方法,在这个方法中主要做了以下这些事:

  • 创建一个Server端的Socket
  • 预加载类和资源
  • 启动SystemServer进程
  • 等待AMS请求创建新的应用程序进程

通过JNI调用ZygoteInit的main方法后,Zygote便进入了java层,此前的所有代码都没有java层,Zygote开创了java框架层。

Zygote创建的Socket的name为zygote,用于等待ActivityManagerService请求Zygote创建新应用程序进程。

在启动了SystemServer进程后,系统的服务也会由SystemServer进程启动起来。

最后就会调用方法,等待AMS请求创建新的应用程序进程。

创建Socket

在创建Socket的时候,会创建一个名字,名字为【ANDROID_SOCKET_zygote】,通过这个名字获取环境变量的值,文件描符参数,最后创建一个文件描述符,在生成LocalServerSocket的时候传入。这个也就是服务端的Socket。Zygote将SystemServer进程启动后,就会在这个服务端的Socket上等待AMS的信号。

启动SystemServer

需要先创建一个args数组,用来保存启动SystemServer的启动参数。SystemServer进程的用户id和用户组id设置为1000,进程名字为system_server,启动的类名为:com.android.server.SystemServer。接着会调用Zygote的forkSystemServer方法,其内部会调用nativeForkSystemServer这个Native方法,最终通过fork函数在当前进程创建一个子进程,就是SystemServer进程。如果forkSystemServer方法返回的pid为0,表示当前代码运行在新创建的子进程中,则会执行handleSystemServerProcess来处理SystemServer进程。

等待AMS

获取到前面创建的Socket的fd字段的值,添加到一个fds列表中。接下来就无限循环等待AMS的请求。会有一个无限循环,在这个循环中会将fds的数据转移到pollFds数组上,然后对pollFds进行遍历,遍历的同时会判断当前Zygote进程是否与AMS建立了连接。如果建立了连接,调用acceptCommamdPeer方法得到ZygoteConnection类并添加到Socket连接列表peers中。然后将ZygoteConnection的fd添加到fds列表中,以便可以接收AMS发送过来的请求。如果在遍历pollFds的时候不是与AMS建立连接,那么就是创建应用的请求,回调用ZygoteConnection的runOnce方法创建一个新的应用程序进程,创建成功后会将这个Socket从peers和fds中清除。

Zygote进程启动总结:

  • 启动Zygote进程
  • 创建虚拟机,为Java虚拟机注册JNI方法
  • 通过JNI调用ZygoteInit的main函数,进入Java框架层
  • 通过registerZygoteSocket方法创建服务端Socket,通过funSelectLoop方法等待AMS请求。
  • 启动SystemServer进程

以上就是Android-Zygote启动过程详解的详细内容,更多关于Android-Zygote启动的资料请关注脚本之家其它相关文章!

相关文章

最新评论