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 进程的启动流程
以高通SM6115平台Android R 源码代码为例,Zygote进程的源码位置:
LA.UM.9.15/LINUX/android/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
Zygote 进程 main 方法主要执行逻辑:
• 初始化 DDMS;
• 注册 Zygote 进程的 socket 通讯;
• 初始化 Zygote 中的各种类,资源文件,OpenGL,类库,Text 资源等等;
• 初始化完成之后 fork 出 SystemServer 进程;
• fork 出 SystemServer 进程之后,关闭 socket 连接;
ZygoteInit 类的 main 方法
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 类型的,所以我们一般不能重写或者继承。
首先设置系统当前时区,语言环境等默认配置、
• 然后设置虚拟机运行内存,加载运行库,设置 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 服务之后才能启动其他的系统服务。
继续看 startBootstrapServices 方法:
这 段 代 码 主 要 是 用 于 启 动 ActivityManagerService 服 务 , 并 为 其 设 置SysServiceManager 和 Installer。ActivityManagerService 是系统中一个非常重要的服务,Activity,service,Broadcast,contentProvider 都需要通过其余系统交互。
首先看一下 Lifecycle 类的定义:
• 可以看到其实 ActivityManagerService 的一个静态内部类,在其构造方法中会创建一个 ActivityManagerService,通过刚刚对 Installer 服务的分析我们知道,SystemServiceManager 的 startService 方法会调用服务的 onStart()方法,而在Lifecycle 类的定义中我们看到其 onStart()方法直接调用了 mService.start()方法,mService 是 Lifecycle 类中对 ActivityManagerService 的引用
启动部分服务:
启动 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 方法
进一步查看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 方法初始化服务的相关变量;
• 服务对象都有自己的异步消息对象,并运行在单独的线程中;
网友评论