Skip to content

BootPhase阶段

追踪 BootPhase 常量、SystemServer 推进点、AMS 回调、服务消费者和严格递增边界。

基于android-17.0.0_r1
AndroidSystemServerBootPhase源码阅读

BootPhase阶段 ​

BootPhase 不是启动进度百分比,而是一组能力门槛。SystemServer 在默认显示、SensorService、LockSettings、核心服务、设备专用服务、AMS ready、第三方应用和 boot completed 等节点调用 SystemServiceManager.startBootPhase();所有已启动服务随后收到 onBootPhase(phase),可以安全获取刚刚变为可用的依赖。

1. 常量与能力 ​

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

java
public static final int PHASE_WAIT_FOR_DEFAULT_DISPLAY = 100;
public static final int PHASE_WAIT_FOR_SENSOR_SERVICE = 200;
public static final int PHASE_LOCK_SETTINGS_READY = 480;
public static final int PHASE_SYSTEM_SERVICES_READY = 500;
public static final int PHASE_DEVICE_SPECIFIC_SERVICES_READY = 520;
public static final int PHASE_ACTIVITY_MANAGER_READY = 550;
public static final int PHASE_THIRD_PARTY_APPS_CAN_START = 600;
public static final int PHASE_BOOT_COMPLETED = 1000;

数值只保证严格递增和预留插入空间,不表示持续时间。每个 phase 的注释定义可安全使用的新能力:显示、传感器、LockSettings、核心系统服务、设备专用服务、广播、第三方应用 Binder 调用、用户交互。

2. 100默认显示 ​

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

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

该阶段在 Bootstrap 中、PMS 之前推进,表示 DisplayManager 已能提供默认 display/metrics。它不是 WMS displayReady,UI 仍未完成;服务只能依赖默认显示基础状态。

3. 200传感器门槛 ​

java
mSystemServiceManager.startBootPhase(
        t, SystemService.PHASE_WAIT_FOR_SENSOR_SERVICE);
wm = WindowManagerService.main(...);

Other 服务在创建 WMS 前等待 SensorService 可用。SensorService 初始化可能较慢,所以阶段名字包含 WAIT;推进完成后 WMS 才安全建立 orientation/display policy 等依赖。

4. 480与500 ​

java
if (lockSettings != null) {
    lockSettings.systemReady();
}
mSystemServiceManager.startBootPhase(
        t, SystemService.PHASE_LOCK_SETTINGS_READY);

mSystemServiceManager.startBootPhase(
        t, SystemService.PHASE_SYSTEM_SERVICES_READY);

480 在 LockSettings systemReady() 后推进,DevicePolicy 等服务可以读取凭据相关状态。500 表示 PowerManager、PackageManager 等核心系统服务可安全调用;WMS 随后执行 systemReady()。这两个阶段不能交换,否则服务可能在锁设置或核心依赖未完成时读取状态。

5. 520设备服务 ​

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

设备专用 SystemService 与相关 APEX/jar 服务启动后推进 520。消费方可以调用厂商/设备特定服务,但第三方应用仍未被允许启动;该阶段是平台与设备扩展之间的边界。

6. 550 AMS ready ​

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

550 位于 AMS.systemReady() 回调,SystemService 注释说明此后可发送广播。网络、AppOps、native crash observer 等后续 ready 动作在该 callback 中执行。该阶段不是“AMS 构造完成”,而是 AMS 已把内部进程/服务状态推进到 systemReady。

7. 600第三方应用 ​

java
mPackageManagerService.waitForAppDataPrepared();
if (webviewPrep != null) {
    ConcurrentUtils.waitForFutureNoInterrupt(
            webviewPrep, WEBVIEW_PREPARATION);
}
mSystemServiceManager.startBootPhase(
        t,
        SystemService.PHASE_THIRD_PARTY_APPS_CAN_START);

600 前必须等待 package app data 和可选 WebView preparation。阶段完成后服务可 start/bind 第三方应用,应用也能开始 Binder 调用系统服务。它是外部代码进入系统的关键门槛,因此不能只依据 AMS ready 提前推进。

8. 1000 Boot completed ​

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

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

最终 phase 由 AMS 在更晚的 boot completed 路径触发,而不是 SystemServer 四组服务启动结束时直接调用。Accessibility、Autofill、Storage、BinaryTransparency 等服务在该阶段执行最终初始化;UserController 也以此作为允许用户解锁和 boot-completed 流程的边界。

9. 单调性与异常 ​

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

java
if (phase <= mCurrentPhase) {
    throw new IllegalArgumentException(
            "Next phase must be larger than previous");
}
mCurrentPhase = phase;

phase 只能递增,重复和倒退在服务遍历前失败。任一 onBootPhase() 异常会被包装并传播,表示当前阶段未完成;并行服务的 Future 也必须全部成功。不能因为 mCurrentPhase 已赋值就假设所有服务 callback 都完成,诊断时还要检查具体服务 trace 和异常。

10. 导航与排查 ​

bash
# BootPhase 常量、注释和服务回调合同。
rg -n "PHASE_WAIT_FOR_DEFAULT_DISPLAY|PHASE_WAIT_FOR_SENSOR_SERVICE|PHASE_LOCK_SETTINGS_READY|PHASE_SYSTEM_SERVICES_READY|PHASE_DEVICE_SPECIFIC_SERVICES_READY|PHASE_ACTIVITY_MANAGER_READY|PHASE_THIRD_PARTY_APPS_CAN_START|PHASE_BOOT_COMPLETED" \
  frameworks/base/services/core/java/com/android/server/SystemService.java

# SystemServer/AMS 的实际推进点。
rg -n "startBootPhase\(" \
  frameworks/base/services/java/com/android/server/SystemServer.java \
  frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java

# 某一阶段的消费者。
rg -n "onBootPhase|PHASE_BOOT_COMPLETED|PHASE_ACTIVITY_MANAGER_READY" \
  frameworks/base/services

下一篇将进入 Watchdog 服务监控,解释 HandlerChecker、monitor、超时、栈采集和系统终止;不会重复 BootPhase 的阶段推进。