SystemServer的启动

1,475 阅读6分钟

android源码分析目录

(注:以下代码分析基于android-10.0.0_r30)

一 概述

之前介绍Zygote进程启动的时候说到了Zygote会启动SystemServer,当时因为篇幅有限所以并没有深究,现在就来深入了解一下,Zygote启动SystemServer的细节,以及SystemServer启动之后又做了那些事

源码目录

frameworks/base/core/java/com/android/internal/os/ZygoteInit.java
frameworks/base/services/java/com/android/server/SystemServer.java

二 SystemServer的启动

关于forkSystemServer这个方法,之前Zygote的启动里面已经有说明了,这里我们只关注两个方法

  1. forkSystemServer
  2. handleSystemServerProcess

[ZygoteInit.java]

private static Runnable forkSystemServer(String abiList, String socketName,
        ZygoteServer zygoteServer) {
    ...

    try {
        //方法1
        pid = Zygote.forkSystemServer(
                parsedArgs.mUid, parsedArgs.mGid,
                parsedArgs.mGids,
                parsedArgs.mRuntimeFlags,
                null,
                parsedArgs.mPermittedCapabilities,
                parsedArgs.mEffectiveCapabilities);
    } catch (IllegalArgumentException ex) {
        throw new RuntimeException(ex);
    }

    if (pid == 0) {
        if (hasSecondZygote(abiList)) {
            waitForSecondaryZygote(socketName);
        }

        zygoteServer.closeServerSocket();
        //方法2
        return handleSystemServerProcess(parsedArgs);
    }

    return null;
}

首先是方法1:这个方法是一个native方法,它最终会调用到native层,进行ForkCommon,并且将SystemServer的生死和Zygote进行绑定(见Zygote的启动篇)

然后是方法2:这个方法处理的是SystemServer进程创建之后的一些事情

2.1 handleSystemServerProcess

[ZygoteInit.java]

private static Runnable handleSystemServerProcess(ZygoteArguments parsedArgs) {
    // 设置权限
    Os.umask(S_IRWXG | S_IRWXO);
    ...

    //找到SystemServer的ClassPath
    final String systemServerClasspath = Os.getenv("SYSTEMSERVERCLASSPATH");
    if (systemServerClasspath != null) {
        ...
    }

    if (parsedArgs.mInvokeWith != null) {
        ...
    } else {
        //构建cl
        createSystemServerClassLoader();
        ClassLoader cl = sCachedSystemServerClassLoader;
        if (cl != null) {
            Thread.currentThread().setContextClassLoader(cl);
        }

        //将cl传递进去
        return ZygoteInit.zygoteInit(parsedArgs.mTargetSdkVersion,
                parsedArgs.mRemainingArgs, cl);
    }
}

关于handleSystemServerProcess,主要就是构建SystemServer的参数,并传递到ZygoteInit.zygoteInit中,关于zygoteInit这个方法,主要会做三件事,然后最后调用到参数类的main方法(见Zygote的工作原理),因为这里的参数是SystemServer,所以会调用到SystemServer的main方法

三 SystemServer.java

3.1 main

[SystemServer.java]

public static void main(String[] args) {
    new SystemServer().run();
}

3.2 run

关于SystemServer的run方法,里面做的事情比较多,不过因为都比较重要,所以这里没有省略,尽量每一行代码都添加了作用的注释,对于这个方法所做的事情如下

  1. 做一些信息的保存
  2. 做一些属性的设置
  3. 做一些虚拟机的设置
  4. 做一些binder相关的设置
  5. 加载android_servers的so库
  6. 创建SystemServiceManager并注册binder
  7. 开始分批启动服务
  8. 进入loop循环

[SystemServer.java]

