Skip to content

学习路径:从应用层到 Framework 的路线图 ​

本页导读:这一页回答三个问题:先学什么、源码按什么顺序读、书和课怎么选(附各自适用的 API 年代,避免拿 4.x 时代的老书硬套 16)。核心主张:Handler、Binder、启动流程三支柱先行,其余知识都挂在这三根柱子上;API 级别速查表(Android 10→16)与社区资源清单放在后部,最后给出本站三大板块的阅读顺序与 Android 17 的一句话动向。

版本注记:官方参考:API 级别对照(<uses-sdk> 文档)、AOSP 架构总览、官方课程库。

一、心智模型:三支柱 + 一条主线 ​

Framework 知识量巨大,但 80% 的疑难问题落在三根柱子上:

支柱一句话核心类(frameworks/base)学通的标志
Handler 消息机制一切异步都排队:Looper 取、MessageQueue 传、Handler 办Looper、MessageQueue、Handler、Choreographer能手画「主线程为什么卡 500ms 就 ANR」的时序图
Binder IPC跨进程的方法调用 + 权限身份证Binder、BinderProxy、ServiceManager、AIDL 生成物说清一次 startActivity 里 Binder 数据往哪拷贝、引用计数怎么管
启动流程从按下图标到第一帧的完整链路ActivityThread、ActivityTaskManager/ActivityStarter(server/am、server/wm)能默写 init→Zygote→system_server→Launcher→应用进程 fork→bindApplication→生命周期派发

一条主线:「一个请求的旅程」。任何 API 都拆成「应用侧代理(core/java)→ Binder → system_server 服务(services/core)→(可选)JNI → native 服务/HAL」。带着这个透镜,tools/01 的源码地图就是地图册,本页是行程规划。

二、三支柱学习次序与练习 ​

第 1 柱 Handler(1–2 周)

  • 读码顺序:Message → MessageQueue(屏障 barrier 是重点)→ Looper(nativePollOnce)→ Handler(Looper.myLooper 自建线程)→ Choreographer(vsync 到 doFrame)。
  • 练习:自建线程跑 Handler 队列;用 Perfetto 观察自己 app 的消息堆积(tools/02 §五)。
  • 常见误区:以为 postDelayed 精确——读 MessageQueue 的 idleHandler/屏障即知真相。

第 2 柱 Binder(2–3 周)

  • 读码顺序:AIDL 生成类(Stub/Proxy)→ android.os.Binder(transact/onTransact)→ frameworks/native/libs/binder(Parcel 序列化、句柄表)→ servicemanager 注册查询。
  • 练习:写一对跨进程服务,dumpsys meminfo 看 Parcel 分配;故意传大对象观察阈值行为。
  • 为什么重要:16 的一切(权限、窗口、任务栈……)都是 Binder 服务;ANR 阅读里「pending binder transaction」看不懂就是这柱欠账(tools/02 §七)。

第 3 柱 启动流程(2–3 周)

  • 应用启动:ActivityThread.main → attach → bindApplication → Provider/Activity 生命周期;对照 ApplicationStartInfo 字段读(a16/04 §四)。
  • 系统启动:init(system/core)→ Zygote 预加载 → SystemServer.startBootstrapServices → Launcher 起来。
  • 练习:在测试 ROM/模拟器上 am start -W 记录各阶段耗时,再用 trace 对齐源码提交点。

三柱立住后,再按兴趣选「第二层」:输入(native 分发在 frameworks/native,tools/01 §四)、图形(hwui/SurfaceFlinger)、窗口(wm 包)、媒体(frameworks/av)、ART(art/ 独立仓)。

支柱与资源对表(哪根柱子不牢,先看哪份材料):

支柱首选源码配套文档/长文实机工具
Handlercore/java/android/os/ 四件套老书机制章节仍可用Perfetto 消息轨
Binderframeworks/native/libs/binderAOSP 架构 Binder 节dumpsys meminfo Parcel 段
启动ActivityThread + SystemServerGityuan 启动系列、AOSP 启动文档am start -W + trace

三、源码阅读总顺序(一张依赖图) ​

  1. 应用可见层:frameworks/base/core/java——挑你天天用的类(Activity/View/Handler),只读主干分支,注释当 API 文档看。
  2. 系统服务层:services/core/java/com/android/server——按支柱需要选包(am/wm/pm/job/notification)。
  3. JNI 桥:android_util_*、android_os_*(base 内 jni/ 目录)——只需认路,不求甚解。
  4. native 骨干:frameworks/native(binder/libbinderui/surfaceflinger/input)——图形与输入必须到这一层。
  5. 运行时与系统原语:art/、system/core(init)——做性能或启动专项再深入。
  6. HAL 边缘:hardware/interfaces——理解「framework 到底向硬件要什么」即可。

