出于调试Android Framework代码的原因,需要下载和编译AOSP。
经过一些摸索,找到一些可靠的实践方案,在此记录下来。

前提

  1. 由于本人目前的OS是openSUSE,因此下文的命令都是基于openSUSE。
  2. 考虑到目前的网络状况,推荐使用国内镜像来安装相关工具和下载源码。
  3. 经过数次尝试,觉得中科大的镜像好用一些,本文采用中科大的镜像。
  4. AOSP源码最少也有180G ,所以下载之前需要先准备一个容量足够大的空间。

安装repo + git

AOSP使用repo和git共同管理仓库,其中git作为子模块的版本管理工具,repo则用于统领全局,它负责统一管理AOSP仓库及其所有子模块。

# 安装git
sudo yzpper in -y git

# 安装repo
mkdir ~/bin
PATH=~/bin:$PATH
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
## 如果上述 URL 不可访问,可以用下面的:
## curl -sSL  'https://gerrit-googlesource.proxy.ustclug.org/git-repo/+/master/repo?format=TEXT' |base64 -d > ~/bin/repo
chmod a+x ~/bin/repo

下载源码

cd ~/codes
mkdir aosp
cd aosp
repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest
# 如果你想直接定位到某个分支,可以这样:
# repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-4.0.1_r1
repo sync
# 接下来是漫长的等待...

构建编译环境

考虑到8.1 是一个比较旧的版本,而且我使用的openSUSE跟官方推荐的Ubuntu有较大差别,一些编译所需的依赖可能不太容易解决,因此我选择使用Docker 构建编译环境。

在比较新的AOSP源码中,AOSP本身也提供了一份用于构建编译环境的Dockerfile,位于:build/tools/docker

经测试该Dockerfile构建出来的镜像可顺利编译旧版本的AOSP。

# 设置git user,编译时会用
git config --global user.email "xxx@xxx.com"
git config --global user.name "April"
cp ~/.gitconfig gitconfig

# Build docker Image,请提前安装好Docker
docker build --build-arg userid=$(id -u) --build-arg groupid=$(id -g) --build-arg username=$(id -un) -t android-build-trusty .

切换分支

我在这里走了一些弯路,
我一开始试图使用下面的命令来切换分支,结果切换出来大有问题

# 这是不对的
repo forall -c "git checkout android-security-11.0.0_r57"

正确的分支切换方式是这样:

# 如果在第一步下载代码的时候就指定了期望的分支,这里就可以省略
repo init -b android-8.1.0_r52
repo sync

我手里仅有一台Nesus 6P真机,最高只能编译8.1版本,因此我将分支切到8.1。

如果需要切换到其他分支,可以参考Google 给出的这个清单

AOSP 分支列表

AOSP 设备清单:https://source.android.com/setup/start/build-numbers?hl=zh-cn

下载设备驱动

一些设备驱动是通过闭源的方式提供的,因此需要单独下载,并放入源码对应的目录中。

可以在这个列表中找到设备对应的驱动:
图片-1659235518271

设备驱动列表:https://developers.google.com/android/drivers?hl=zh-cn#angleropm7.181205.001

下载完毕后,解压文件后可以得到一个bash脚本。
把这个脚本copy到aosp源码根目录,并执行一次即可。

编译

一切准备就绪之后就可以开始编译啦。

# 以交互的方式run刚才build出来的Docker镜像
# 需要将/home/aprilz/codes/aosp替换为你自己的路径
docker run -it --rm -v /home/aprilz/codes/aosp:/src android-build-trusty

# 下面这些命令都是在容器中执行的:
# 切换到AOSP目录
cd /src

# 初始化编译命令
source build/envsetup.sh

# 选择编译目标
# 不同的设备有不同的编译目标,请参考:https://source.android.com/setup/build/running?hl=zh-cn#selecting-device-build
# 编译目标后缀的含义是:
# user 权限受限;适用于生产环境
# userdebug 与“user”类似,但具有 root 权限和调试功能;是进行调试时的首选编译类型
# eng 具有额外调试工具的开发配置
lunch aosp_angler-eng

# 执行编译
m
#  开始漫长的等待...

# 编译命令结束后,退出容器
exit

刷机

将刚才编译出来的系统镜像写到真机中,后面基于这台设备来调试Framework的时候就不会出现断点位置对不上的情况了。

cd ~/codes/aosp
source build/envsetup.sh

# 使设备重启进入bootloader模式
adb reboot bootloader 

# 解锁,如果已解锁可忽略这一步
fastboot flashing unlock

# 刷写系统,并执行双清
fastboot flashall -w

# 一切顺利的话设备会自动重启,开机就是新系统了

参考资料

https://source.android.com/setup/start/build-numbers?hl=zh-cn#usecase-codename-references-and-resources

https://source.android.com/setup/build/building?hl=zh-cn#understanding-build-fingerprints

https://source.android.com/setup/build/running?hl=zh-cn#building-fastboot-and-adb

https://android.googlesource.com/platform/build/+/master/tools/docker

https://mirrors.ustc.edu.cn/help/aosp.html