Zygote及System进程启动

1.  init 根据init.rc 运行 app_process, 并携带‘--zygote' 和 ’--startSystemServer' 参数。

2.  AndroidRuntime.cpp::start() 里将启动JavaVM,并且注册所有framework相关的系统JNI接口。

3.  第一次进入Java世界,运行ZygoteInit.java::main() 函数初始化Zygote. Zygote 并创建Socket的server 端。

4.  然后fork一个新的进程并在新进程里初始化SystemServer. Fork之前,Zygote是preload常用的Java类库,以及系统的resources,同时GC()清理内存空间,为子进程省去重复的工作。

5.  SystemServer 里将所有的系统Service初始化,包括ActivityManager 和 WindowManager, 他们是应用程序运行起来的前提。

6.  与此同时,Zygote监听服务端Socket,等待新的应用启动请求。

7.  ActivityManager ready 之后寻找系统的“Startup” Application, 将请求发给Zygote。

8.  Zygote收到请求后,fork出一个新的进程。

9.  Zygote监听并处理SystemServer 的 SIGCHID 信号,一旦System Server崩溃,立即将自己杀死。init会重启Zygote.

以下内容主要针对上面的介绍展开,附上两张图,这两张图片包含了我们今天要讲解的所有内容

zygote启动流程图

 zygote相关的所有类的结构图

这里要讲的是zygote启动流程所以主要针对第一张图来讲

一 概念

  在Android系统中,所有的应用程序和系统服务进程,都是Zygote负责创建的,因此,Zygote也就被成为进程孵化器。Zygote进程是通过复制自身的方式来创建System进程和应用程序进程的。 Zygote会在系统启动时创建一个虚拟机实例,因此,通过复制Zygote进程而得到的System进程和应用程序进程可以快速第在内部获得一个虚拟机实例拷贝。  

  Zygote进程启动完成之后,会将system进程启动起来,以便它可以将系统的关键服务启动起来。例如AMS ContentService 和WMS及PMS等。

二 Zygote启动  

  Zygote进程在init进程启动过程中被以service服务的形式启动,代码如下:./system/core/rootdir/init.zygote32.rc的service_start()

service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-server
    ...
    socket zygote stream 660 root system
    ...

  第一行表示Zygote进程是以服务的形式启动的,并且它所对应的应用程序文件为/system/bin/app_process.接下来的四个选项是Zygote进程启动参数,其中,最后一个参数"--start-system-server"便是Zygote进程在启动完成之后,需要马上将System进程也启动起来。

  第三行表示Zygote进程在启动的过程中,需要在内部创建一个名称为"zygote"的socket。这个Socket是用来执行进程间通信的,他的访问权限是660,及所有用户都可以对他进行读写。前面提到的AMS、WMS、PMS等服务就是通过这个Socket来请求Zygote进程创建新的应用程序进程的。

  

 

猜你喜欢

转载自www.cnblogs.com/qiangge-python/p/10583957.html