开始学习
2026/7/23大约 3 分钟
开始学习
这不是一份要求你从第一页背到最后一页的目录。主路线只选择约 15 篇文章,用一个 App 开发者 熟悉的问题贯穿始终:一次请求离开 Activity 之后,Android 系统如何接住它?
每完成一个阶段,都先停下来画图或运行命令。能自己验证,比“看懂了”更重要。
阶段一:建立地图
先分清系统层、源码目录、进程和线程。这个阶段不要急着钻进某个系统服务。
- Android Framework 到底是什么:从
getSystemService()认识系统层与源码目录。 - Android 系统如何从按下电源走到桌面:建立 Bootloader 到 Launcher 的时间线。
- 一个应用进程里有多少线程,谁决定进程生死:区分主线程、Binder 线程池和进程优先级。
完成标志:拿到一段调用链时,你能分别回答“代码在哪一层、运行在哪个进程、由哪个线程执行”。
阶段二:看懂系统如何协作
有了地图,再补齐同进程消息、跨进程通信、Context 入口和源码查阅环境。
- Handler 消息如何从投递走到执行:理解同一进程里的线程切换。
- Binder 是什么,Android 为什么需要它:理解应用与系统服务为什么需要 IPC。
- Activity 里的 this 为什么能拿到系统服务:找到 App API 与系统能力之间的入口对象。
- AOSP 环境与源码准备:根据目标选择在线查阅、同步源码或完整编译。
完成标志:你能区分普通调用、Handler 消息和 Binder 请求,并能从稳定符号找到 Android 14 源码。
阶段三:跟完一次 Activity 启动链路
现在从一行 startActivity() 出发,跟到 Activity 进入目标进程、申请窗口、提交首帧并接收输入。
- 从 startActivity 到 ATMS 的客户端链路:请求如何离开 App 进程。
- ActivityStarter 如何做一次启动决策:系统如何解析 Intent、选择 Task 并校验请求。
- ActivityRecord 与 Task:决策如何变成对象:服务端怎样保存 Activity 状态。
- 目标进程不存在时,系统如何创建它:Zygote fork 与
attachApplication()。 - ClientTransaction 如何驱动生命周期:事务怎样回到应用主线程执行。
- 应用如何向 WMS 申请一个窗口:从
setContentView()到IWindowSession。 - 窗口何时真正变得可见:区分注册、Surface、Buffer 与合成。
- View 如何收到输入事件:从
InputEventReceiver到 View 事件分发。
完成标志:你能画出这条链路中的 App 进程、system_server、Zygote、Binder 线程和主线程, 并说明窗口“已添加”为什么不等于“已有画面”。
做一次毕业验证
选择一个可调试设备或模拟器,启动一个 Activity,并保存以下证据:
adb shell am start -W <package>/<activity>
adb shell dumpsys activity activities
adb shell dumpsys window windows
adb shell dumpsys input把命令输出中的 Activity、Task、窗口和焦点与你画的调用链对应起来。命令字段会随 Android 版本和厂商实现变化;先保存原始输出,再依据当前源码解释。