1. ActivityManager 服务架构概览:核心组件、启动流程、系统服务注册
Android 系统中,ActivityManagerService (AMS) 是系统服务框架中最核心的组件之一,负责管理所有 Activity 的生命周期、任务栈、进程调度以及权限检查。理解 AMS 的架构是实现“边界控制”(例如限制后台启动、冻结进程、裁剪服务)的前提。
1.1 核心组件
| 组件名称 | 所属层级 | 职责简述 |
|---|---|---|
| ActivityManagerService | System Server | AMS 主服务,处理 Binder 调用,管理 Activity、Service、Broadcast、ContentProvider 的状态 |
| ActivityTaskManagerService | System Server | 专注 Activity 任务栈调度,与 AMS 分离后负责窗口焦点、启动模式等 |
| ProcessRecord | AMS 内部 | 进程记录实体,保存 pid、uid、oom_adj、调度策略等,是边界控制的关键数据载体 |
| ActivityRecord | AMS 内部 | Activity 实例记录,包含 intent、生命周期状态、task 引用等 |
| TaskRecord | AMS 内部 | 任务栈(Back Stack)记录,维护 ActivityRecord 的有序列表,决定返回与多窗口行为 |
| ProcessList | AMS 辅助 | 统一管理所有 ProcessRecord,负责 OOM 调整、杀进程、缓存限制 |
| ActivityStackSupervisor | AMS 辅助 | 管理多 Display、多 Task 的叠加关系,处理启动模式的决策 |
| IntentResolver | AMS 内部 | 解析隐式 Intent,匹配 Activity/Service/Broadcast 等组件,影响系统响应边界 |
边界控制切入点:ProcessRecord.oom_adj 和 ProcessRecord.maxAdj 是后台启动拦截、冻结判断的依据;ActivityManagerService 的 startActivity 和 bindService 是定制权限与白名单的埋点位置。
1.2 启动流程(冷启动 Activity 为例)
- 发起端调用:App 通过 Binder 调用 AMS.startActivity(Intent)。
- 权限与边界检查:AMS 内部检查调用进程权限、后台启动限制(如
BACKGROUND_START_ACTIVITY限制),若触发边界则返回错误或抑制启动。 - ActivityStackSupervisor 决策:解析 Intent,匹配目标 ActivityRecord,判断是否需要创建新 Task、复用已有 Task 或执行 singleTop 等启动模式。
- 进程创建:若目标进程未运行,AMS 通过 ProcessList 发送
CREATE_PROCESS消息,Zygote 会 fork 新进程并绑定 Application。 - Activity 生命周期调度:AMS 依次调用 ActivityThread.
handleLaunchActivity→handleResumeActivity,最终将界面显示到屏幕。
热启动场景:当目标 Activity 已在后台 Task 中且进程存活,AMS 仅执行
onPause/onResume 流程,不会重新创建进程。定制边界时常需区分“冷启动”与“热启动”的拦截策略。
1.3 系统服务注册
AMS 作为系统服务,在 SystemServer 进程启动时通过 ServiceManager.addService 注册到 Binder 上下文。注册名固定为 "activity"。
// SystemServer.java (AOSP 14)
private void startBootstrapServices(@NonNull TimingsTraceAndSlog t) {
t.traceBegin("StartActivityManager");
mActivityManagerService = mSystemServiceManager.startService(
ActivityManagerService.Lifecycle.class);
ServiceManager.addService(Context.ACTIVITY_SERVICE, mActivityManagerService);
t.traceEnd();
}
客户端通过 Context.getSystemService(Context.ACTIVITY_SERVICE) 获取 IActivityManager 代理接口,所有调用最终通过 Binder 到达 AMS。定制边界控制时可修改 ServiceManager 注册的 Binder 对象,或增加代理层实现拦截。
1.4 架构总览图
1.5 调试与验证
查看当前系统 AMS 运行状态及已注册的服务列表,常使用以下命令:
# 查看 activity 服务是否注册(Binder 名)
adb shell service list | grep activity
# 查看当前进程的 OOM 调优值(ProcessRecord 关键字段)
adb shell dumpsys activity oom
# 实时监控 AMS 启动 Activity 日志(过滤边界拦截)
adb logcat -s ActivityManager:V *:S
常见错误:在低版本 Android(如 8.0 以下)中,ActivityManagerService 和 ActivityTaskManagerService 未分离,所有 Activity 调度逻辑混在 AMS 内。定制边界控制时,需要区分系统版本对应的代码路径,避免引用错误的方法或类名。
1.6 性能与稳定性提示
- 避免在 AMS 主线程阻塞:所有 Binder 调用默认在 AMS 主线程执行,任何自定义边界检查(如磁盘 I/O、网络请求)都应异步化,否则会导致全局桌面无响应(ANR)。
- ProcessRecord 缓存策略:ProcessList 内部维护进程 LRU 缓存,频繁修改 maxAdj 会触发 OOM 重新排序,应批量更新而非逐条设置。
- 最小化 Binder 通信:定制边界控制可能增加额外权限校验逻辑,建议将高频校验(如白名单匹配)放在 AMS 内部缓存中,减少跨进程查询(如查询 PackageManager)。