使用OpenGrok部署一套AOSP源码审计站点

一、背景

  做 Android 逆向、系统分析或者漏洞审计的时候,经常需要在大体量源码里快速定位类、方法、调用链和符号定义。单纯依赖本地 IDE 虽然也能看代码,但面对 AOSP 这种规模的工程,索引、跳转、跨模块检索和网页分享都不够方便。

  OpenGrok 是一套源码索引和检索系统,比较适合给 AOSP 这类大型源码仓库建立一套在线源码审计站点。这样做的好处主要有几点:

  1. 可以快速全文检索类名、方法名、字符串常量和路径。
  2. 可以在网页里直接查看定义和引用,适合做源码审计记录。
  3. 可以给多台机器或多人共享,不依赖每个人本地都拉完整源码。
  4. 对超大项目比普通文本检索更友好,结构化能力更强。

二、部署思路

  这篇文章不走传统的 Java + Tomcat 手工部署路线,而是直接使用 Docker 部署 OpenGrok。整个流程可以拆成三步:

  1. 准备 Docker 环境和 OpenGrok 的挂载目录。
  2. 使用 repo 同步 AOSP 源码。
  3. 启动 OpenGrok 容器并为 AOSP 建立索引。

  这样做的好处是环境更干净,迁移也更方便。后面如果要换机器,只需要把源码目录和索引目录带走,再重新起容器就可以。

三、环境准备

1、机器配置

  OpenGrok 本身不算重,但 AOSP 很大,所以真正吃资源的是源码同步和首次全量索引。建议至少准备下面这些资源:

  1. Linux 服务器一台。
  2. 16G 以上内存,内存越大索引过程越舒服。
  3. 8 核以上 CPU,首次索引会快一些。
  4. 足够大的磁盘空间,完整 AOSP 源码和索引数据加起来占用不小。

  如果只是本地测试,配置低一点也能跑;但如果准备长期使用,建议直接上 SSD,不然同步和索引都会比较折磨。

2、安装环境

  • Ubuntu 22.04
  • Docker
  • Git
  • Python3
  • repo 工具

安装 Docker:

1
2
3
4
sudo apt update
sudo apt install -y docker.io
sudo systemctl enable docker
sudo systemctl start docker

安装基础依赖:

1
sudo apt install -y git curl python3

安装 repo:

1
2
3
4
5
mkdir -p ~/bin
curl https://storage.googleapis.com/git-repo-downloads/repo -o ~/bin/repo
chmod a+x ~/bin/repo
echo 'export PATH=$HOME/bin:$PATH' >> ~/.bashrc
source ~/.bashrc

注意事项:

  1. repo 不是 git clone 的别名,它是 AOSP 官方多仓库管理工具。
  2. 如果服务器网络环境比较一般,首次同步 AOSP 可能会很慢,甚至中途失败,重试是正常现象。

3、目录规划

建议先把目录规划好:

1
2
mkdir -p ~/workspace/aosp
mkdir -p ~/opengrok/{src,data,etc}

目录说明:

  1. ~/workspace/aosp:存放 AOSP 源码。
  2. ~/opengrok/src:给 OpenGrok 挂载的源码目录。
  3. ~/opengrok/data:OpenGrok 索引数据目录。
  4. ~/opengrok/etc:OpenGrok 配置目录。

  为了避免重复占空间,后面可以直接把 ~/workspace/aosp 挂到容器里当源码目录使用,不需要再额外拷贝一份。

四、同步 AOSP 源码

  AOSP 代码仓库不是一个单独的 Git 项目,而是一组由 manifest 管理的仓库集合。所以同步 AOSP 的标准姿势,是先 repo init,再 repo sync

1、初始化源码仓库

1
2
cd ~/workspace/aosp
repo init -u https://android.googlesource.com/platform/manifest -b android-14.0.0_r34 --depth=1

这里的几个参数意思比较直观:

  1. -u:指定 manifest 仓库地址。
  2. -b:指定 AOSP 分支或 tag。
  3. --depth:下载当前分支的最新提交

  如果你审计的是 Android 13、Android 12 或者厂商基线,就把 -b 后面的版本换成你自己的目标版本。

2、开始同步源码

1
2
cd ~/workspace/aosp
repo sync -c -j$(nproc) --no-tags --no-clone-bundle

参数说明:

  1. -c:只同步当前分支,减少无关历史。
  2. -j$(nproc):8 个并发线程同步,可以按机器性能调整。
  3. --no-tags:不下载 git tags,进一步压缩体积。
  4. --no-clone-bundle:不使用预打包的克隆包,直接进行流式下载,在某些网络环境下更稳定。

注意事项:

  1. 完整 AOSP 源码体积很大,第一次同步之前一定要先看磁盘空间。
  2. 首次同步耗时很长,卡住一段时间不代表一定出问题。
  3. repo sync 中途中断后,重新执行同一条命令继续同步就可以。
  4. 如果只是做某个版本的源码审计,最好一开始就把版本选准,避免来回切分支重新拉。

3、给 OpenGrok 准备源码挂载

如果你打算直接把 AOSP 源码目录挂载给 OpenGrok,可以创建一个软链接,统一路径也方便后续维护:

