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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值