Jimmy Chen

A Programmer

(原创)Android SystemServiceManager分析

1. SystemServiceManger启动

分析过SystemServer的朋友应该都有记忆,SystemServiceManager就是在SystemServer中启动的,下面是SystemServiceManager的启动代码:

这里直接通过new一个SystemServiceManager对象,然后将新new的对象保存到mSystemServiceManager中,以备后用。

  SystemServiceManager的代码如下:

这里只要将context保存到mContext中即可,现在SystemServiceManager就初始化完毕了。

2. SystemServiceManager代码分析

2.1 SystemServiceManager中的startService函数

2.2 SystemServiceManager中的startBootPhase函数

  startBootPhase也比较简单,因为有些service的启动需要以来其他的service,所以Systemserver会将设备启动分成几个阶段,每个阶段启动不同的service,而这些就是由startBootPhase这个方法来实现的。如果检测到当前的phase达到service的设定值,service就会完成相应的工作。下面是BatteryService的onBootPhase方法,可以知道当设备启动到PHASE_ACTIVITY_MANAGER_READY,该方法就会调用执行相应的操作。

2.3 SystemServiceManager中剩余关于user的函数

  SystemServiceManager中剩余一下关于特定user的函数,具体的使用场景在SystemService.java中有描述,大家可以看下面代码中的注释,简单明了。

3. 看看SystemService的内容

  系统中存在部分service是systemservice的子类,所以就顺便看看Systemservice的代码都有哪些:

  其中比较感兴趣的是publishBinderService这个方法,在之前看到这个函数还不知道是做什么用的,现在看到这个方法的代码,瞬间清晰了,这个方法最终也还是会调用ServiceManager.addService方法,将service添加到ServiceManager中。

  另一个感兴趣的方法是publishLocalService,这个方法将一些要在system process中用到的service添加到LocalServices static类对象中,这个类内部通过ArrayMap将这些service记录起来,到后面需要使用就可以非常快速方便的取出来了。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注