Skip to content

AMS/WMS/PMS时序

以 Android 17 真实源码串起 ActivityManager、WindowManager、PackageManager 的构造、发布、依赖注入和 systemReady。

基于android-17.0.0_r1
AndroidSystemServerAMSWMSPMS源码阅读

AMS/WMS/PMS时序 ​

AMS、WMS、PMS 经常被概括成“SystemServer 启动三个核心服务”,但源码中的可用状态至少有四层:对象已构造、Binder/LocalServices 已发布、依赖已注入、systemReady()/BootPhase 已完成。Android 17 先创建 ATM 再创建 AMS,先准备 DisplayManager 和默认 display,再初始化 PMS;WMS 又要等 SensorService,创建后回填 AMS,InputManager 接收 WMS callback,最后 DisplayManager 才能确认 Window/Input ready。

1. ATM与AMS构造 ​

源码文件:frameworks/base/services/java/com/android/server/SystemServer.java、frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

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

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

ATM 的 Lifecycle 先构造并保存 ActivityTaskManagerService,AMS 的静态 Lifecycle.startService() 再把 ATM 放入构造上下文。AMS 创建后,SystemServer 显式注入 SystemServiceManager 和 Installer,并从 ATM 取出 global lock。此时只是进程内对象关系建立,AMS 尚未通过 setSystemProcess() 发布完整 Binder 服务。

2. PMS前置条件 ​

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

java
mDisplayManagerService = mSystemServiceManager.startService(
        DisplayManagerService.class);
mSystemServiceManager.startBootPhase(
        t, SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY);

DomainVerificationService domainVerificationService =
        new DomainVerificationService(
                mSystemContext, SystemConfig.getInstance(),
                platformCompat);
mSystemServiceManager.startService(domainVerificationService);

DisplayManager 先启动,PHASE_WAIT_FOR_DEFAULT_DISPLAY 让已启动服务获得默认显示能力;DomainVerificationService 复用 SystemConfig 和 PlatformCompat。PMS 的初始化不是孤立构造,它依赖 Installer、默认 display、SystemConfig、PlatformCompat 和 DomainVerification。

3. PMS主初始化 ​

源码文件:frameworks/base/services/java/com/android/server/SystemServer.java、frameworks/base/services/core/java/com/android/server/pm/PackageManagerService.java

java
Watchdog.getInstance().pauseWatchingCurrentThread(
        "packagemanagermain");
try {
    mPackageManagerService = PackageManagerService.main(
            mSystemContext, installer,
            domainVerificationService,
            mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF);
} finally {
    Watchdog.getInstance().resumeWatchingCurrentThread(
            "packagemanagermain");
}

mFirstBoot = mPackageManagerService.isFirstBoot();
mPackageManager = mSystemContext.getPackageManager();

Watchdog 只暂停当前线程的 checker,因为 PMS 扫描和解析可能长时间运行;其他线程仍受监控。PackageManagerService.main() 返回后,SystemServer 才保存 mFirstBoot 并取得 PackageManager facade。PMS 对象存在不等于包数据、应用进程和 systemReady 已完成。

4. AMS发布系统进程 ​

源码文件:frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

java
public void setSystemProcess() {
    ServiceManager.addService(
            Context.ACTIVITY_SERVICE, this,
            true, DUMP_FLAG_PRIORITY_CRITICAL
                    | DUMP_FLAG_PRIORITY_NORMAL
                    | DUMP_FLAG_PROTO);
    ServiceManager.addService(ProcessStats.SERVICE_NAME,
            mProcessStats);
    ServiceManager.addService("permission",
            new PermissionController(this));
    ServiceManager.addService("processinfo",
            new ProcessInfoService(this));

    ApplicationInfo info = mContext.getPackageManager()
            .getApplicationInfo("android",
                    STOCK_PM_FLAGS | MATCH_SYSTEM_ONLY);
    mSystemThread.installSystemApplicationInfo(
            info, getClass().getClassLoader());
    ...
}

setSystemProcess() 是 AMS 从“已构造对象”进入“系统 Binder 服务集合”的关键点:它发布 activity、process stats、permission、processinfo 等名称,并把 android ApplicationInfo 安装到 system ActivityThread。该步骤需要 PMS 已可查询系统包,因此位于 PMS 主初始化之后。