1
ln -s ~/workspace/aosp ~/opengrok/src/aosp

这样后面 OpenGrok 就可以直接索引 ~/opengrok/src/aosp 这套源码。

五、使用 Docker 部署 OpenGrok

1、拉取镜像

1
sudo docker pull opengrok/docker:latest

2、启动 OpenGrok

1
2
3
4
5
6
7
sudo docker run -d \
--name opengrok \
-p 8080:8080 \
-v ~/opengrok/src:/opengrok/src \
-v ~/opengrok/data:/opengrok/data \
-v ~/opengrok/etc:/opengrok/etc \
opengrok/docker:latest

这几个参数比较关键:

  1. -p 8080:8080:把 OpenGrok Web 服务暴露到宿主机 8080 端口。
  2. -v ~/opengrok/src:/opengrok/src:挂载源码目录。
  3. -v ~/opengrok/data:/opengrok/data:挂载索引数据目录。
  4. -v ~/opengrok/etc:/opengrok/etc:挂载配置目录。

注意事项:

  1. 源码目录和索引目录最好都做持久化挂载,不要只放在容器里。
  2. 删除容器不会删除挂载目录里的数据,所以后期迁移会方便很多。
  3. 如果 8080 端口被占用,可以改成 -p 8090:8080 这种方式。

3、查看容器状态

1
2
sudo docker ps
sudo docker logs -f opengrok

  容器正常启动之后,后面就可以开始建立索引。

六、构建 AOSP 索引

  索引是整套流程里最核心的一步。AOSP 体量大,第一次全量索引通常会比较耗时,这一步对 CPU、内存和磁盘 I/O 都比较敏感。

1、执行索引命令

1
2
3
4
5
6
sudo docker exec -it opengrok /opt/opengrok/bin/OpenGrok index \
-s /opengrok/src/aosp \
-d /opengrok/data \
-W /opengrok/etc/configuration.xml \
-H -P -S -G \
-U http://127.0.0.1:8080/source

几个关键参数:

  1. -s:源码目录。
  2. -d:索引数据目录。
  3. -W:输出配置文件。
  4. -U:指定 Web 访问路径,便于后面页面加载配置。

  不同镜像版本的 OpenGrok 命令参数可能会有细微差异,如果遇到报错,建议顺手看一下容器内的帮助信息:

1
sudo docker exec -it opengrok /opt/opengrok/bin/OpenGrok index --help

2、观察索引过程

1
sudo docker logs -f opengrok

  第一次索引 AOSP 需要比较长时间,期间重点看这几件事:

  1. ~/opengrok/data 目录是否持续生成索引文件。
  2. 日志里是否有权限错误。
  3. 容器是否因为内存不足被系统杀掉。

3、访问页面验证

索引完成后,浏览器访问:

1
http://服务器IP:8080/source

可以先搜索几个 AOSP 里常见的关键字测试一下:

  1. SystemServer
  2. PackageManagerService
  3. ActivityManagerService

  如果能够正常搜索、点进定义、继续查看引用关系,就说明这套源码审计站点已经能用了。

七、AOSP 更新后的同步与重建索引

  OpenGrok 建好之后,不代表以后就不用管了。只要 AOSP 源码更新了,就需要重新同步并更新索引。

1、同步最新源码

1
2
cd ~/workspace/aosp
repo sync -c -j8

2、重新执行索引

1
2
3
4
5
6
sudo docker exec -it opengrok /opt/opengrok/bin/OpenGrok index \
-s /opengrok/src/aosp \
-d /opengrok/data \
-W /opengrok/etc/configuration.xml \
-H -P -S -G \
-U http://127.0.0.1:8080/source

  如果只是自己内部用,最简单可靠的方案,就是每次 repo sync 之后重新跑一遍索引。后面如果更新频率高,再考虑定时任务或者增量索引。

八、常见问题与注意事项

  1. 源码太大:完整 AOSP 同步和索引都很耗时,要有心理准备。
  2. 磁盘占用高:源码和索引数据加起来会比较可观,最好提前分盘规划。
  3. 容器权限问题:如果挂载目录权限不对,索引时容易报权限错误。
  4. 版本选择问题:不同 Android 大版本最好分开目录、分开站点,后续检索不容易串。
  5. 厂商源码管理:厂商 ROM 和 AOSP 原版最好分开建站,方便做差异对比。
  6. 索引时间长:第一次全量索引很慢,不建议边同步边索引,最好等源码稳定后再一次性建索引。

九、结尾

  以上,就是使用 Docker 部署一套 AOSP OpenGrok 源码审计站点的基本流程。整体思路不复杂,关键就是两件事:先把 AOSP 源码按版本同步好,再把 OpenGrok 的源码目录、索引目录和访问路径规划清楚。

  后面如果还要继续完善,可以再补 Nginx 反向代理、鉴权、定时同步和多版本源码分站这些内容。对于日常源码审计、逆向分析和团队共享来说,这套方案已经足够用了。

Donate
  • Copyright: Copyright is owned by the author. For commercial reprints, please contact the author for authorization. For non-commercial reprints, please indicate the source.
  • Copyrights © 2015-2026 Kaisar
  • Visitors: | Views:

请我喝杯咖啡吧~

支付宝
微信