1.什么是 Zygote 进程?

Zygote 进程是所有的 android 进程的父进程,包括 SystemServer 和各种应用进程都是通过 Zygote 进程 fork 出来的。Zygote(孵化)进程相当于是 android 系统的根进程,后面所有的进程都是通过这个进程 fork 出来的,虽然 Zygote 进程相当于 Android 系统的根进程,但是事实上它也是由 Linux 系统的 init进程启动的。

Android 各个进程的先后启动顺序:

init 进程 --> Zygote 进程 --> SystemServer 进程 -->各种应用进程

进程作用说明:

(1).init进程:linux的根进程,android系统是基于linux系统的,因此可以算作是整个android操作系统的第一个进程;

(2). Zygote 进程:android 系统的根进程,主要作用:可以作用 Zygote 进程 fork 出SystemServer 进程和各种应用进程;

(3).SystemService 进 程 : 主 要 是 在 这 个 进 程 中 启 动 系 统 的 各 项 服 务 , 比 如ActivityManagerService,PackageManagerService,WindowManagerService服务等等;

(4).各种应用进程:启动自己编写的客户端应用时,一般都是重新启动一个应用进程,有自己的虚拟机与运行环境,一般进程名和包名维持一致;

2.Zygote 进程的启动流程

Zygote 进程 main 方法主要执行逻辑:

• 初始化 DDMS;

• 注册 Zygote 进程的 socket 通讯;

• 初始化 Zygote 中的各种类,资源文件,OpenGL,类库,Text 资源等等;

• 初始化完成之后 fork 出 SystemServer 进程;

• fork 出 SystemServer 进程之后,关闭 socket 连接;

ZygoteInit 类的 main 方法

7d466cc84b61

7d466cc84b61

init 进程在启动 Zygote 进程时一般都会调用 ZygoteInit 类的 main 方法,这里看一下该方法的具体实现(基于 androidAPI 30 源码);

• 调用preForkInit()进行初始化,设置DDMS可用,可以发现DDMS启动的时机还是比较早的,在整个 Zygote 进程刚刚开始要启动额时候就设置可用。

• 之后初始化各种参数,

• 然后调用 preload 方法实现预加载各种资源

• 然后通过调用 "start-system-server"库,设置startSystemServer 为true开启 SystemServer 服务,这个是重点(通过Zygote fork出来,参数为socket和socketserver)

启动systemserver后调用closeServerSocket关闭socket。

3.SystemServer 进程启动流程

SystemServer 进程简介

SystemServer 进 程 主 要 的 作 用 是 在 这 个 进 程 中 启 动 各 种 系 统 服 务 , 比 如ActivityManagerService,PackageManagerService,WindowManagerService 服务,以及各种系统性的服务其实都是在 SystemServer 进程中启动的,而当我们的应用需要使用各种系统服务的时候其实也是通过与 SystemServer 进程通讯获取各种服务对象的句柄的。

SystemServer 的 main 方法

/*** The main entry point from zygote.*/

public static void main(String[] args) {

new SystemServer().run();

}

如上所示,main方法只是 new 出一个 SystemServer 对象并执行其 run 方法,查看SystemServer 类的定义我们知道其实 final 类型的,所以我们一般不能重写或者继承。

7d466cc84b61

7d466cc84b61

7d466cc84b61

7d466cc84b61

7d466cc84b61

首先设置系统当前时区,语言环境等默认配置、

• 然后设置虚拟机运行内存,加载运行库,设置 SystemServer 的异步消息,初始化系统参数,调用 createSystemContext()方法,创建 context。

然后是mSystemServiceManager 的创建,看 run 方 法 中 , 通 过 SystemServiceManager 的构造方法创建了一个新的

SystemServiceManager 对象,我们知道 SystemServer 进程主要是用来构建系统各种service 服务的,而 SystemServiceManager 就是这些服务的管理对象。

• 将 SystemServiceManager 对象保存 SystemServer 进程中的一个数据结构中。

后面开始执行:

// Start services.try {

startBootstrapServices();

startCoreServices();

startOtherServices();

} catch (Throwable ex) {

Slog.e("System", "******************************************");

Slog.e("System", "************ Failure starting system services", ex);

throw ex;

} finally {

t.traceEnd(); // StartServices

}

里面主要涉及了是三个方法:

• startBootstrapServices() 主要用于启动系统 Boot 级服务

• startCoreServices() 主要用于启动系统核心的服务

