Skip to content

Trampoline模式

解析 SystemService Lifecycle/Trampoline 包装、真实服务 owner、条件实现、生命周期转发和失败边界。

基于android-17.0.0_r1
AndroidSystemServerLifecycle源码阅读

Trampoline模式 ​

SystemServer 中的 Trampoline/Lifecycle 类不是为了“少写几行代码”,而是把 SystemServiceManager 需要的生命周期对象与真实业务服务对象分开:Manager 反射创建 Lifecycle(Context),Lifecycle 再构造或选择真正实现,onStart/onBootPhase/onUser* 由 wrapper 转发。这样可以在构造阶段注入静态依赖、按资源选择实现、统一发布 Binder,同时不要求 SystemServiceManager 了解业务类的复杂构造器。

1. Manager入口 ​

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

java
public <T extends SystemService> T startService(
        Class<T> serviceClass) {
    Constructor<T> constructor =
            serviceClass.getConstructor(Context.class);
    T service = constructor.newInstance(mContext);
    startService(service);
    return service;
}

public void startService(SystemService service) {
    String className = service.getClass().getName();
    if (mServiceClassnames.contains(className)) return;
    mServiceClassnames.add(className);
    mServices.add(service);
    service.onStart();
}

Manager 只要求传入类继承 SystemService 并有 Context 构造器。它保存的是 Lifecycle wrapper,不一定是真实 AMS/DPMS 对象;后续 BootPhase 和 user callback 遍历的也是 wrapper 列表。

2. AMS Lifecycle ​

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

java
public static final class Lifecycle extends SystemService {
    private final ActivityManagerService mService;
    private static ActivityTaskManagerService sAtm;

    public Lifecycle(Context context) {
        super(context);
        mService = new ActivityManagerService(context, sAtm);
    }

    public static ActivityManagerService startService(
            SystemServiceManager ssm,
            ActivityTaskManagerService atm) {
        sAtm = atm;
        return ssm.startService(
                ActivityManagerService.Lifecycle.class)
                .getService();
    }

    @Override public void onStart() {
        mService.start();
    }

    @Override public void onBootPhase(int phase) {
        mService.mBootPhase = phase;
        if (phase == PHASE_SYSTEM_SERVICES_READY) {
            mService.mBatteryStatsService.systemServicesReady();
            mService.mServices.systemServicesReady();
        }
    }
}

静态 sAtm 先由调用方写入,再由 Lifecycle 构造 AMS;这就是 wrapper 能注入非标准构造参数的原因。SystemServer 通过 getService() 取回真实 AMS,Manager 仍只管理 Lifecycle。

3. DPMS条件实现 ​

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

java
public static final class Lifecycle extends SystemService {
    private DevicePolicyManagerService mService;

    public Lifecycle(Context context) {
        super(context);
        String className = context.getResources()
                .getString(R.string
                    .config_deviceSpecificDevicePolicyManagerService);
        if (TextUtils.isEmpty(className)) {
            mService = new DevicePolicyManagerService(context);
        } else {
            try {
                Class<?> impl = Class.forName(className);
                Constructor<?> ctor =
                        impl.getConstructor(Context.class);
                mService = (DevicePolicyManagerService)
                        ctor.newInstance(context);
            } catch (Exception e) {
                throw new IllegalStateException(
                        "Failed to instantiate DevicePolicyManagerService",
                        e);
            }
        }
    }

    @Override public void onStart() {
        publishBinderService(
                Context.DEVICE_POLICY_SERVICE, mService);
    }

    @Override public void onBootPhase(int phase) {
        mService.systemReady(phase);
    }
}

这里 wrapper 还承担设备 overlay 的实现选择:资源为空使用平台实现,否则反射加载设备专用类。SystemServiceManager 不需要知道具体 class name;失败在 Lifecycle 构造阶段抛出,Binder 尚未发布。

4. 生命周期转发 ​

java
@Override
public void onUserStarting(@NonNull TargetUser user) {
    if (user.isPreCreated()) return;
    mService.handleStartUser(user.getUserIdentifier());
}

@Override
public void onUserUnlocking(@NonNull TargetUser user) {
    if (user.isPreCreated()) return;
    mService.handleUnlockUser(user.getUserIdentifier());
}

@Override
public void onUserStopping(@NonNull TargetUser user) {
    if (user.isPreCreated()) return;
    mService.handleStopUser(user.getUserIdentifier());
}

wrapper 可以在转发前过滤 pre-created user、转换参数或加入兼容逻辑。真实服务的 per-user 状态仍由 mService 持有;Manager 只负责把 TargetUser 事件广播给 wrapper。

5. 收益与代价 ​

收益是构造参数可扩展、设备实现可替换、Manager 与业务类解耦;代价是调试时必须跨两层对象追踪,且 wrapper 构造成功不代表真实服务已 onStart() 或 Binder 已发布。

6. 适用边界 ​

直接实现 SystemService 的服务通常可以由 startService(ServiceClass) 反射构造;Lifecycle/Trampoline 适用于:

  • 需要 ATM、Installer 等非 Context 构造依赖;
  • 需要读取资源/feature 选择设备实现;
  • 需要把真实服务的 getService() 暴露给 SystemServer 调用方;
  • 需要在用户事件前过滤 pre-created/headless 用户;
  • 需要把 Binder 发布和业务对象生命周期分离。

它不是延迟加载的同义词:很多 Lifecycle 构造器仍立即 new 真实服务,延迟只体现在 Manager 的统一生命周期入口。

7. 失败定位与导航 ​

  • wrapper class not found:查 SystemServer classpath/jar 和 feature gate;
  • 真实实现构造失败:查 overlay class name、构造器和静态初始化;
  • wrapper 在列表但 Binder 不可查:查 onStart() 是否发布接口;
  • BootPhase 状态缺失:查 wrapper 是否转发 phase、真实服务是否保存状态;
  • 用户事件异常:查 pre-created/headless 过滤与真实服务 per-user 清理。
bash
# Manager 的反射入口、实例列表和 onStart。
rg -n "startService\(Class|startService\(SystemService|mServiceClassnames|mServices|onStart" \
  frameworks/base/services/core/java/com/android/server/SystemServiceManager.java

# 典型 Lifecycle wrapper 与真实服务转发。
rg -n "class Lifecycle|startService\(|getService\(|onStart\(|onBootPhase\(|onUserStarting" \
  frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java \
  frameworks/base/services/devicepolicy/java/com/android/server/devicepolicy/DevicePolicyManagerService.java

下一篇将进入 SystemServiceManager 的 boot phase 和 SystemServer 服务启动耗时如何联动;不会重复 Lifecycle wrapper 的构造和转发。