这一期我们来学习
Zygote
的一个启动过程,以及
Zygote
是如何启动
system_server
的
下面我们来看一下
Zygote
服务在启动中做哪些事情
首先我们的Zygote
服务是被我们的
AndroidRuntime
这个类所启动的,启动的时候首先要创建一个虚拟机,然后得到我们
zygote
他的类名和方法,然后去启动我们的
zygote
服务,在启动过程中我们就会产生我们的第一个
java
程序,
zygote
启动之后会首先调用我们的
registerZygoteSocket
(),来创建一个
socket
,这个
socket
用于和后面的
ActivityManagerService
进行通讯,当我们手机启动一个应用时,我们的
ActivityManagerService
会通知我们的
zygote
去创建一个应用,也就是我们每一个应用程序都是通过我们的
zygote
创建出来的,而这个创建过程就需要一个
socket
和我们的
ActivityManagerService
进行通讯
第二个我们需要把我们系统的资源全部
load
进来,也就是执行一下
preload
()函数,这个函数主要有三个步骤,第一个是调用
preloadClasses
的方法,去加载我们的目标类,也就是我们
Android
的一些原生类全部导入进来,还有我们系统的一些资源,也需要使用
preloadResources
加载进来,而
preloadOpenGL
理论上是加载一个硬件的加速,暂时我们先不看他,加载上边那两个的目的是因为,在我们
Android
应用中,他所用到的系统的一些类和资源,会统一的预加载到我们的
zygote
中。当我们创建一个新的应用的时候,这个新应用就会成为我们
zygote
的一个子进程,他就能接受我们
zygote
进程的所有资源,同时也会继承我们这个
preloadClass
和
preloadResources
中的资源。因为这两个加载资源的过程是十分消耗时间的,如果我们提前一次把他加载好,剩下的所有进程去继承这些资源,那么我们应用的启动时间会减少很多,这个是我们的应用和
zygote
进程的一个继承关系。
当我们把资源
load
完成之后,我们就会调用
startSystemServer
()来启动我们
SystemServer
的一个服务,这个服务是我们
Android
服务的另一个核心服务,我们所有的服务全部在这个
server
中创建出来,所以说当这个服务出现问题之后呢,我们的
zygote
也会重新启动。最后我们的
zygote
会执行我们的
runSelectLoop
这个方法,它主要是接收
ActivityManagerService
所发过来的消息,来创建应用。这就是我们
zygote
所做的事情。
下面我们在代码中看一下
zygote
的启动过程,我们打开
frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
,这个就是我们
zygote
服务的一个代码,我们先来看一下
main
入口函数
进来之后我们会首先注册一个
zygote
的一个
socket
,这个
socket
其实调用的也是我们底层的一个套接字,这个套接字就是用来接收
ActivityManagerService
发过来的消息,创建完
socket
之后我们就会调用我们
preload
的方法,去
load
我们系统的资源,
在这个preload
中有三个方法,一个是我们的
preloadClasses
,他就是得到我们系统的所有的
preloadClasses
的类,然后把他们全部加载到我们的内存中,加载完之后,我们就用第二个方法来加载我们系统的资源,他也是将我们系统中全部的资源
load
到我们的内存中,然后供我们应用,使用中的时候可以调用,这样的话就不用每次都去加载,如果我们不做
preload
的操作,那么当我们打开一个应用,去查找相应的类或者我们的资源的时候他每次都要重新自己去
load
,这个过程就会导致我们的应用反应会更加的慢,所以我们会在这里做一个
preload
。当我们
load
完之后,我们就会直接启用
startSystemServer
,在启动完之后我们就会进入
runSelectLoop
()这个函数
下面我们就来看一下我们的
zygote
如何来启动我们的
system_server
我们
systemService
启动时主要涉及到以下几种方法,第一个是调用
startSystemServer()
的方法,然后会调用
Zygote.forkSystemServer
创建一个子进程,在创建子进程的过程中,他会调用底层的一个
native
的方法,去做一些相关的信号的处理,当我们创建完子进程之后呢,我们就会在子进程中调用我们的
handleSystemServerProcess()
,去创建我们的
system_server
,在初始化过程中,我们会调用
zygoteInit
去初始化一些相关的通讯机制,并且调用
applicationInit
,去初始化
system_server
的一些相关参数,当我们把这一系列的操作完成之后,就会生成一个异常类,这个异常类就会通过我们的
invokeStaticMain
,来把它剖出来,剖出来之后,我们的子进程就会根据这个异常去创建我们的
system_server
服务。
下面我们来看一下我们整个
system_server
的创建流程
首先我们父进程zygote
,会调用我们
startSystemServer()
,来创建一个子进程,这个子进程创建函数就是
foekSystemServer()
,在这个过程中会调用一个
native
的方法,也就是在我们的
dalvik_system_Zygote.cpp
中来创建一个子进程,在创建子进程的过程中,我们会设置子进程退出信号的处理函数,如果我们这个信号被捕捉到了,而且我们退出的进程是
system_server
的一个服务,那么我们的
zygote
也会重启,也就是我们的
zygote
和
system_server
是紧紧绑定在一起的,,当我们创建完成一个子进程之后,这个子进程就会继承这个父进程所有的代码段,那么如果说我们返回来的是子进程,那么这个子进程就会调用一系列的函数去创建我们的
system_server
服务,在创建过程的最后我们会在
invokeStaticMain()
剖出一个异常,这个异常会被我们的
zygote
代码中的
try catch
语句所捕获我们剖出的异常,剖出的异常就会调用这个
run
方法,区启动我们的
system_server
服务,这就是他的一个启动过程