Android启动过程(二)SystemServer

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 ManagerDisplay 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系统的“万里长征”终于开始了。

 

 

 

 

 

 

 

 

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

万子开发

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值