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
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
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
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. 生命周期转发
@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 清理。
# 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 的构造和转发。