每层的验收方式都一样:能回答一个真实问题(用 tools/02 的剧本),而不是「读完了」。

逐层问题清单(到层就用这些问题开刀):

层示范问题
core/javaActivity#startActivity 到 Binder 调用前走了几步?
services 层startActivity 在 ActivityStarter 里做了哪些校验与复用决策?
JNI哪些 Binder 调用其实是本地调用(同进程)捷径?
nativeInputDispatcher 如何决定事件投递给哪个 window?
ART/HAL冷启动时 Zygote 预加载了什么,省了哪一段?

四、书单与课程(按 API 年代标注,防止刻舟求剑) ​

「年代」指该书/课内容锁定的平台版本。老书的价值在骨架不变的部分(消息机制、Binder、WMS 模型),失效的主要是权限/生命周期细节与已退役 API——读时自带一张「差异翻译表」(即本页 §五的 API 对照 + a16 篇)。

资源年代锚点定位阅读建议
《第一行代码(第 3 版)》(经典应用层入门,覆盖到 API 30 时代)~Android 11(API 30)应用层应用层入门总览零基础首选;framework 视角不覆盖,读完接三支柱
《Android 设计与实现》(邓大卫)Android 4.3(API 18)Framework 骨架(Handler/Binder/启动/窗口)骨架仍可读;权限、ART、图形部分已过时,配合本书站 a16 篇校正
《Android 进阶解密》(徐立春)Android 5–6(API 21–23)时代Binder/系统服务深挖Binder 部分仍是中文里最细的之一;版本细节以新源码为准
Gityuan 博客系列(gityuan.com)覆盖 6–12(API 23–31)时代演进启动流程/ Binder/ 系统服务实战长文当「带图的源码笔记」用;13+ 行为需另行对照官方文档
AOSP 官方文档(source.android.google.cn)随版本滚动架构权威口径先读架构总览 + 你选专项(图形/输入/ART)章节
Android 官方课程库(developer.android.com/courses)随版本滚动应用层正规军应用层基础不牢先补这里
cs.android.com + API diff活的文档任何「书上怎么说 vs 现在怎么跑」的仲裁者每读一段老材料,去 cs 切当前 release 分支对照一次

一条防坑总则:2015 年前出版的书,凡是讲「权限模型、通知、存储、生命周期细节」的章节默认过时;讲「消息循环、Binder 机制、窗口层次思想」的章节大多还值钱。

五、API 级别对照速查(Android 10 → 17) ​

版本注记:官方表摘自 API 级别文档,核对时间 2026-10。代号列即 Build.VERSION_CODES。

平台API代号一句话记忆点
Android 1029Q分区存储、非 SDK 接口限制起步
Android 1130R一次性权限、气泡、v4 签名
Android 1231 / 32S / S_V2蓝牙权限族、精确闹钟、SplashScreen
Android 1333TIRAMISU通知运行时权限、per-app 语言
Android 1434UPSIDE_DOWN_CAKE前台服务类型收紧、部分照片访问
Android 1535VANILLA_ICE_CREAMedge-to-edge 强制(可退出)、16 KB 支持
Android 1636BAKLAVA本站基线:双发布节奏首个 major,target36 硬骨头集中
Android 1737CINNAMON_BUN官方表已挂出;详见 §八一句话动向

用法提醒:targetSdk 只认 major 级别(36),QPR 等次要发布用 SDK_INT_FULL 判断(a16/00 §三)。

两个高频混淆提前拆:①「API 32 与 31 都是 Android 12」是 12L 双 API 级别的历史特殊,此后不再有;②版本号递增 ≠ 行为变更增多,行为变更与 target 绑定,与你的编译版本无关。

六、社区与信息源(活人多的地方) ​

  • 官方渠道:Android Developers 文档与博客、issuetracker(搜已知问题 + 提 API 需求,16 已知问题清单)。
  • AOSP 邮件列表:android-discuss(AOSP 开发官方讨论组):https://groups.google.com/g/android-discuss
  • Reddit:r/androiddev(应用层为主,偶尔有框架彩蛋)。
  • 中文社区:掘金/知乎的 Framework 长文以「是否给源码路径 + 版本」为质量筛选器,无源码路径的「原理图」一律降级处理。
  • 信息新鲜度纪律:任何结论先过三关——官方两页行为变更、特性页、API diff;查不到官方出处的写「传闻/待验证」(本站 a16/05 §六 的卫星条目即示范)。
  • 问答与代码仓库:Stack Overflow 的 android 标签适合报错检索;Google 代码托管侧的开源 app(如官方架构组件样例仓)适合看「官方推荐怎么写」。
  • 版本发布日历:每年盯 Q2 major 与 Q4 minor 两个窗口(a16/00 §三 的节奏表),适配窗口就藏在发布节奏里。

