System Server是android 基本服务的提供者,是android系统运行的最基本需求,所有server运行在一个叫system_process的进程中,system_process进程是android java虚拟机跑的第一个进程,从Zygote 创建而来,是andorid系统最重要的java虚拟机。可以说,整个android系统的业务都是围绕system server而展开,所以,当system_process死掉了,手机必须重启。
System server主要包含以下服务:
1、 EntropyService, 熵服务,用于产生随机数;
2、 PowerManagerService, 电源管理服务;
3、 ActivityMangerService Activity,管理服务;
4、 TelephonyRegistry, 电话服务,电话底层通知服务;
5、 PackageManagerService, 程序包管理服务;
6、 AccountManagerService, 联系人账户管理服务;
7、 ContentService, 内容提供器服务,提供跨进程数据交换;
8、 LightService, 光感应传感器服务;
9、 BatteryService,电池服务;
10、 VibrateService,震动器服务;
11、 AlarmManagerService,闹钟服务;
12、 WindowManagerService,窗口管理服务;
13、 BluetoothService,蓝牙服务;
14、 InputMethodManagerService,输入法服务;
15、 AccessibilityManagerService, 辅助器管理程序服务;
16、 DevicePolicyManagerService,提供系统级别的设置及属性;
17、 StatusBarManagerService,状态栏管理服务;
18、 ClipboardService,粘贴板服务;
19、 NetworkManagerService,网络管理服务;
20、 TextServicesManagerService,用户管理服务;
21、 NetworkStatsService,手机网络状态服务;
22、 NetworkPolicyManagerService,low-level网络策略服务;
23、 WifiP2pService,Wifi点对点服务;
24、 WifiService,Wifi服务;
25、 ConnectivityService,网络连接状态服务;
26、 MountService,磁盘加载服务;
27、 NotificationManagerService,通知管理服务;
28、 DeviceStorageMonitorService,存储设备容量监听服务;
29、 LocationManagerService,位置管理服务;
30、 CountryDetectorService,检查用户当前所在国家服务;
31、 SearchManagerService,搜索管理服务;
32、 DropBoxManagerService,系统日志文件管理服务;
33、 WallpaperManagerService,壁纸管理服务;
34、 AudioService,AudioFlinger上层封装音频管理服务;
35、 UsbService,USB Host 和 device管理服务;
36、 UiModeManagerService,UI模式管理服务;
37、 BackupManagerService,备份服务;
38、 AppWidgetService,应用桌面部件服务;
39、 RecognitionManagerService,身份识别服务;
40、 DiskStatsService,磁盘统计服务;
41、 SamplingProfilerService,性能统计服务;
42、 NetworkTimeUpdateService,网络时间更新服务;
43、 InputManagerService,输入管理服务;
44、 FingerprintService,指纹服务;
45、 DreamManagerService, dreams服务;
46、 HdmiControlService, HDMI控制服务;
47、 SsvService,SIM卡状态和转换服务;
以上所列系统服务不代表最新Android系统的所有系统服务。
这些服务那么重要,它们什么时候启动?都做了些什么事情?等等这些问题是本文以及大纲下面的文章将会一一道来。
了解这些系统服务之前,先来了解一个重量级的超级类SystemServer.java, 这个类在AOSP中的路径是:frameworks/base/services/java/com/android/server/SystemServer.java,在上文中提到,从Zygote创建system_process进程时,便实例化了该类。熟悉java的开发者都知道,启动某个java程序时,最先调用的就是声明了main()方法的类。所以SystemServer.java被实例化后,便调用了main()方法。首先看看SystemServer.java的构造方法:
构造方法里面只做了从属性系统中读取了工厂测试模式,这个不在本文以及本大纲的文章中赘述的内容,这里就不在叙述了。
下面直接进入main()方法:
直接调用了类内的run()方法,继续跟踪:
上述代码中,首先创建一个system context,这个对象在整个system server中使用非常频繁。接着创建一个SystemServiceManager.java的实例,顾名思义就是SystemService的管理者,管理所有的SystemService。代码中把接着创建一个SystemServiceManager的实例通过LocalServices.addService(SystemServiceManager.class, mSystemServiceManager)语句设置到LocalService中,LocalServices的功能类似SystemServiceManager,不同点在于LocalServices专门用来管理system_process进程中的SystemService,也就没有真正的跨进程通信,也就没有Binder对象。
接着就是启动各种系统服务,在这里分三种类型的SystemService,依次启动,分别对应三个方法:
这三个方法的顺序不能混乱,一定要按照上述顺序依次执行,先看startBootstrapServices()中启动了那些系统服务
上述代码可以看到,这里启动了
启动这些SystemService都是通过SystemServiceManager的startService()的方式启动,启动完成后会回调SystemService的onStart()方法。继续看第二个方法startCoreServices()启动了那些系统服务
startCoreServices()中启动了
上文中提到,startBootstrapServices()必须在startCoreServices()前面执行,这里就能找到一个原因,startCoreServices()中用到mActivityManagerService对象,而该对象在startBootstrapServices()中被实例化,如果先调用startCoreServices(),mActivityManagerService对象便会发生NullPointerException的RuntimeException异常。
接着就是startOtherServices()中启动的service了,先看代码
这个方法中启动的service非常多,代码量非常巨大,所以可见,这个方法对于Android系统而言,不言也可知其重要性。由于代码量巨大,将startOtherServices()分成三部分解说:
1.startOtherServices()中启动了那些服务
Lifecycle
Lifecycle
Lifecycle
所列的这些服务,不一定全部都启动,系统会依照一些配置,选择性启动某些服务。如,因为Android系统会用于众多设备,手机,电视等等,当Android安装到电视设备是,TvInputManagerService、TvRemoteService这些service才会被启动,相反,手机设备时,这两个服务就不会被启动了。
2.不同的启动服务的方式
不知读者是否注意到,在startOtherServices()中存在和startBootstrapServices()、startCoreServices()中不同的启动service的方法,在startBootstrapServices()、startCoreServices()中见到SystemServiceManager.startService()和LocalServices.addService()的方式,而startOtherServices()中又多了ServiceManager.addService(),这三种方式有什么不同呢?
类型不同
所以,其实在startBootstrapServices()中就已经通过ServiceManager.addService()的方式启动了一些特别特别重要的服务,如
3.通过ServiceManager.addService()启动的服务,会调用服务的systemReady()或systemRunning()方法,初始化一些需要在系统服务启动后的其它代码。如启动SystemUI。
全部启动所需要的服务以后,SystemServer便要进入了接受Message的循环中,等待Message的事件