private void run() {
    try {
        traceBeginAndSlog("InitBeforeStartServices");

        // 将启动时的一些信息保存
        SystemProperties.set(SYSPROP_START_COUNT, String.valueOf(mStartCount));
        SystemProperties.set(SYSPROP_START_ELAPSED, String.valueOf(mRuntimeStartElapsedTime));
        SystemProperties.set(SYSPROP_START_UPTIME, String.valueOf(mRuntimeStartUptime));

        EventLog.writeEvent(EventLogTags.SYSTEM_SERVER_START,
                mStartCount, mRuntimeStartUptime, mRuntimeStartElapsedTime);

        //如果系统时钟在1970年之前(时间戳小于0),那么就伪造一个时间
        if (System.currentTimeMillis() < EARLIEST_SUPPORTED_TIME) {
            Slog.w(TAG, "System clock is before 1970; setting to 1970.");
            SystemClock.setCurrentTimeMillis(EARLIEST_SUPPORTED_TIME);
        }

        //如果没有时区,就设置一个默认时区GMT
        String timezoneProperty = SystemProperties.get("persist.sys.timezone");
        if (timezoneProperty == null || timezoneProperty.isEmpty()) {
            Slog.w(TAG, "Timezone not set; setting to GMT.");
            SystemProperties.set("persist.sys.timezone", "GMT");
        }

        //如果系统设置了persist.sys.language,就将其替换为persist.sys.locale
        if (!SystemProperties.get("persist.sys.language").isEmpty()) {
            final String languageTag = Locale.getDefault().toLanguageTag();

            SystemProperties.set("persist.sys.locale", languageTag);
            SystemProperties.set("persist.sys.language", "");
            SystemProperties.set("persist.sys.country", "");
            SystemProperties.set("persist.sys.localevar", "");
        }

        //系统服务器绝不能进行非单向调用
        Binder.setWarnOnBlocking(true);
        //系统服务器应始终加载安全标签
        PackageItemInfo.forceSafeLabels();

        // 设置默认值
        SQLiteGlobal.sDefaultSyncMode = SQLiteGlobal.SYNC_MODE_FULL;

        //停用SQLiteCompatibilityWalFlags等到程序初始化
        SQLiteCompatibilityWalFlags.init(null);

        // 开始android system server,之前都是一些配置,可以不关心
        Slog.i(TAG, "Entered the Android system server!");
        int uptimeMillis = (int) SystemClock.elapsedRealtime();
        EventLog.writeEvent(EventLogTags.BOOT_PROGRESS_SYSTEM_RUN, uptimeMillis);
        if (!mRuntimeRestart) {
            MetricsLogger.histogram(null, "boot_system_server_init", uptimeMillis);
        }

        // 切换虚拟机库
        SystemProperties.set("persist.sys.dalvik.vm.lib.2", VMRuntime.getRuntime().vmLibrary());

        // 启动时为了效率,清除内存上限
        VMRuntime.getRuntime().clearGrowthLimit();

        // 设置内存使用效率
        VMRuntime.getRuntime().setTargetHeapUtilization(0.8f);

        //有些设备依赖运行时指纹生成,所以在进一步启动之前定义它。
        Build.ensureFingerprintProperty();

        //系统服务内,访问环境变量时需要明确指定用户
        Environment.setUserRequired(true);

        //系统服务器内,所有传入的捆绑包都需要被解除,避免BadParcelableException
        BaseBundle.setShouldDefuse(true);

        //系统服务器内,打包异常时需要包含堆栈信息
        Parcel.setStackTraceParceling(true);

        // 确保binder调用时处于前台优先级
        BinderInternal.disableBackgroundScheduling(true);

        // 设置最大的binder线程数,值是31
        BinderInternal.setMaxThreads(sMaxBinderThreads);

        // 准备主线程looper.
        android.os.Process.setThreadPriority(
                android.os.Process.THREAD_PRIORITY_FOREGROUND);
        android.os.Process.setCanSelfBackground(false);
        Looper.prepareMainLooper();
        Looper.getMainLooper().setSlowLogThresholdMs(
                SLOW_DISPATCH_THRESHOLD_MS, SLOW_DELIVERY_THRESHOLD_MS);

        // 加载so库
        System.loadLibrary("android_servers");

        // debug相关
        if (Build.IS_DEBUGGABLE) {
            initZygoteChildHeapProfiling();
        }

        //检查上次关机是否失败
        performPendingShutdown();

        //初始化系统上下文
        createSystemContext();

        // 创建SystemServiceManager
        mSystemServiceManager = new SystemServiceManager(mSystemContext);
        mSystemServiceManager.setStartInfo(mRuntimeRestart,
                mRuntimeStartElapsedTime, mRuntimeStartUptime);
        //注册SystemServiceManager
        LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
        //准备任务的线程池
        SystemServerInitThreadPool.get();
    } finally {
        traceEnd();  // InitBeforeStartServices
    }

    // Start services.
    try {
        //开始分批启动服务
        traceBeginAndSlog("StartServices");
        //boot服务
        startBootstrapServices();
        //核心服务
        startCoreServices();
        //其他服务
        startOtherServices();
        //干掉线程池
        SystemServerInitThreadPool.shutdown();
    } catch (Throwable ex) {
        Slog.e("System", "******************************************");
        Slog.e("System", "************ Failure starting system services", ex);
        throw ex;
    } finally {
        traceEnd();
    }
    //严苛模式(这玩意我们也可以用)
    StrictMode.initVmDefaults(null);

    //如果服务没有启动,打印一些日志
    if (!mRuntimeRestart && !isFirstBootOrUpgrade()) {
        int uptimeMillis = (int) SystemClock.elapsedRealtime();
        MetricsLogger.histogram(null, "boot_system_server_ready", uptimeMillis);
        final int MAX_UPTIME_MILLIS = 60 * 1000;
        if (uptimeMillis > MAX_UPTIME_MILLIS) {
            Slog.wtf(SYSTEM_SERVER_TIMING_TAG,
                    "SystemServer init took too long. uptimeMillis=" + uptimeMillis);
        }
    }

    //保证系统处于正常状态
    if (!VMRuntime.hasBootImageSpaces()) {
        Slog.wtf(TAG, "Runtime is not running with a boot image!");
    }

    // 开始loop循环
    Looper.loop();
    throw new RuntimeException("Main thread loop unexpectedly exited");
}

