android 孵化进程,Android Zygote(孵化) 进程总结
1.什么是 Zygote 进程?Zygote 进程是所有的 android 进程的父进程,包括 SystemServer 和各种应用进程都是通过 Zygote 进程 fork 出来的。Zygote(孵化)进程相当于是 android 系统的根进程,后面所有的进程都是通过这个进程 fork 出来的,虽然 Zygote 进程相当于 Android 系统的根进程,但是事实上它也是由 Linux 系统的
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 方法
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 方法初始化服务的相关变量;
• 服务对象都有自己的异步消息对象,并运行在单独的线程中;
更多推荐
所有评论(0)