Android Code search 用法简介

做 Android 开发有时免不了要看系统源码。在 Android Studio 中关联上 SDK 源码后,我们可以从 App 工程一路跟踪到 SDK public API 的源码,但没法进一步往下看代码。当然,通常看到 SDK public API 的源码就够了,能给我们解决提供线索。但想进一步了解底层机制,该如何看代码?

不要下载 AOSP!

最容易想到的办法就是把 AOSP 代码下载下来本地看。但这不是个好办法。AOSP 中包含上千个仓库,它太庞大以至于需要用 repo 来专门管理代码库。这是我本地 android-14.0.0_r28 分支代码编译后的情况:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
~/aosp$ du -h --max-depth=1
106M ./libcore
2.0G ./frameworks
146G ./.repo
1.9G ./cts
53G ./prebuilts
103M ./art
2.2G ./packages
832M ./tools
65M ./bionic
1.6G ./kernel
17M ./bootable
4.0K ./trusty
443M ./developers
380M ./test
252G ./out
13G ./external
26M ./dalvik
592K ./libnativehelper
256M ./hardware
181M ./development
7.5G ./device
896K ./pdk
36M ./build
276M ./platform_testing
669M ./system
12M ./sdk
99M ./toolchain
481G .

占用了 481G 的磁盘空间!

我折腾过一次感觉无论是使用 IDEGen 还是 AIDEGen 方案,都太耗时了(Ubuntu 上编译源码耗时就超过6小时)。

  • 首先,你得有一台 Ubuntu 机器
  • 这台机器有足够的磁盘空间
  • 你有足够的耐心去配置环境、编译系统
  • 如果你平常是用 Mac 机器做应用开发,还得远程访问 Ubuntu 并且保证使用体验

总的来说,IDEGen 和 AIDEGen 更适合作为 Android 系统开发者的工具,对 Android 应用开发者来说它们太重了。相信我,你很有可能会放弃的。

Android 应用开发者看 AOSP 源码,无非就是想快速找到感兴趣的相关代码,通常并不需要修改系统代码。所以真正的痛点其实是代码检索代码跳转

这里推荐两个方式:

  • 一个是使用 OpenGrok。OpenGrok 是一个开源软件,支持快速搜索代码。如果愿意折腾,可以在本地部署 OpenGrok;如果懒得折腾,直接使用 XRefAndroid - Support AOSP 15.0 AndroidXRef & OpenHarmony 5.0 就行,它背后也是 OpenGrok
  • 另一个就是直接使用 Android 官方提供的 Android Code search。这个工具具体的上线时间不清楚,可能是 2022 年左右吧。

Android Code search 的主要功能正好可以满足 Android 应用开发者的痛点:

Android Code Search makes it easy to navigate cross-references across all of AOSP by letting you to click through one part of the source code to another.

举个例子。我们在 Android Studio 中可以打开 ActivityManager 源码,但继续跟踪 ServiceManager 代码时就没法点进去了。

先看代码检索功能。我们在 Android Code search 中搜索 ServiceManager.getService 就行了。一两秒就能出结果:

点进去就能直接定位到相应的方法:

再看代码跳转功能。如果仓库开启了交叉引用,我们可以通过点击链接就能跳转到对应的符号。

基本上,只用代码检索代码跳转就能满足大部分 Android 应用开发者看系统源码的需求了。更多使用技巧可以参考官方使用手册 Google 代码搜索使用入门  |  Code Search  |  Google for Developers

参考