这一期我们来学习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服务,这就是他的一个启动过程
|