ActivityManagerService (AMS) 是 Android Framework 中最核心、最庞大的系统服务。设计一套科学的 AMS 学习路线,建议遵循“从宏观到微观,从模型到流程”的原则。
第一阶段:夯实底座(前置必备知识)
在直接阅读 AMS 源码前,必须先掌握 Android 的 IPC 机制和基础通信模型。
| 模块 | 关键考点 | 学习目的 |
|---|---|---|
| Binder 机制 | mmap、AIDL 通信、Stub/Proxy 模式 | 理解 App 进程如何跨进程调用系统服务。 |
| Handler 机制 | Looper 循环、MessageQueue、同步屏障 | 理解 ActivityThread 如何接收并处理来自 AMS 的指令。 |
| Zygote 进程 | Fork 机制、AppRuntime 启动 | 理解 Android 进程是如何被孵化出来的。 |
第二阶段:数据模型(理解“三驾马车”)
不要一上来就跟代码流程,先理解 AMS 是如何通过对象来描述 Activity 运行状态的。
| 核心类 | 职责描述 | 对应现实模型 |
|---|---|---|
| ActivityRecord | 记录单个 Activity 的所有状态(Intent, State, TaskAffinity)。 | 个人档案 |
| TaskRecord | 任务栈,管理一组相关的 ActivityRecord。 | 文件夹 |
| ActivityStack | 管理 TaskRecord 的集合(在 Android 10+ 已被 Task 取代)。 | 文件柜 |
| ProcessRecord | 描述应用进程信息(UID, PID, 包含的所有组件)。 | 容器 |
第三阶段:核心流程(模拟启动链路)
这是 AMS 最具挑战性的部分,建议分阶段拆解 startActivity 的完整生命周期。
| 学习步骤 | 核心关键点 | 推荐工具 |
|---|---|---|
| 1. 进程内调用 | ContextImpl -> Instrumentation -> ATMS 代理。 | 静态代码追踪 |
| 2. 栈管理逻辑 | 判断启动模式 (LaunchMode)、计算目标 Task、处理 Flag。 | dumpsys activity |
| 3. 进程创建 | AMS 发现进程不存在 -> 请求 Zygote -> 进程启动。 | Logcat 过滤线程 ID |
| 4. 事务分发 | ClientTransaction 封装、TransactionExecutor 执行回调。 | 事务断点调试 |
第四阶段:进阶与演进(现代架构分析)
了解 AMS 的现代演进,特别是 Android 10+ 的重大变化。
| 进阶专题 | 核心内容 | 学习意义 |
|---|---|---|
| AMS 与 ATMS 拆分 | 职责分离原理、进程管理与组件管理的分离。 | 适配 API 29+ 源码。 |
| 多窗口与折叠屏 | DisplayContent、多焦点管理逻辑。 | 掌握现代 UI 架构适配原理。 |
| OOM Adj 算法 | 进程优先级(Cached, Empty, Visible)的动态调节。 | 性能优化与后台存活研究。 |
💡 学习建议:
- 不要迷失在细节里:AMS 的代码量极大,初期应以“理清调用时序图”为主,忽略细枝末节的逻辑判断。
- 多用 dumpsys:运行
adb shell dumpsys activity activities可以实时查看当前的栈结构,将抽象的对象可视化。 - 对照版本:Android 10 之后的
startActivity逻辑基本都在ATMS中,阅读源码时务必注意系统版本。