这一期我们来学习一下Android SystemServer所做的事情以及他的一个启动过程。
首先我们要明白systemService是我们zygote孵化出来的第一个Android服务程序,而这个服务程序会在他的启动过程中,启动我们所有的Android的核心服务,下面我们来介绍几个主要的服务
其中Android systemserver他会派生出下面几个主要服务,首先是我们的电源相关的PowerManagerService以及BatteryService,一个是用来管理我们的电源,第二个是我们电池的一些服务,比如我们要从应用层得到我们电池的电量,我们就需要调用PowerManagerService,在写应用的时候要写上要有访问这个服务的权限。第二个是ActivityManagerService,这个是我们Android的一个核心服务,它主要用于我们Activity的一个管理。第三个是我们的PackageManagerService,他的启动过程需要一点时间,因为他在启动过程中要扫描我们系统中一些原有的jar包,如果我们用升级的方式将系统升级了,那么他会进行一下扫描,如果发现和我们升级前有所区别的话,就会重新生成这些包,第二个是要扫面我们系统中所有的应用程序,所提他的整个启动时间也需要1~2秒的时间。它主要是程序包的一个管理服务。第四个核心服务是WindowManagerService,它主要是用于管理我们窗口的一个服务,我们每一个activity申请的窗口都需要他来进行管理,而他主要是和我们的surfaceflinger这个服务来进行交互,我们没申请一个应用,他都需要拿过来申请一个窗口。第五个是我们打电话的服务。第六个是ContentService,这个主要提供进程数据交换的服务
一些外设的服务包括传感器服务,包括LightsService光感服务,和我们的震动服务VibratorService。当我们打电话时,手机接近我们的耳朵时,屏幕就会变黑,这就是我们光感来管理的。当我们来短信或者铃声时,手机会震动,它是由我们的震动服务来管理的。如果我们想操作手机震动,那么就必须获得这个服务,他才能触发底层的硬件,来完成这个动作。接下来就是我们的网络服务,他是我们Android系统中的一个重要的服务,在软件方面来看,也就是我们的上层来看,他可以分为手机网络管理服务;手机网络状态服务,他就是用来判断我们有没有连上网,联网的状态3g或者4g;还有就是WiFi热点的服务p2p的服务;还有就是WiFi的service,它主要是用于连接外网。最后一个是我们的网络连接状态服务。这些服务,他都是为我们WiFi这块来工作的。下面一个服务就是蓝牙服务,它主要是用来管理蓝牙的一些外设交互。还有就是一些其他的系统服务,比如输入法的服务等等,所以说我们Android的systemservice是我们系统中很重要的一个服务。
下面我们来看一下systemservice的一个启动过程
首先我们zygote启动之后他会启动我们的systemservice,创建一个进程,然后调用我们systemservice这噶函数的main方法去启动systemservice,当他启动之后,首先会对我们的dalvik.set进行一下自己的设置,然后去load我们systemservice所需要的native的库,load进来之后调用native的方法去把我们所需要的资源初始化一下,这个初始化过程主要是初始化sensorservice,比如我们的传感器,他都会在这里初始化完成,最后就会计入到我们的initAndLoop,把我们上边所说的所有服务,一条一条的初始化完成,嫁到我们的servicemanager中,加载完之后就会调用我们loop类中的loop方法,去处理一些消息,这个就是systemservice的一个启动过程
下面我们来看一下代码systemservice是如何启动的,我们打开源代码frameworks/base/service/java/com/android/server/SystemServer.java,然后找到入口函数
在这里首先会进行一个SystemProperties.set的一个设置,设置完成之后,会对dalvik进行一下清理,然后进行一下自己的设置,然后load了我们的android_service的.so,它主要是做一下sensorService的初始化工作,在这里也会调用我们的native方法,去把我们的sensorService初始化完成,我们来看一下这个native services。这个nativeInit是在我们的frameworks/base/services/jni/com_android_server_SystemServer.cpp中
这里边只有一个jni的接口,就是我们的android_server_SystemServer_nativeInit,我们来看一下
他所做的事情就是service的一个初始化,当我们systemserver初始化的时候我们会在这里初始化sensorService,当他初始化完成之后,我们就进入到了initAndLoop,在这里我们会启动系统的所有服务
他在这里有一个setThreePriority的方法,它实际上就是定义一下我们线程的优先级,因为我们Android是一个多进程、多线程的一个操作系统。当我们使用这个方法来设置我们当前线程优先级的时候,我们Linux系统会根据你设置的优先级的策略,来决定他调度的一个频繁度,如果设置的等级比较高,那么他得到的调度时间和机会就比较大,在我们上层也可以设置这个setThreePriority。然后他就做了一些启动的操作,定义了所有相关的service,比如账号管理服务、LightsService等当我们把这些定义完之后,他会在接下来的操作过程中一个一个的进行初始化,就是创建一个对象,然后添加到我们的service的一个过程。其中一些服务是需要在我们systemservice的服务中来进行初始化的,比如我们的powermanagerservice,他在这里需要进行一个init,完成之后systemservice还需要判断一下他是否已经ready,这个就是来看一下我们的powermanagerservice是否完全起来,如果没有正常起来,那么就会剖出一个异常,打印一些消息出来,这时候我们必须保证我们这些关键的服务能正常init的。如果我们没有做这些ready的选项,那么当我们系统做一些其他操作的时候,我们很有可能去查一下他们有没有ready,如过没有ready,那么一些服务是不可用的,这时候就会出一些问题。当我们的systemservice把整个系统的服务全部启动,并且等待他完成之后呢,就会进入到一个Looper.loop(),他在这里要处理消息。我们来看一下
他在这里就是接收消息,处理一下消息,这些就是我们systemservice的一个启动过程