Zygote孵化器

作者: 卡路fly | 来源:发表于2017-05-03 23:14 被阅读123次

在Linux系统中,所有的进程都是<code>init</code>进程的子孙进程,即所有进程都是直接或者间接地由<code>init</code>进程<code>fork</code>出来的。<code>Zygote</code>进程也不例外,它是在系统启动的过程,由<code>init</code>进程创建的。


Zygote进程

Zygote进程在系统启动的时候就会产生,它会完成虚拟机的初始化,库的加载,预制类库和初始化的操作。如果系统需要一个新的虚拟机实例,它会迅速复制自身,以最快的数据提供给系统。对于一些只读的系统库,所有虚拟机实例都和 Zygote 共享一块内存区域。

Zygote进程是所有APK应用进程的父进程。可以在<code>init.rc</code>中配置<code>Zygote</code>启动参数(注册服务、指定可执行文件路径、指定虚拟机路径、重启时触发动作等等)。

Zygote进程启动过程

1. 注册zygote用的Socket

<code>Socket</code>端口用于接收启动新进程的命令。
<code>Socket</code>中有两种方式去触发<code>Socket</code>数据读操作:

  • 阻塞式读操作:使用<code>listen()</code>监听某个端口,然后调用<code>read()</code>从这个端口上读取数据。
  • 非阻塞式读操作:(<code>LocalServerSocket</code>)
    • 使用<code>select()</code>函数将需要监测的文件描述符作为<code>select()</code>函数的参数
    • 然后当该文件描述符上出现新的数据后自动触发一个中断,然后在中断处理函数中再去读指定文件描述符上的数据。

2. <code>preloadClass</code>和<code>preloadResources</code>并强制执行一次GC

  • preloadClass(预加载类):预加载的类放在<code>preloaded-classes</code>文件中,该文件保存需要预加载的类的全限定名称列表,<code>preload</code>工具将加载时间超过1250微秒的类加入到这个列表文件中。(这也是导致android开机慢的原因)

  • preloadResources(预加载资源):主要加载<code>framework-res.apk</code>中的资源。我们经常用的<code>com.android.R.xxx</code>资源是系统默认资源,由zygote加载。

3. <code>startSystemServer()</code>,启动<code>system_server</code>进程

创建Java中系统Service所驻留的进程<code>system_server</code>,该进程是framework的核心。(如果它死了,就会导致<code>Zygote</code>自杀。)

SystemServer进程
在Android的运行环境中扮演着“神经中枢”的作用,APK应用中能够直接交互的大部分系统服务都在该经常中运行,如:WmS、AmS、PmS等,这些系统服务都是以一个线程的方式存在于<code>SystemServer</code>进程中。

4. 调用<code>runSelectLoopMode()</code>函数

Zygote从<code>startSystemServer</code>返回后,进入函数<code>runSelectLoopMode</code>。

之前注册Socket的用途有了用处:

  • 处理客户连接和客户请求(其中客户在zygote中使用<code>ZygoteConnection</code>表示)
  • 客户的请求由<code>ZygoteConnection</code>的<code>runOnce</code>来处理。
    <code>runOnce</code>创建新进程,如AmS通过Socket请求创建新进程打开一个App。

--------整理自网络

相关文章

网友评论

    本文标题:Zygote孵化器

    本文链接:https://www.haomeiwen.com/subject/mrpltxtx.html