5. WMS创建与AMS回填 ​

源码文件:frameworks/base/services/java/com/android/server/SystemServer.java、frameworks/base/services/core/java/com/android/server/wm/WindowManagerService.java

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

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

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

WMS 创建前先推进 SensorService phase;创建时接收 InputManager、PhoneWindowManager、ATM 等依赖。发布 Binder 后,SystemServer 还要调用 AMS 的 setWindowManager() 完成反向引用,再调用 wm.onInitReady()。因此“window 服务可查”和“AMS 已持有 WMS、WMS 已完成初始化”是不同状态。

6. 输入与显示 ​

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

java
inputManager.setWindowManagerCallbacks(
        wm.getInputManagerCallback());
inputManager.start();

mDisplayManagerService.windowManagerAndInputReady();

InputManager 必须先取得 WMS callback 后启动,DisplayManager 又在 WindowManager 和 InputManager 都完成后调用 windowManagerAndInputReady()。这一步把三个服务的 ready 状态联结起来;任何一方只完成 onStart() 都不足以证明显示和输入链路可用。

7. systemReady阶段 ​

源码文件:frameworks/base/services/java/com/android/server/SystemServer.java、frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

java
lockSettings.systemReady();
mSystemServiceManager.startBootPhase(
        t, SystemService.PHASE_LOCK_SETTINGS_READY);
mSystemServiceManager.startBootPhase(
        t, SystemService.PHASE_SYSTEM_SERVICES_READY);

wm.systemReady();
mPackageManagerService.systemReady();
mDisplayManagerService.systemReady(safeMode);

systemReady 不是单个全局布尔值:LockSettings、SystemServiceManager phase、WMS、PMS、DisplayManager 各自有 ready 方法,且调用顺序由依赖决定。AMS 的 systemReady() 还会在内部完成 controllers、AppOps、ProcessList 等状态后执行回调,推动 PHASE_ACTIVITY_MANAGER_READY。

8. 四种状态判读 ​

状态代表代码能说明什么
对象构造new ActivityManagerService、PackageManagerService.mainJava/native 对象存在
Binder发布ServiceManager.addService其他进程可按名称查询(仍受权限影响)
依赖注入setInstaller、setWindowManager、setUsageStatsManager进程内引用已建立
ready完成systemReady、onInitReady、BootPhase对应依赖和阶段动作已执行

现场看到 Binder 名称存在时,仍需判断它属于哪一层:AMS 可能已发布但 PMS/system process 尚未完成,WMS 可能可查但 Input callback 尚未安装,PMS 可能已构造但 app data 尚未准备。

9. 反向排查与导航 ​

  • AMS 查询失败:查 setSystemProcess()、PMS 是否可查询 android 包;
  • PMS 初始化卡住:查 Installer、默认 display phase、DomainVerification 和 Watchdog pause;
  • WMS 可查但无输入:查 setWindowManagerCallbacks()、inputManager.start() 和 Display ready;
  • 服务 ready 顺序错误:查 BootPhase 单调性和 systemReady/onInitReady 调用点;
  • 依赖为空:区分 Binder 名称查询与 LocalServices/字段注入。
bash
# 输入三大服务调用点,输出构造、发布、注入和 ready 顺序。
rg -n "ActivityTaskManagerService\.Lifecycle|ActivityManagerService\.Lifecycle|PackageManagerService\.main|WindowManagerService\.main|setSystemProcess|setWindowManager|systemReady|onInitReady" \
  frameworks/base/services/java/com/android/server/SystemServer.java \
  frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

# 输入 SystemServiceManager phase,输出 phase 屏障和生命周期分发。
rg -n "PHASE_WAIT_FOR_DEFAULT_DISPLAY|PHASE_WAIT_FOR_SENSOR_SERVICE|PHASE_LOCK_SETTINGS_READY|PHASE_SYSTEM_SERVICES_READY|PHASE_ACTIVITY_MANAGER_READY|startBootPhase" \
  frameworks/base/services/java/com/android/server/SystemServer.java \
  frameworks/base/services/core/java/com/android/server/SystemServiceManager.java

下一篇将进入 SystemServiceManager 的依赖与生命周期编排实战,结合一个具体服务解释 onStart、onBootPhase 和 LocalServices 注入;不会重复 AMS/WMS/PMS 的初始化时序。