四 服务的分批启动

4.1 startBootstrapServices

[SystemServer.java]

private void startBootstrapServices() {
    //Watchdog 性能检测
    final Watchdog watchdog = Watchdog.getInstance();
    watchdog.start();
    traceEnd();

    //SystemConfig
    final String TAG_SYSTEM_CONFIG = "ReadingSystemConfig";
    traceBeginAndSlog(TAG_SYSTEM_CONFIG);
    SystemServerInitThreadPool.get().submit(SystemConfig::getInstance, TAG_SYSTEM_CONFIG);
    traceEnd();

    // Installer
    traceBeginAndSlog("StartInstaller");
    Installer installer = mSystemServiceManager.startService(Installer.class);
    traceEnd();

    // DeviceIdentifiersPolicyService
    traceBeginAndSlog("DeviceIdentifiersPolicyService");
    mSystemServiceManager.startService(DeviceIdentifiersPolicyService.class);
    traceEnd();

    // UriGrantsManagerService
    traceBeginAndSlog("UriGrantsManagerService");
    mSystemServiceManager.startService(UriGrantsManagerService.Lifecycle.class);
    traceEnd();

    // ActivityTaskManagerService
    // ActivityManagerService
    traceBeginAndSlog("StartActivityManager");
    // TODO: Might need to move after migration to WM.
    ActivityTaskManagerService atm = mSystemServiceManager.startService(
            ActivityTaskManagerService.Lifecycle.class).getService();
    mActivityManagerService = ActivityManagerService.Lifecycle.startService(
            mSystemServiceManager, atm);
    mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
    mActivityManagerService.setInstaller(installer);
    mWindowManagerGlobalLock = atm.getGlobalLock();
    traceEnd();

    // PowerManagerService
    traceBeginAndSlog("StartPowerManager");
    mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class);
    traceEnd();

    //ThermalManagerService
    traceBeginAndSlog("StartThermalManager");
    mSystemServiceManager.startService(ThermalManagerService.class);
    traceEnd();

    // 初始化 PowerManager
    traceBeginAndSlog("InitPowerManagement");
    mActivityManagerService.initPowerManagement();
    traceEnd();

    // RecoverySystemService
    traceBeginAndSlog("StartRecoverySystemService");
    mSystemServiceManager.startService(RecoverySystemService.class);
    traceEnd();

    // 
    RescueParty.noteBoot(mSystemContext);

    // LightsService
    traceBeginAndSlog("StartLightsService");
    mSystemServiceManager.startService(LightsService.class);
    traceEnd();

    //SidekickService
    traceBeginAndSlog("StartSidekickService");
    // Package manager isn't started yet; need to use SysProp not hardware feature
    if (SystemProperties.getBoolean("config.enable_sidekick_graphics", false)) {
        mSystemServiceManager.startService(WEAR_SIDEKICK_SERVICE_CLASS);
    }
    traceEnd();

    // DisplayManagerService
    traceBeginAndSlog("StartDisplayManager");
    mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class);
    traceEnd();

    //使用默认显示
    traceBeginAndSlog("WaitForDisplay");
    mSystemServiceManager.startBootPhase(SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY);
    traceEnd();

    // 当设备正在加密时,仅运行核心app
    String cryptState = VoldProperties.decrypt().orElse("");
    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;
    }

    // PackageManagerService
    if (!mRuntimeRestart) {
        MetricsLogger.histogram(null, "boot_package_manager_init_start",
                (int) SystemClock.elapsedRealtime());
    }
    traceBeginAndSlog("StartPackageManagerService");
    try {
        Watchdog.getInstance().pauseWatchingCurrentThread("packagemanagermain");
        mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
                mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
    } finally {
        Watchdog.getInstance().resumeWatchingCurrentThread("packagemanagermain");
    }
    mFirstBoot = mPackageManagerService.isFirstBoot();
    mPackageManager = mSystemContext.getPackageManager();
    traceEnd();

    if (!mRuntimeRestart && !isFirstBootOrUpgrade()) {
        MetricsLogger.histogram(null, "boot_package_manager_init_ready",
                (int) SystemClock.elapsedRealtime());
    }
    // Manages A/B OTA dexopting. This is a bootstrap service as we need it to rename
    // A/B artifacts after boot, before anything else might touch/need them.
    // Note: this isn't needed during decryption (we don't have /data anyways).
    if (!mOnlyCore) {
        boolean disableOtaDexopt = SystemProperties.getBoolean("config.disable_otadexopt",
                false);
        if (!disableOtaDexopt) {
            traceBeginAndSlog("StartOtaDexOptService");
            try {
                Watchdog.getInstance().pauseWatchingCurrentThread("moveab");
                OtaDexoptService.main(mSystemContext, mPackageManagerService);
            } catch (Throwable e) {
                reportWtf("starting OtaDexOptService", e);
            } finally {
                Watchdog.getInstance().resumeWatchingCurrentThread("moveab");
                traceEnd();
            }
        }
    }

    // UserManagerService
    traceBeginAndSlog("StartUserManagerService");
    mSystemServiceManager.startService(UserManagerService.LifeCycle.class);
    traceEnd();

    // 初始化 AttributeCache
    traceBeginAndSlog("InitAttributerCache");
    AttributeCache.init(mSystemContext);
    traceEnd();

    // 为系统进程设置Application实例
    traceBeginAndSlog("SetSystemProcess");
    mActivityManagerService.setSystemProcess();
    traceEnd();

    // watchdog 性能监控
    traceBeginAndSlog("InitWatchdog");
    watchdog.init(mSystemContext, mActivityManagerService);
    traceEnd();

    // DisplayManagerService需要设置调度相关政策
    mDisplayManagerService.setupSchedulerPolicies();

    // OverlayManagerService
    traceBeginAndSlog("StartOverlayManagerService");
    mSystemServiceManager.startService(new OverlayManagerService(mSystemContext, installer));
    traceEnd();

    //SensorPrivacyService
    traceBeginAndSlog("StartSensorPrivacyService");
    mSystemServiceManager.startService(new SensorPrivacyService(mSystemContext));
    traceEnd();

    if (SystemProperties.getInt("persist.sys.displayinset.top", 0) > 0) {
        // DisplayManager needs the overlay immediately.
        mActivityManagerService.updateSystemUiContext();
        LocalServices.getService(DisplayManagerInternal.class).onOverlayChanged();
    }

    // 因为传感器服务依赖一些其他的服务,所以之后再启动它
    mSensorServiceStart = SystemServerInitThreadPool.get().submit(() -> {
        TimingsTraceLog traceLog = new TimingsTraceLog(
                SYSTEM_SERVER_TIMING_ASYNC_TAG, Trace.TRACE_TAG_SYSTEM_SERVER);
        traceLog.traceBegin(START_SENSOR_SERVICE);
        //启动传感器服务
        startSensorService();
        traceLog.traceEnd();
    }, START_SENSOR_SERVICE);
}

