前言
在系统启动流程(四)之Zygote如何启动SystemServer进程文章中,我们知道了Zygote进程启动SystemServer,源码最终走到了SystemServer的main函数,接下来我们来简单看看这个main函数里面做了什么:
//代码文件位置:frmework/base/services/java/com/android/server/SystemServer.java
public static void main(String[] args) {
new SystemServer().run();
}
main方法中只调用了SystemServer的run方法:
//代码文件位置:frmework/base/services/java/com/android/server/SystemServer.java
private void run() {
try {
*****省略部分代码*****
//创建消息Looper
Looper.prepareMainLooper();
//加载了动态库libandroid_servers.so
System.loadLibrary("android_servers");
//创建系统的Context
createSystemContext();
//创建SystemServiceManager,它会对系统服务进行创建、启动和生命周期的管理
mSystemServiceManager = new SystemServiceManager(mSystemContext);
*****省略部分代码*****
try {
traceBeginAndSlog("StartServices");
//启动引导服务
startBootstrapServices();
//启动核心服务
startCoreServices();
//启动其他服务
startOtherServices();
*****省略部分代码***
}
}
可以看到,在run方法中:
- 首先加载了动态库
libandroid_server.so; - 接下来创建了
SystemServiceManager,用来对系统服务的创建、启动、以及管理它们的生命周期; - 接着调用
startBootstrapServices()方法,里面主要是使用刚刚创建的SystemServiceManager去启动AMS、PKMS等服务; - 调用
startCoreServices()方法,则是去启动DropBoxManagerService、BatteryService等服务; startOtherServices()方法也是去启动一些系统服务。
到这里可以知道,官方把系统服务分为了是那种类型:分别是引导服务、核心服务、其他服务(指一些非紧要和不需要立即启动的服务):
总结
SystemServer进程被创建后,主要做了以下工作:
- 启动
Binder线程池,这样就可以和其他进程通信了; - 创建
SystemServiceManger,用于对系统服务进行创建、启动和管理它们的生命周期; - 启动各种
系统服务。
系列文章
点击直达→→ 更多系统启动流程文章
有所收获的朋友,请多多关注、点赞,谢谢大家!