SystemServer -----Android 的“系统服务”
SystemServer 是Android进入Launcher前的最后的准备。由名称就可以看出来,它提供了众多由java语言编写的“系统服务”。
由上一篇文章可知,一旦我们在init.rc中为Zyogte指定了启动参数--start-system-server,那么ZygoteInit就会调用startSystemServer来进入SystemServer。而且系统服务又分别分为Java层和本地层两类。其中Native层服务的实现体现在android_servers中,需要在run@SystemServer中首先通过System.loadLibrary("android_servers")加载到内存中才能使用。而nativeInit则负责为启动本地层服务而努力。这部分实现在Android的历版变迁中改动不小,特别是对两类系统服务的管辖范围有不小的差异。以最新的Android版本而言,它实际上是在本地层只留下Sensor服务了:
/frameworks/base/services/core/jni/com_android_server_SystemServer.cpp
static void android_server_SystemServer_startSensorService(JNIEnv* /* env */, jobject /* clazz */) {
char propBuf[PROPERTY_VALUE_MAX];
property_get("system_init.startsensorservice", propBuf, "1");
if (strcmp(propBuf, "1") == 0) {
SensorService::instantiate();
}
}
上述代码描述SensorService启动及其初始化。Android系统中的Sensor可以理解为比较小的硬件器件,如光线,陀螺仪,重力感应等。它们属于特征上相对一致,而在数据量上则普遍不大。传统的Android模拟器对其中一些Sensor实现了简单的模拟,功能有限。市面上也有一些厂商为了便于开发者调测应用程序,推出了专门的器件模拟功能,而且与IDE进行了“无缝集成”。
回到Java层来看一下这类系统服务是如何管理的。从代码中可以看到,这部分Server又可细分为3类,如下:
Bootstrap Services
Bootstrap 的原意是“引导程序”,用在这里则代表系统服务中最核心的那一部分。另外,这些Services间互相的依赖关系比较强,因而需要在一起统一管理启动,具体对应的是startBootstrapServices这个函数。按照Android的建议,如果你自己添加的系统服务和它们也有较强的依赖,那么可以与这类系统服务统一放置,否者就应该考虑下面所述的另外两类服务。
/frameworks/base/services/java/com/android/server/SystemServer.java
private void startBootstrapServices() {
...
Installer installer = mSystemServiceManager.startService(Installer.class);
mSystemServiceManager.startService(DeviceIdentifiersPolicyService.class);
mActivityManagerService = mSystemServiceManager.startService(
ActivityManagerService.Lifecycle.class).getService();
mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
mActivityManagerService.setInstaller(installer);
traceEnd();
...
// Only run "core" apps if we're encrypting the device.
String cryptState = SystemProperties.get("vold.decrypt");
if (ENCRYPTING_STATE.equals(cryptState)) {
Slog.w(TAG, "Detected encryption in progress - only parsing core apps");
mOnlyCore = true;
} else if (ENCRYPTED_STATE.equals(cryptState)) {
Slog.w(TAG, "Device encrypted - only parsing core apps");
mOnlyCore = true;
}
// Start the package manager.
if (!mRuntimeRestart) {
MetricsLogger.histogram(null, "boot_package_manager_init_start",
(int) SystemClock.elapsedRealtime());
}
mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
mFirstBoot = mPackageManagerService.isFirstBoot();
mPackageManager = mSystemContext.getPackageManager();
traceBeginAndSlog("StartUserManagerService");
mSystemServiceManager.startService(UserManagerService.LifeCycle.class);
traceEnd();
// Initialize attribute cache used to cache resources from packages.
traceBeginAndSlog("InitAttributerCache");
AttributeCache.init(mSystemContext);
traceEnd();
// Set up the Application instance for the system process and get started.
traceBeginAndSlog("SetSystemProcess");
mActivityManagerService.setSystemProcess();
...
}
由上面代码看出被调用最多的语句是mActivityManagerService。目前所有System Service都统一由SystemServiceManager来管理。
System Service Manager首先会启动Installer,这是为了让Installer可以优先完成初始化,并完成关键目录(如/data/user)的创建。这些都是其他服务可以顺利启动的先决条件。接下来启动的系统服务是ActivityManagerService,在后续会描述这个服务。
在AMS之后相继启动的服务包括电源管理Power Manager ,Display Manager,PackageManager等,最后调用setSystemProcess来添加进程相关的服务,如meminfo,gfxinfo,dbinfo,cpuinfo等,从而完成最核心部分系统服务的启动。
Core Service
Core Service相对于Bootstrap 的优先级略低,主要包括LED和背光管理器,电池电量管理器,应用程序使用情况(Usage Status)管理器等。
Other Services
这部分服务在3类Service中优先级最低,但数量却最多。比如AccountManagerService,VibratorService,MountService,NetworkManagementService,NetworkStatsService,ConnectivityService,WindowManagerService,UsbService,SerialService,AudioService等。这些服务全面构筑起Android系统这座“参天大厦”,为其他进程,应用程序的正常运行奠定了基础。
最后,SystemServer通过Looper.loop()进入长循环中,并依托onZygoteInit中启动的Binder服务接受和处理外界的请求--Android系统的“万里长征”终于开始了。