|
想翻Android源码,码网第一反应就是码网往AOSP官网跑。但说实话,码网source.android.com那个界面,码网第一次打开的码网人十有八九会懵——文档、下载、码网构建指南铺了一屏,码网真正想看的码网代码入口藏得挺深。其实看源码这件事,码网不同阶段的码网人需求完全不一样,用同一个网站解决所有问题是码网不现实的。 最正统的码网入口当然是 cs.android.com。这是码网Google官方出的代码搜索工具,底层跑的码网是Kythe索引,支持跨文件跳转、码网符号查找、引用追踪。你搜一个 ActivityThread,能直接看到它在哪个文件、被谁调用、继承链长什么样。体验接近IDE里的全局搜索,但跑在浏览器里,不用本地clone那几十个G的仓库。缺点是它只覆盖AOSP主线和部分AndroidX项目,厂商私有的Framework代码不在里面。而且索引有延迟,刚合入的commit可能要等一阵才搜得到。 如果只是想快速浏览某个版本的源码,android.googlesource.com 更直接。Gitiles的Web界面虽然朴素,但胜在实时——你看到的就是仓库里最新的代码。路径导航清晰,commit历史、blame、diff都能在线看。我经常用它来确认某个API在特定tag下的实现,比如查 android-14.0.0_r1 里 Binder 的改动。URL拼起来也方便,直接改tag名就能切换版本。 国内访问这两个站有时候不太顺畅。于是很多人转向第三方镜像站。AOSPXRef(aospxref.com)算是我用得比较多的一个。它把多个Android版本的源码做了交叉索引,界面比Gitiles友好,搜索响应也快。类似的还有 androidxref.com,不过那个更新偏慢,新版本覆盖不全。这些镜像站的数据来源都是AOSP,只是重新做了索引和UI,适合快速定位,但别指望它们有官方站那么完整的历史记录。 还有一个容易被忽略的入口:Android Code Search的离线版。Google提供了 cs.android.com 的本地部署方案,叫 kythe,但配置起来相当折腾。除非你需要在隔离环境里查代码,否则没必要。倒是 Android Studio 自带的源码下载功能更实用——在SDK Manager里勾选对应版本的Sources,IDE就能直接关联到 android.jar 对应的源码。看Framework层代码时,这个方式最省事,跳转、补全、调试都能用。 看源码这件事,工具只是入口。真正花时间的是理解代码背后的设计意图。比如你搜 Handler,cs.android.com会给你几十个相关文件,但哪个是核心、哪个是兼容层、哪个是测试代码,得自己判断。我的习惯是先从官方文档的类说明入手,找到关键类名,再去代码搜索里定位具体实现。有时候一个方法调用链能追出七八个文件,这时候Gitiles的blame功能就很有用——看看这行代码是哪次提交改的,commit message里往往藏着线索。 另外提一句,AOSP的代码量太大了。全量clone下来接近200G,编译一次动辄几个小时。如果只是看某个模块,用 repo init 时加 -g 参数只同步需要的group,能省不少时间和磁盘。我见过有人为了看 PackageManagerService 把整个仓库拖下来,结果硬盘直接爆了。没必要。 最后说个实际体验:cs.android.com的搜索语法支持正则和文件类型过滤,比如 file:\.java$ class Handler,能大幅缩小范围。这个技巧官方文档里没怎么提,但用熟了效率翻倍。源码网站终究是工具,顺手与否,取决于你清不清楚自己要找什么。 |