七、本站三大板块的阅读顺序建议 ​

本站按「应用层 → Framework 核心 → 版本前沿」三块组织,推荐动线:

  1. 应用层板块(各章 00 总览入口):四大组件、UI 体系、并发与存储——没写过完整应用先补这层,否则 framework 里的「被服务对象」你会看不懂。
  2. Framework 核心板块:Handler/Binder/启动三支柱 + WMS/输入/图形选精——配合 tools/01 的源码地图与 tools/02 的实机工具同步推进。
  3. Android 16 与工具板块(a16 篇 + 本页所在的 tools 篇):把前两块的「稳定机制」映射到「当下版本的差异」——年度升级适配与新技术雷达都在这里。

节奏建议:三支柱各 2 周 → tools 两篇常开(左屏源码右屏 dumpsys)→ a16 篇过一遍建立版本感 → 进入自选题(读一个你常用的系统服务,从 dumpsys 进源码出)。

12 周参考课表(可倍速/减半,顺序别乱):

周主线交付物
1–2Handler 支柱 + tools/02 §一 上手一张自画消息循环时序图
3–5Binder 支柱 + tools/01 注册表通读自制 AIDL 服务 + Parcel 观察笔记
6–8启动流程 + 首次完整 ANR 阅读一份真实 ANR 根因报告
9–10第二层选一项精读(输入或图形)该专项的「问题→源码」五问自答
11a16 全篇过读 + 两页官方行为变更对照你所在项目的 target36 升级工单草稿
12自选题收尾 + §九清单补勾个人源码笔记仓库首版

八、Android 17:一句话动向(本站基线仍是 16) ​

官方 API 级别表已挂出 Android 17 = API 37(CINNAMON_BUN)(核对时间 2026-10,官方页);新发布节奏下它按季度线推进,本站全部页面基线锁定 Android 16,17 的增量对照等官方文档稳定后再说——学习路径不变:机制层(三支柱)永远比版本号层保值。

九、自学验收清单(可打勾) ​

  • [ ] 能白板讲清 Handler 屏障与 Choreographer 的关系。
  • [ ] 写过一个真正的 AIDL 服务并解释 Parcel 的拷贝语义。
  • [ ] 画出 init→Zygote→system_server→Launcher→应用首帧的调用图并讲出两次 Zygote fork 的区别。
  • [ ] 用 dumpsys + Perfetto 独立完成一次卡顿定位(tools/02 剧本 1)。
  • [ ] 读通过一份 /data/anr 并按七步动线讲出根因。
  • [ ] 任选一个 16 行为变更(如 LNP/Safer Intents),能说出实现落在源码哪一带 + 官方文档链接。
  • [ ] 建立自己的「反射/内部接口债台账」或「厂商差异对照笔记」并持续更新。
  • [ ] 能用 §六 的新鲜度纪律,给一篇流传的「16 新规」自媒体文逐条判真伪并给出官方链接。
  • [ ] 三支柱各维护一组可运行的最小复现工程(消息/IPC/启动各一)。
  • [ ] 给新人讲一次三支柱并答疑不翻资料(费曼终检)。
  • [ ] 把本站三篇与两页官方行为变更串成一份团队分享提纲。

九·五、三个快答 ​

  • Q:要不要背 API 级别/代号? 不用背全。记住你维护的 minSdk/target 两端 + 当前 major(36/BAKLAVA),其余查 §五。
  • Q:先读源码还是先写应用? 没有应用层肌肉记忆就先写——「被服务对象」都没服务过,服务对象怎么转的无从想象。
  • Q:老视频课能当主线吗? 可当导览,不能当法规:主线永远是官方文档 + 源码,视频只负责领进门。

本页小结 ​

本页小结:Framework 学习的最大成本是选错顺序——Handler、Binder、启动流程三支柱先立,源码按「应用层→服务层→native」的依赖图逐层下钻,工具(tools/01 的地图 + tools/02 的显微镜)与读码同步进行。书单按 API 年代消费:机制章节值钱、策略章节过期,老材料一律拿 cs.android.com + API diff 仲裁。版本知识(10→16 对照表、16 双发布节奏、17 挂名 API 37)是导航仪而不是目的地;三支柱的机制理解才是保值资产。

参考资料 ​

(工具三篇到此结束;版本知识会过期,机制理解与查证方法不会——这是本页全部建议的底层逻辑。)

基于 Android 16 / API 36 · 内容为原创整理,转载请注明出处