4.2 startCoreServices

[SystemServer.java]

private void startCoreServices() {
    // BatteryService
    traceBeginAndSlog("StartBatteryService");
    mSystemServiceManager.startService(BatteryService.class);
    traceEnd();

    // UsageStatsService
    traceBeginAndSlog("StartUsageService");
    mSystemServiceManager.startService(UsageStatsService.class);
    mActivityManagerService.setUsageStatsManager(
            LocalServices.getService(UsageStatsManagerInternal.class));
    traceEnd();

    // WebViewUpdateService
    if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_WEBVIEW)) {
        traceBeginAndSlog("StartWebViewUpdateService");
        mWebViewUpdateService = mSystemServiceManager.startService(WebViewUpdateService.class);
        traceEnd();
    }

    // CachedDeviceStateService 磁盘缓存状态
    traceBeginAndSlog("StartCachedDeviceStateService");
    mSystemServiceManager.startService(CachedDeviceStateService.class);
    traceEnd();

    // BinderCallsStatsService
    traceBeginAndSlog("StartBinderCallsStatsService");
    mSystemServiceManager.startService(BinderCallsStatsService.LifeCycle.class);
    traceEnd();

    // LooperStatsService
    traceBeginAndSlog("StartLooperStatsService");
    mSystemServiceManager.startService(LooperStatsService.Lifecycle.class);
    traceEnd();

    // RollbackManagerService
    traceBeginAndSlog("StartRollbackManagerService");
    mSystemServiceManager.startService(RollbackManagerService.class);
    traceEnd();

    // BugreportManagerService 这个是bugreport,一般我们获取日志会用到
    traceBeginAndSlog("StartBugreportManagerService");
    mSystemServiceManager.startService(BugreportManagerService.class);
    traceEnd();

    // GpuService
    traceBeginAndSlog("GpuService");
    mSystemServiceManager.startService(GpuService.class);
    traceEnd();
}

