Skip to content

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.com0
读 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/nativeBinder 驱动用户态、SurfaceFlinger、InputFlinger跨进程、显示、输入
platform/frameworks/av媒体框架(media codecs/camera service/audiopolicy)媒体、相机
platform/artART 运行时(编译器、GC、解释器)16 的 ART 内部变更
platform/system/coreinit、ueventd 等系统原语开机第一步
platform/system/server监听/日志等基础服务init 之后的桥
platform/hardware/interfacesHAL(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 家族、进程/广播/ANRActivityManagerService.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/JobSchedulerService16 配额/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」仍是理解任何定制机的最大公约数。
  • 辨认厂商改动的实用手法:
    1. dumpsys <service> | head 看版本串/厂商字段;
    2. getprop | grep 厂商前缀(ro.product.* 等)定位分支;
    3. 对可疑行为先回 AOSP 同版本 tag 对照(§六方法 B),AOSP 里没有的逻辑即厂商层;
    4. 部分厂商公开源码(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。

参考资料 ​

(目录结构随版本演进会挪窝:本页给出的是 15/16 时代常见形态,动手前用 cs.android.com 搜类名定位实际路径,永远比背目录可靠。)

(本页与 tools/02 调试工具链、tools/03 学习路径 组成工具三篇,建议连读。)

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