【Android】【system server】【SystemServer启动流程-主流程】

概述

梳理下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();
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值