4.3 startOtherServices的第一部分

startOtherServices的总代码比较长,这里就不全部列举了,它主要做了两件事情,第一件事情就是启动各种系统服务

[SystemServer.java]

//启动其他服务,总共代码约1400行,这里就不详细说明了,只简单列举几个
private void startOtherServices() {
    ...

    try {
        ...

        //钥匙串服务
        traceBeginAndSlog("StartKeyChainSystemService");
        mSystemServiceManager.startService(KeyChainSystemService.class);
        traceEnd();
        ...

        // AccountManager 账号管理
        traceBeginAndSlog("StartAccountManagerService");
        mSystemServiceManager.startService(ACCOUNT_SERVICE_CLASS);
        traceEnd();

        // AlarmManagerService 时钟管理
        traceBeginAndSlog("StartAlarmManagerService");
        mSystemServiceManager.startService(new AlarmManagerService(context));
        traceEnd();

        //InputManagerService 输入
        traceBeginAndSlog("StartInputManagerService");
        inputManager = new InputManagerService(context);
        traceEnd();

        // WMS 最重要的服务之一
        traceBeginAndSlog("StartWindowManagerService");
        wm = WindowManagerService.main(context, inputManager, !mFirstBoot, mOnlyCore,
                new PhoneWindowManager(), mActivityManagerService.mActivityTaskManager);
        ServiceManager.addService(Context.WINDOW_SERVICE, wm, /* allowIsolated= */ false,
                DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PROTO);
        ServiceManager.addService(Context.INPUT_SERVICE, inputManager,
                /* allowIsolated= */ false, DUMP_FLAG_PRIORITY_CRITICAL);
        traceEnd();

        ...

        if (mFactoryTestMode == FactoryTest.FACTORY_TEST_LOW_LEVEL) {
            Slog.i(TAG, "No Bluetooth Service (factory test)");
        } else if (!context.getPackageManager().hasSystemFeature
                (PackageManager.FEATURE_BLUETOOTH)) {
            Slog.i(TAG, "No Bluetooth Service (Bluetooth Hardware Not Present)");
        } else {
            //BluetoothService 蓝牙
            traceBeginAndSlog("StartBluetoothService");
            mSystemServiceManager.startService(BluetoothService.class);
            traceEnd();
        }

        ...
}

4.4 startOtherServices

第二部分就是调用AMS的systemReady,关于桌面的启动,也是和这个AMS的systemReady相关的,因为桌面的启动又是一个较长的流程,所以放在之后再进行说明

[SystemServer.java]

//启动其他服务,总共代码约1400行,这里就不详细说明了,只列举一些我们常见的
private void startOtherServices() {
        ...

        // 所有的服务都启动完毕,开始启动桌面
        mActivityManagerService.systemReady(() -> {
            Slog.i(TAG, "Making services ready");
            traceBeginAndSlog("StartActivityManagerReadyPhase");
            mSystemServiceManager.startBootPhase(
                    SystemService.PHASE_ACTIVITY_MANAGER_READY);
            traceEnd();

            //监控native crash
            traceBeginAndSlog("StartObservingNativeCrashes");
            try {
                mActivityManagerService.startObservingNativeCrashes();
            } catch (Throwable e) {
                reportWtf("observing native crashes", e);
            }
            traceEnd();

            // 启动webview
            final String WEBVIEW_PREPARATION = "WebViewFactoryPreparation";
            Future<?> webviewPrep = null;
            if (!mOnlyCore && mWebViewUpdateService != null) {
                webviewPrep = SystemServerInitThreadPool.get().submit(() -> {
                    Slog.i(TAG, WEBVIEW_PREPARATION);
                    TimingsTraceLog traceLog = new TimingsTraceLog(
                            SYSTEM_SERVER_TIMING_ASYNC_TAG, Trace.TRACE_TAG_SYSTEM_SERVER);
                    traceLog.traceBegin(WEBVIEW_PREPARATION);
                    ConcurrentUtils.waitForFutureNoInterrupt(mZygotePreload, "Zygote preload");
                    mZygotePreload = null;
                    mWebViewUpdateService.prepareWebViewInSystemServer();
                    traceLog.traceEnd();
                }, WEBVIEW_PREPARATION);
            }

            if (mPackageManager.hasSystemFeature(PackageManager.FEATURE_AUTOMOTIVE)) {
                traceBeginAndSlog("StartCarServiceHelperService");
                mSystemServiceManager.startService(CAR_SERVICE_HELPER_SERVICE_CLASS);
                traceEnd();
            }

            //启动SystemUI
            traceBeginAndSlog("StartSystemUI");
            try {
                startSystemUi(context, windowManagerF);
            } catch (Throwable e) {
                reportWtf("starting System UI", e);
            }
            traceEnd();

            //执行networkManagementF.systemReady()
            traceBeginAndSlog("MakeNetworkManagementServiceReady");
            try {
                if (networkManagementF != null) {
                    networkManagementF.systemReady();
                }
            } catch (Throwable e) {
                reportWtf("making Network Managment Service ready", e);
            }
            CountDownLatch networkPolicyInitReadySignal = null;
            if (networkPolicyF != null) {
                networkPolicyInitReadySignal = networkPolicyF
                        .networkScoreAndNetworkManagementServiceReady();
            }
            traceEnd();

            //执行ipSecServiceF.systemReady()
            traceBeginAndSlog("MakeIpSecServiceReady");
            try {
                if (ipSecServiceF != null) {
                    ipSecServiceF.systemReady();
                }
            } catch (Throwable e) {
                reportWtf("making IpSec Service ready", e);
            }
            traceEnd();
            //还有一系列的systemReady
            ...

            // 等待所有的appdata准备好
            mPackageManagerService.waitForAppDataPrepared();

            //让系统服务启动三方三方代码
            traceBeginAndSlog("PhaseThirdPartyAppsCanStart");
            // confirm webview completion before starting 3rd party
            if (webviewPrep != null) {
                ConcurrentUtils.waitForFutureNoInterrupt(webviewPrep, WEBVIEW_PREPARATION);
            }
            mSystemServiceManager.startBootPhase(
                    SystemService.PHASE_THIRD_PARTY_APPS_CAN_START);
            traceEnd();

            ...

            //接下来就是一系列的systemRunning
            traceBeginAndSlog("MakeLocationServiceReady");
            try {
                if (locationF != null) {
                    locationF.systemRunning();
                }
            } catch (Throwable e) {
                reportWtf("Notifying Location Service running", e);
            }
            traceEnd();
            traceBeginAndSlog("MakeCountryDetectionServiceReady");
            try {
                if (countryDetectorF != null) {
                    countryDetectorF.systemRunning();
                }
            } catch (Throwable e) {
                reportWtf("Notifying CountryDetectorService running", e);
            }
            traceEnd();
            ...
            //systemRunning结束
        }, BOOT_TIMINGS_TRACE_LOG);
    }
}

五 总结

  • SystemServer作为Zygote启动流程中,最重要的一个进程,甚至生死和都和Zygote绑定,可见它的作用是非常重要的。
  • 在SystemServer启动时,会通过main方法调用到run方法,并且在run方法中做一系列的初始化操作,包括信息保存,属性设置,虚拟机设置,binder设置,so库加载,注册SystemServiceManager,并且分批启动服务
  • SystemServer的分批启动服务主要分为三个阶段,Boot(引导服务),Core(核心服务),Other(其他服务),这样做主要是为了解决服务启动过程中的依赖问题
  • 启动服务结束后会进入loop循环

注意,并不是所有的服务都是通过SystemServer启动的,由SystemServer启动的服务属于SystemServer进程,还有一些服务是拥有着自己独立的进程,那些服务是通过配置在rc文件中进行启动的,也就是说,如果我们想开发一个系统级的服务,要么就通过配置在rc文件中启动,单独一个进程,要么就通过SystemServer进行启动,和SystemServer处于同一个进程。当然,这两种服务的区别还有很多,以后再详细说明。到此,SystemServer的启动算是结束了,接下来就是桌面Launch的启动