打印
[资料分享]

安卓底层开发学习经验第十六期

[复制链接]
880|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
这一期我们来学习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进程的所有资源,同时也会继承我们这个preloadClasspreloadResources中的资源。因为这两个加载资源的过程是十分消耗时间的,如果我们提前一次把他加载好,剩下的所有进程去继承这些资源,那么我们应用的启动时间会减少很多,这个是我们的应用和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也会重启,也就是我们的zygotesystem_server是紧紧绑定在一起的,,当我们创建完成一个子进程之后,这个子进程就会继承这个父进程所有的代码段,那么如果说我们返回来的是子进程,那么这个子进程就会调用一系列的函数去创建我们的system_server服务,在创建过程的最后我们会在invokeStaticMain()剖出一个异常,这个异常会被我们的zygote代码中的try catch语句所捕获我们剖出的异常,剖出的异常就会调用这个run方法,区启动我们的system_server服务,这就是他的一个启动过程

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

102

主题

315

帖子

16

粉丝