• startOtherServices() 主要用于启动一些非紧要或者是非需要及时启动的服务。

4.启动服务

启动哪些服务呢?在开始执行启动服务之前总是会先尝试通过 socket 方式连接 Zygote 进程,在成功连接

之后才会开始启动其他服务。

通过源码我们可以看出,mSystemServiceManager 是系统服务管理对象,在 main 方法中已经创建完成,这里我

们看一下其 startService 方法的具体实现:

• 可以看到通过反射器构造方法创建出服务类,然后添加到 SystemServiceManager

的 服 务 列 表 数 据 中 , 最 后 调 用 了 service.onStart() 方 法 , 因 为 传 递 的 是Installer.class。

Installer installer = mSystemServiceManager.startService(Installer.class);

看一下 Installer 的 onStart 方法:

• 很简单就是执行了 mInstaller 的 waitForConnection 方法,这里简单介绍一下

Installer 类,该类是系统安装 apk 时的一个服务类,继承 SystemService(系统服

务的一个抽象接口),需要在启动完成 Installer 服务之后才能启动其他的系统服务。

7d466cc84b61

继续看 startBootstrapServices 方法:

这 段 代 码 主 要 是 用 于 启 动 ActivityManagerService 服 务 , 并 为 其 设 置SysServiceManager 和 Installer。ActivityManagerService 是系统中一个非常重要的服务,Activity,service,Broadcast,contentProvider 都需要通过其余系统交互。

首先看一下 Lifecycle 类的定义:

• 可以看到其实 ActivityManagerService 的一个静态内部类,在其构造方法中会创建一个 ActivityManagerService,通过刚刚对 Installer 服务的分析我们知道,SystemServiceManager 的 startService 方法会调用服务的 onStart()方法,而在Lifecycle 类的定义中我们看到其 onStart()方法直接调用了 mService.start()方法,mService 是 Lifecycle 类中对 ActivityManagerService 的引用

7d466cc84b61

启动部分服务:

启动 PowerManagerService 服务:

• 启动方式跟上面的 ActivityManagerService 服务相似都会调用其构造方法和onStart 方法,PowerManagerService 主要用于计算系统中和 Power 相关的计算,然后决策系统应该如何反应。同时协调 Power 如何与系统其它模块的交互,比如没有用户活动时,屏幕变暗等等。

mPowerManagerService =mSystemServiceManager.startService(PowerManagerService.class);

• 然后是启动 LightsService 服务

• 主要是手机中关于闪光灯,LED 等相关的服务;也是会调用 LightsService 的构造方法和 onStart 方法;

mSystemServiceManager.startService(LightsService.class);

• 然后是启动 DisplayManagerService 服务

• 主要是手机显示方面的服务

mDisplayManagerService =mSystemServiceManager.startService(DisplayManagerService.class);

• 然后是启动 PackageManagerService,该服务也是 android 系统中一个比较重要的服务

包括多 apk 文件的安装,解析,删除,卸载等等操作。

• 可以看到 PackageManagerService 服务的启动方式与其他服务的启动方式有一些区别,直接调用了 PackageManagerService 的静态 main 方法

7d466cc84b61

进一步查看PackageManagerService的main方法,可以看到也是直接使用 new 的方式创建了一个 PackageManagerService对象,

并在其构造方法中初始化相关变量,最后调用了 ServiceManager.addService方法,主要是通过 Binder 机制与 JNI 层交互。

然后查看 startCoreServices 方法:

• 可以看到这里启动了 BatteryService(电池相关服务),UsageStatsService,WebViewUpdateService 服务等。

总结:

• SystemServer 进程是 android 中一个很重要的进程由 Zygote 进程启动;

• SystemServer 进程主要用于启动系统中的服务;

• SystemServer 进程启动服务的启动函数为 main 函数;

• SystemServer 在执行过程中首先会初始化一些系统变量,加载类库,创建 Context 对象,创建 SystemServiceManager 对象等之后才开始启动系统服务;

• SystemServer 进程将系统服务分为三类:boot 服务,core 服务和 other 服务,并逐步启动。

• SystemServer 进程在尝试启动服务之前会首先尝试与 Zygote 建立 socket 通讯,只有通讯成功之后才会开始尝试启动服务;

• 创建的系统服务过程中主要通过 SystemServiceManager 对象来管理,通过调用服务对象的构造方法和 onStart 方法初始化服务的相关变量;

• 服务对象都有自己的异步消息对象,并运行在单独的线程中;

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