概述
梳理下system server的启动流程,简要记录下system server的启动主流程。
启动主流程
我们知道Zygote经过fork将system server进程fork出来,最后执行到了SystemServer.java的main函数里。
public static void main(String[] args) {
new SystemServer().run();
}
直接调用了run方法:
private void run() {
//创建Looper对象
Looper.prepareMainLooper();
// 加载系统android_servers的库
System.loadLibrary("android_servers");
//创建系统的Context
createSystemContext()
mSystemServiceManager = new SystemServiceManager(mSystemContext);
mSystemServiceManager.setRuntimeRestarted(mRuntimeRestart);
LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
//省略。。
//启动引导服务
startBootstrapServices();
//启动核心服务
startCoreServices();
//启动其他服务
startOtherServices();
//省略。。
Looper.loop();
}
run方法中内容也比较多,这里分析几个重要部分既可以:
1、Looper.prepareMainLooper();主要目的就是创建好Looper对象,因为system server的主线程和普通app主线程一样是一个Loop管理的消息循环。
2、createSystemContext()表示创建一个systemContext,Context不仅仅在普通app中非常重要,在system server中也一样,需要通过Context这个纽带来,获取一些进程的信息环境。
3、mSystemServiceManager = new SystemServiceManager(mSystemContext);这里创建了一个SystemServiceManager的类对象,而且放入了LocalServices中,其实这里的SystemServiceManager和常见binder中的ServiceManager还是不一样的,SystemServiceManager只是System Server中一个普通的类,他负责保存了各个SystemService的全局变量角色,本身不涉及跨进程,而ServiceManager可以与binder跨进除等是强关联。
4、启动服务
//启动引导服务
startBootstrapServices();
//启动核心服务
startCoreServices();
//启动其他服务
startOtherServices();
这里最后一步的startOtherServices不仅仅只启动了一些Service,在启动完了各个Service后,它还会调用各个Service的systemReady方法:
// It is now time to start up the app processes...
vibrator.systemReady();
lockSettings.systemReady();
wm.systemReady();
mPowerManagerService.systemReady(mActivityManagerService.getAppOpsService());
mPackageManagerService.systemReady();
mDisplayManagerService.systemReady(safeMode, mOnlyCore);
mActivityManagerService.systemReady(..)
5、systemserver循环处理消息
Looper.loop();