Appearance
AOSP 源码地图:从下载到 frameworks/base 逐块导览
本页导读:这一页解决「想读 Android 源码,第一步干什么、第二步看哪里」。覆盖:repo 官方下载与镜像加速、AOSP 分支与发布 tag 的用法、
frameworks/base逐块导览(AMS/WMS/输入/图形各自在哪)、cs.android.com 搜索技巧、跨版本 diff 的实操路线,以及 AOSP 与厂商魔改的关系。所有路径以 Android 16 时代的目录结构为基准描述,个别组件迁移以 cs.android.com 实时搜索为准。
版本注记:官方入口:AOSP 下载要求、构建 AOSP、平台架构总览。本页描述的目录结构与本站 a16 篇 的行为变更条目互相索引。
一、获取源码:三条路径先想清楚
先问自己要什么,再选下载方式,别一上来就全量 sync:
| 目的 | 建议路径 | 体量直觉 |
|---|---|---|
| 查某个类/跨仓库搜索 | 不下载,直接用 cs.android.com | 0 |
| 读 framework 某一两层 | 单仓浅克隆(frameworks/base 单仓即可) | 数 GB 级,可接受 |
| 完整编译/跑模拟器镜像 | repo 全量 + 构建 | 数百 GB,慎重 |
| 只想体验系统行为 | 下载 GSI 刷测试机 | 单文件级 |
官方全量路径(requirements 页):安装 repo 工具后——
bash
mkdir aosp && cd aosp
repo init -u https://android.googlesource.com/platform/manifest
repo init -b android16-release # 分支:release 线;main 为开发线
repo sync -c -j8 --fail-fast-b指定分支:AOSP 用androidXX-release命名发布分支线(如android16-release),main是向前开发线;学习期建议钉 release 线。- 发布 tag(如
android-16.0.0_rX)是「官方发版瞬间」的快照点,跨版本 diff 用它对齐(§六)。
国内加速:清华 TUNA 提供 AOSP 镜像,帮助文档入口:https://mirrors.tuna.tsinghua.edu.cn/help/ (页内检索 “AOSP” 条目,按其指引替换 repo init -u 的 manifest 地址并设置 repo 工具自身镜像;镜像策略偶有调整,以该帮助页当前说明为准)。GitHub 上的第三方 AOSP 镜像仓可作只读参考,但权威性一律以 android.googlesource.com 为准。
新手常见的三个坑:① 磁盘没留够——repo 全量 checkout 前确认至少预留 400 GB 级别空间(官方 requirements 页有硬指标);② 拿 main 分支当 16 正式版读——行为对不上时先怀疑分支;③ 把 repo sync 的断线当玄学——加 -c(只拉当前 manifest 文件)与重试即可,镜像源换用后首次 sync 建议 --fail-fast 早暴露问题。
二、单仓浅克隆:读 framework 的最短路径
不编译、只为读码时,单仓即可开读(git 直连 android.googlesource 或用 --depth 控制体量):
bash
git clone --depth 1 --branch android16-release \
https://android.googlesource.com/platform/frameworks/base常用仓库速查(读 framework 绕不开的几本):
| 仓库 | 内容 | 对应话题 |
|---|---|---|
platform/frameworks/base | 应用框架 Java/Kotlin 可见层 + system_server 主体 | 四大组件、WMS、权限、通知 |
platform/frameworks/native | Binder 驱动用户态、SurfaceFlinger、InputFlinger | 跨进程、显示、输入 |
platform/frameworks/av | 媒体框架(media codecs/camera service/audiopolicy) | 媒体、相机 |
platform/art | ART 运行时(编译器、GC、解释器) | 16 的 ART 内部变更 |
platform/system/core | init、ueventd 等系统原语 | 开机第一步 |
platform/system/server | 监听/日志等基础服务 | init 之后的桥 |
platform/hardware/interfaces | HAL(AIDL/HIDL)定义 | 相机/传感器/蓝牙 HAL |
platform/packages/apps/Settings | 设置应用 | 找「功能入口」时最常翻的 app |
三、frameworks/base 逐块导览
约定:
$B=frameworks/base仓库根;「读什么」列给入口文件/包,细节跟调用链走。
| 目录($B/…) | 装了什么 | 读什么/典型入口 |
|---|---|---|
core/java/ | 面向应用的 Java 框架:android.app、android.view、android.os… | Activity.java、ViewRootImpl.java(输入与绘制汇聚点)、Message.java/Looper(Handler 三件套) |
core/java/android/app/ | 应用侧核心类(Activity、ActivityThread、Service…) | ActivityThread.main():应用进程第一帧;Activity 生命周期派发 |
core/java/android/os/ | Binder/Handler/SystemService 客户端 | ServiceManager.java、SystemServer.java(代理) |
core/java/android/view/input 相关 + core/java/android/hardware/input | 输入事件对象层 | InputEvent.java、MotionEvent.java |
services/core/java/com/android/server/ | system_server 全部系统服务 | 按子包分域,下表展开 |
services/core/java/com/android/server/am/ | ActivityManagerService 家族、进程/广播/ANR | ActivityManagerService.java、BroadcastQueue/ProcessList;16 广播优先级钳制在这里 |
services/core/java/com/android/server/wm/ | WindowManagerService 家族、窗口/任务/显示 | WindowManagerService.java、ActivityRecord/Task;16 大屏忽略方向逻辑在这带 |
services/core/java/com/android/server/pm/ | PackageManager、权限、组件解析 | PackageManagerService、intent 解析(Safer Intents 关键词 enforceIntentFilter) |
services/core/java/com/android/server/input/ | InputManagerService(Java 侧) | 与 frameworks/native 的 InputReader/InputDispatcher 接力 |
services/core/java/com/android/server/job/ | JobSchedulerService | 16 配额/stop reason 落点 |
services/core/java/com/android/server/notification/ | 通知服务 | 通知渲染/权限;ProgressStyle 配套服务端 |
services/core/java/com/android/server/policy/ | 权限授予/撤销(权限策略在 base 内多域分布) | permission 子包(以 cs 搜索为准,包位有重组史) |
graphics/java/android/graphics/ | 图形 Java 层(颜色、路径、渲染对象) | RenderNode、颜色/效果(AGSL 的 RuntimeShader/16 新 RuntimeColorFilter 在 android.graphics 系) |
media/java/ | 媒体 Java API(MediaPlayer、MediaStore 等) | MediaStore(16 版本锁定) |
keystore/java/ | Keystore Java 层 | 16 新 KeyStoreManager |
location/java/ | 定位框架 | 16 RangingManager 相关接入点 |
wifi/ telephony/ nfc/ bluetooth* | 各连接子系统 Java 层 | 蓝牙配对状态机入口在 telephony 外的蓝牙服务(部分逻辑在 com.android.server.bluetooth 系,搜索定位最快) |
cmds/ | 命令行工具(app_process、cmd 等) | app_process:Zygote fork 出的应用进程骨架 |
api/ | 当前 API 基线(current.txt) | 与官方 API diff 互证「某 API 哪个版本进基线」 |
packages/(base 内) | 框架自带小系统应用(如 SettingsProvider) | 配置值持久化入口 |
tests/ | CTS 之外的框架自测用例 | 想看「官方认为的正确行为」时,测试用例是最诚实的文档 |
libs/ | 框架内嵌库(hwui 等渲染库曾在此,组件化迁移频繁) | 以 cs 搜索 hwui 实时定位为准,别背旧路径 |
读表方法:先用 tools/02 的 dumpsys 在实机上找到服务的运行时形态,再回表找编译期位置——「运行时名字 → 源码包」的映射背熟了,读码就从寻宝变成通勤。
system_server 怎么起:services/java/com/android/server/SystemServer.java 的 startBootstrapServices()/startCoreServices()/... 按等级拉起全部服务——这是「Framework 从哪开始存在」的单一答案;它 fork 自 Zygote,Zygote 由 init 启动(/docs/core/architecture 启动序列一致)。
四、输入与图形两条线各在哪(新手最常迷路)
- 输入链:事件从驱动来(kernel)→
frameworks/native/services/input(InputReader/InputDispatcher,native)→frameworks/base/services的InputManagerService分发 → 应用侧ViewRootImpl/InputEventReceiver→View树。记住:分发策略在 native,应用回调在 base。 - 图形链:应用 Canvas/RenderThread(hwui,
frameworks/base图形栈与frameworks/native的 GUI 库)→SurfaceFlinger(frameworks/native/services/surfaceflinger)合成 → HAL(hardware/interfaces/graphics|composer)。16 的 AGSL 新类在应用框架侧,渲染执行在 Skia/hwui。 - 两条链的交汇点是
ViewRootImpl:输入合成与绘制调度都汇在它——读 framework 中期的最佳精读点。
五、cs.android.com:跨仓搜索的正确姿势
cs.android.com 是 Google 托管的 AOSP 代码浏览器,支持全仓搜索与版本切换。实操技巧:
- 先切 ref:右上角分支/标签选择器切到
android16-release或具体 tag,再搜——默认main上的代码可能包含未发布内容。 - 搜索语法(与 Google 代码搜索同源):
file:WindowManagerService.java setRequestedOrientation:限定文件名;lang:Java addLabeledBy:限定语言;path:services/core removeLaunchSecurityProtection:限定目录;- 引号精确匹配、
case:控制大小写。
- 验 16 行为的三板斧:搜行为变更页给出的关键字(如
UNIVERSAL_RESIZABLE_BY_DEFAULT、RESTRICT_LOCAL_NETWORK、STOP_REASON_TIMEOUT_ABANDONED),直接命中实现与常量定义点;再点「描述」链上溯调用方。 - 从文档到代码:API 参考页点「view source definitions」跳 cs;cs 页面顶部的仓库/路径面包屑反推包结构。
- cs 是只读镜像:不支持跨版本 diff UI,diff 走本地 git(§六)。
搜不到时的排查序:ref 没切对(main 上未合入/老分支已移除)→ 关键字来自文档措辞而非代码措辞(换驼峰常量名、去前缀)→ 实现根本不在该仓(去 frameworks/native、art、packages/modules 找)→ 最后才怀疑「未开源」。
六、跨版本 diff:从「两版差什么」到「为什么这么改」
方法 A:本地 git 对线(最可靠)
bash
cd frameworks/base
git fetch --tags # 全量镜像或浅历史需相应加深
git ls-remote origin 'refs/tags/android-16*' # 列发布 tag(远端支持时)
git diff android-15.0.0_r1 android-16.0.0_r1 -- services/core/java/com/android/server/am/
git log --oneline android-15.0.0_r1..android-16.0.0_r1 -- <file>浅克隆(depth=1)没有历史,做 diff 前先 git fetch --unshallow(或加深 depth)。
不便本地化时,android.googlesource.com 每个仓库都带 +log 网页历史(如 .../platform/frameworks/base/+log/android16-release/services/core/java/com/android/server/wm/),按目录翻提交记录同样能做「谁改了这块」的考古,只是没有并排 diff 直观。
方法 B:行为清单反推 diff 范围——把本站 01/02 两页 的行为变更当 diff 需求单:每项拿关键词去 diff 里验证实现位置(如配额→job 包、广播→am 包、LNP→network 栈与 SEPolicy)。
方法 C:API diff 官方口径——api_diff/36 列对外 API 增删改;先圈公共 API 面变化,再去源码找实现,性价比最高。
三个习惯:diff 前先 git log 看提交说明(AOSP commit message 常带 issue 号,能挖到设计讨论);不要整树对整树,按目录切片;版本对齐用 tag,不用分支头。
七、AOSP 与厂商魔改:读码人的现实观
- AOSP 是地基不是成房:厂商(含 GMS 认证设备)在 AOSP 上叠加:自有 framework patch(frameworks/base 的 vendor 分支)、RRO/overlay 资源覆盖、
vendor/分区 HAL 与device/、vendor/配置仓、独立应用套件。AOSP 行为 ≠ 你手上机型行为,16 行为变更页也明说蓝牙 intent 等存在 OEM 实现差异。 - CTS/VTS 是边界:GMS 设备必须过兼容性测试,厂商可以加料但不能改公共 API 契约——所以「AOSP 源码 + 公共 API」仍是理解任何定制机的最大公约数。
- 辨认厂商改动的实用手法:
dumpsys <service> | head看版本串/厂商字段;getprop | grep厂商前缀(ro.product.*等)定位分支;- 对可疑行为先回 AOSP 同版本 tag 对照(§六方法 B),AOSP 里没有的逻辑即厂商层;
- 部分厂商公开源码(kernel/专有 wrapper),入口在其开发者站,按品牌自查。
- 学习姿势建议:主线永远读 AOSP 官方分支;遇到厂商差异时开一个对照笔记(现象 → AOSP 期望 → 实机行为),攒多了就是你的「碎片化生态地图」,这比追任何单一 ROM 源码都保值。
另一个实用视角是版本三线合一:设备镜像版本(Android 16 / build 号)、组件版本(dumpsys package modules)、你的源码 ref(tag)。三线没对齐就读不出「为什么行为不一样」,这也是 06 页 §九 Mainline 话题在源码侧的镜像问题。
八、导航速查:接下来读什么
| 你想回答的问题 | 去读 |
|---|---|
| 应用进程怎么活过来的 | ActivityThread → handleBindApplication → ContentProvider/Activity 生命周期派发 |
| 一次点击怎么到 onClick | §四 输入链,从 InputDispatcher 到 ViewRootImpl |
| 一次 startActivity 发生了什么 | ActivityManagerService(am/)的 ActivityStarter/Task 体系 |
| 窗口为什么长这样 | wm/:WindowState、布局 pass、insets(配合 02 页 edge-to-edge) |
| Binder 为什么快/慢 | frameworks/native/libs/binder + frameworks/base/core/java/android/os/Binder |
| 16 的某条行为变更 | 回 a16 00 页 §六 的「源码落点速查」表 |
| 通知为什么没弹 | services/core/java/com/android/server/notification/ + dumpsys notification(tools/02) |
| 权限为什么被拒 | pm/、permission/ 包 + adb shell dumpsys package <pkg> 授权态 |
系统化的阅读顺序(先哪层后哪层、书与课)见 tools/03 学习路径。
本页小结
本页小结:拿 AOSP 源码的最优解是先明确目的——查码用 cs.android.com(切对分支/标签 + 文件/语言/路径过滤器),读层用单仓浅克隆(frameworks/base 永远是最厚的那本),全量 repo 只留给真要编译的人。frameworks/base 的地图记三件事:
core/java是应用可见层、services/core/java/com/android/server是 system_server 全部、输入/图形的另一半在 frameworks/native。跨版本演进用「tag diff + API diff + 行为变更关键词」三件套;对待厂商魔改,用 AOSP 当基线做对照,不背任何 ROM。
参考资料
- AOSP 下载要求与 repo init(官方):https://source.android.google.cn/docs/setup/start/requirements
- 构建 AOSP(官方):https://source.android.google.cn/docs/setup/build/building
- AOSP 平台架构总览:https://source.android.google.cn/docs/core/architecture
- AOSP 16 KB 页兼容模式专文:https://source.android.google.cn/docs/core/architecture/16kb-page-size/16kb-backcompat-option
- Companion app streaming(VDO):https://source.android.google.cn/docs/core/permissions/app-streaming
- AOSP 源码仓入口:https://android.googlesource.com/platform/manifest
- 代码搜索 cs.android.com:https://cs.android.com
- API 差异报告 36:https://developer.android.google.cn/sdk/api_diff/36/changes
- 清华 TUNA 镜像帮助首页(页内检索 AOSP 条目):https://mirrors.tuna.tsinghua.edu.cn/help/
- Android 16 特性/行为变更入口:https://developer.android.google.cn/about/versions/16/features
(目录结构随版本演进会挪窝:本页给出的是 15/16 时代常见形态,动手前用 cs.android.com 搜类名定位实际路径,永远比背目录可靠。)
(本页与 tools/02 调试工具链、tools/03 学习路径 组成工具三篇,建议连读。)