Skip to content

核心服务顺序

以 Installer、AMS、PMS、Display、WMS、Input、UsageStats 和 BootPhase 的真实消费者重建核心服务依赖链。

基于android-17.0.0_r1
AndroidSystemServerSystemService源码阅读

核心服务顺序 ​

SystemServer 的服务顺序不是“越重要越早”,而是由数据和能力依赖决定。Installer 必须在 PMS 前准备目录;ATM 先于 AMS 提供 task/window lock;DisplayManager 和默认 display phase 先于 PMS;UsageStats 启动后立即把 LocalServices 接口注入 AMS;WMS 创建后回填 AMS,InputManager 再取得 WMS callback,DisplayManager 最后确认 Window/Input ready。

本文把这些依赖边串成一张可反向排查的图。具体服务内部算法仍回到各自模块文章。

1. 四组只是外层顺序 ​

源码文件:frameworks/base/services/java/com/android/server/SystemServer.java

java
startBootstrapServices(t);
startCoreServices(t);
startOtherServices(t);
startApexServices(t);

四组保证粗粒度顺序,但组内仍有对象注入、LocalServices 查询、boot phase、Future 等细粒度同步。只看到一个服务属于 Bootstrap/Core 并不足以判断它何时真正可用。

2. Installer到PMS ​

java
Installer installer = mSystemServiceManager.startService(
        Installer.class);

mActivityManagerService.setInstaller(installer);

mPackageManagerService = PackageManagerService.main(
        mSystemContext, installer,
        domainVerificationService,
        mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF);

Installer 实例先保存,再分别注入 AMS 和 PMS。它的 consumer 不通过 ServiceManager 查询,而是直接持有 Java 实例。若 installd/目录准备失败,AMS/PMS 构造即使继续也缺少文件系统操作能力,因此该边属于硬依赖。

3. ATM到AMS ​

java
ActivityTaskManagerService atm =
        mSystemServiceManager.startService(
                ActivityTaskManagerService.Lifecycle.class)
                .getService();

mActivityManagerService =
        ActivityManagerService.Lifecycle.startService(
                mSystemServiceManager, atm);
mWindowManagerGlobalLock = atm.getGlobalLock();

ATM 先建立 activity/task 状态和 global lock,AMS 再持有 ATM 实例。后续 WMS 也接收 mActivityManagerService.mActivityTaskManager,因此 ATM 是 AMS/WMS 间共享状态的早期 owner。

4. Display到PMS ​

java
mDisplayManagerService = mSystemServiceManager.startService(
        DisplayManagerService.class);

mSystemServiceManager.startBootPhase(
        t, SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY);

mPackageManagerService = PackageManagerService.main(...);

PMS 读取 resources、features 和 display metrics 前,默认 display 必须可用。PHASE_WAIT_FOR_DEFAULT_DISPLAY 是显式屏障,不是普通日志标签;该 phase 中任一服务回调失败,PMS 不应继续启动。

5. UsageStats注入 ​

java
mSystemServiceManager.startService(
        UsageStatsService.class);
mActivityManagerService.setUsageStatsManager(
        LocalServices.getService(
                UsageStatsManagerInternal.class));

UsageStatsService 在 onStart() 发布本地接口,SystemServer 随后查询并注入 AMS。这条边要求发布和读取在同一线程顺序完成;Binder 名称是否存在与该本地接口无关。

6. WMS与Display ​

源码文件:frameworks/base/services/java/com/android/server/SystemServer.java

java
mSystemServiceManager.startBootPhase(
        t, SystemService.PHASE_WAIT_FOR_SENSOR_SERVICE);

WindowManagerService wm = WindowManagerService.main(
        context, inputManager, !mFirstBoot,
        new PhoneWindowManager(),
        mActivityManagerService.mActivityTaskManager);
ServiceManager.addService(Context.WINDOW_SERVICE, wm, ...);

mActivityManagerService.setWindowManager(wm);
wm.onInitReady();

inputManager.setWindowManagerCallbacks(
        wm.getInputManagerCallback());
inputManager.start();
mDisplayManagerService.windowManagerAndInputReady();

该闭环包含五个动作:等待 SensorService、创建并发布 WMS、WMS 回填 AMS、InputManager 取得 WMS callback 并启动、DisplayManager 等待两者 ready。任何一步提前都会造成 callback 为空、display policy 未完成或输入事件无消费者。

7. 第三方应用门槛 ​

java
mActivityManagerService.systemReady(() -> {
    mSystemServiceManager.startBootPhase(
            t, SystemService.PHASE_ACTIVITY_MANAGER_READY);

    mPackageManagerService.waitForAppDataPrepared();

    if (webviewPrep != null) {
        ConcurrentUtils.waitForFutureNoInterrupt(
                webviewPrep, WEBVIEW_PREPARATION);
    }

    mSystemServiceManager.startBootPhase(
            t,
            SystemService.PHASE_THIRD_PARTY_APPS_CAN_START);
});

AMS ready 后仍不能立即启动第三方应用。PMS app data 和 WebView preparation 必须完成,600 phase 才开放第三方代码。这样避免应用在数据目录、WebView RELRO 或服务权限状态未就绪时发起 Binder 调用。

8. 依赖类型 ​

依赖类型例子生效方式
实例注入Installer → AMS/PMSJava 字段直接保存
LocalServicesUsageStats → AMS同进程类型查询
Binder 名称WMS、TelephonyRegistryServiceManager 名称表
BootPhaseDisplay、Sensor、AMS ready所有 SystemService 回调
FutureWebView、secondary preload等待异步任务完成
ready callbackWMS/Input/Display显式方法回填与联结

识别依赖类型后,排查入口才准确:LocalServices 问题查同进程 map,Binder 问题查 servicemanager,Future 问题查线程池任务,BootPhase 问题查 phase callback。

9. 反向排查 ​

  • PMS 启动卡住:向前检查 Installer、DomainVerification、默认 Display phase;
  • AMS 缺 UsageStats:检查 UsageStats onStart() 是否发布 LocalServices,以及注入是否发生;
  • WMS 已注册但输入无效:检查 WMS callback、InputManager.start 和 Display ready join;
  • 第三方应用迟迟不启动:检查 AMS systemReady、PMS app data 和 WebView Future;
  • 服务名称可查但功能未 ready:检查 onBootPhase/systemReady/onInitReady,不能只看 addService。
bash
# 跨服务实例注入和 ready 回调。
rg -n "setInstaller|setUsageStatsManager|setWindowManager|setWindowManagerCallbacks|windowManagerAndInputReady|waitForAppDataPrepared" \
  frameworks/base/services/java/com/android/server/SystemServer.java

# 粗粒度服务组与 BootPhase 屏障。
rg -n "startBootstrapServices|startCoreServices|startOtherServices|startApexServices|PHASE_WAIT_FOR_DEFAULT_DISPLAY|PHASE_WAIT_FOR_SENSOR_SERVICE|PHASE_THIRD_PARTY_APPS_CAN_START" \
  frameworks/base/services/java/com/android/server/SystemServer.java

下一篇将选择 AMS/WMS/PMS 的实际初始化时序,深入构造、发布和 systemReady 消费;不会重复本文的跨服务依赖分类。