测试环境搭建:Android源代码下载、编译、模拟器配置

要做 AOSP 测试 Mock 回放,你首先得有一套能跑起来的 AOSP 环境。这活儿我干了好几年,坦白讲,光是下载 + 编译就劝退过不少人。但别怕,我把踩过的坑一个个列出来,你照着来就好。

2.1 环境准备——硬件和软件的最低要求

先聊聊硬件。我个人的经验是——千万别在 8GB 内存的机器上尝试完整编译 AOSP。我在项目初期就吃过这个亏,编译到一半直接 OOM,系统卡死。你至少需要:

  • 内存:16GB 起步,32GB 更稳
  • 磁盘:SSD,至少 250GB 可用空间(下载源码 + 编译产物需要 150GB 左右)
  • CPU:4 核以上,8 核最好
  • 操作系统:Ubuntu 20.04 或 22.04 LTS,我推荐 22.04
小技巧:如果你跟我一样用 WSL2,记得把虚拟内存上限调到 32GB,否则编译时内存扛不住。

2.2 下载 AOSP 源代码

AOSP 用的是 Google 的 repo 工具,本质上是对 git 的多仓库管理。你不需要理解太深,会敲命令就行。但我建议你先搞清楚一件事——你下载的分支。我一般用 android-13.0.0_r41(对应 Android 13),稳定且 Mock 回放相关代码齐全。

操作步骤如下:

  1. 安装 repo:
    mkdir ~/bin
    PATH=~/bin:$PATH
    curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
    chmod a+x ~/bin/repo
  2. 创建源码目录并初始化:
    mkdir aosp
    cd aosp
    repo init -u https://android.googlesource.com/platform/manifest -b android-13.0.0_r41
  3. 开始下载:
    repo sync -c -j8

-j8 是并行下载线程数,根据你 CPU 核心数来。我之前试过 -j16 结果把公司的代理服务器搞崩了……建议先 8 线程稳一点。

注意:如果你在国内,下载 AOSP 基本是噩梦。我建议用清华镜像或中科大镜像。把 repo init 的 URL 换成:
https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest

下载完成后,你会得到一个约 40GB 的 .repo 目录。别急着高兴,这只是第一步。

2.3 编译 AOSP 镜像

编译前你要选目标设备。我们是写测试 Mock 回放的,通常用 aosp_arm64 或 aosp_x86_64。我个人习惯用 aosp_x86_64,因为模拟器跑起来快。

先设置环境:

source build/envsetup.sh

然后选择编译目标:

lunch aosp_x86_64-eng

这里 -eng 表示 engineering 版本,自带 root 权限,方便调试。如果你做 CTS 测试,可能要用 -userdebug。但 Mock 回放大多数情况 -eng 就够了。

接下来就是漫长的编译:

make -j$(nproc)

nproc 是获取 CPU 核数,我建议留一个核给系统用,比如 make -j$(($(nproc)-1))。否则你编译的时候电脑基本上干不了别的。

首次编译时间?我记得在 i7-10750H + 32GB 内存的笔记本上,大约花了 2 小时 40 分钟。但别急,后面增量编译就快多了。我最长的一次是第一遍编译,结果因为 Python 版本问题失败了——AOSP 编译环境要求 Python 3.8~3.10,我用的是 Ubuntu 22.04 自带的 3.10,没问题。如果你用 Ubuntu 20.04,记得检查 Python 版本。

避坑指南:我曾经在 Ubuntu 18.04 上试着编 AOSP 13,结果因为 gcc 版本过低直接报错。后来我统一用 Docker 环境,把编译环境容器化。推荐使用 Google 官方 Docker 镜像(注意不要用外链,这里是文字说明,实际教学时你可以提到)。但现在你跟着我用 Ubuntu 22.04 手动搭,也能一次过。

2.4 配置模拟器

编译成功后,你会在 out/target/product/generic_x86_64/ 下看到 system.img、userdata.img、ramdisk.img 等文件。有了这些,就能启动模拟器了。

启动方法非常简单:

emulator -avd MyAVD
# 或者直接用编译出来的镜像
emulator -system out/target/product/generic_x86_64/system.img -data out/target/product/generic_x86_64/userdata.img -ramdisk out/target/product/generic_x86_64/ramdisk.img

但注意,首次启动前你需要先创建一个 AVD(Android Virtual Device)。推荐用命令行:

avdmanager create avd -n MyAVD -k "system-images;android-33;google_apis;x86_64" -d pixel_6

参数说明:

  • -n MyAVD:设备名,随便起
  • -k:指定系统镜像,这里对应 Android 13 API 33
  • -d pixel_6:设备配置,你可以用 avdmanager list device 查看所有可选

我个人习惯先运行 emulator -list-avds 确认有没有创建成功。然后执行 emulator -avd MyAVD -writable-system。为什么要加 -writable-system?因为 Mock 回放经常需要把编译好的测试二进制 push 到 /system 分区,不加这个参数你 remount 会失败。

注意:如果 emulator 启动时报错 Cannot launch AVD in emulator,八成是你的 KVM 没开。检查一下:
kvm-ok 命令,如果提示不支持,去 BIOS 开启虚拟化。我在一台 Dell 工作站上折腾了半天,最后发现 BIOS 里 VT-x 被禁了。

启动成功后,你会看到模拟器界面。运行 adb devices 能看到模拟器已经连上了。这时你可以验证一下编译结果:

adb shell getprop ro.build.fingerprint

输出应该包含你编的版本号。

2.5 完整环境搭建流程总结

AOSP 测试环境搭建流程 阶段一:环境准备 硬件:内存≥16GB,磁盘≥250GB 软件:Ubuntu 22.04 LTS 工具:git, curl, python3 阶段二:下载源码 repo init -b android-13.0.0_r41 repo sync -c -j8 校验:ls .repo/manifests 阶段三:编译镜像 source build/envsetup.sh lunch aosp_x86_64-eng make -j$(nproc) 💡 编译成功后,启动 emulator -avd MyAVD -writable-system 即可测试

2.6 验证环境是否就绪

模拟器启动后,我习惯用三个小命令快速验证:

  1. adb shell whoami —— 输出应为 root(因为我们编的 eng 版本)
  2. adb shell ps -ef | grep system_server —— 看系统服务是否正常
  3. adb reboot —— 模拟器能正常重启,说明编译没问题

如果以上都通过,恭喜你,环境搭好了!后面可以开始写测试代码了。

一点经验:搭建环境是整个教程中最耗时的环节,但有第一次成功经验后,后面做增量编译、单独模块替换都很顺畅。我建议你第一次成功后就给虚拟机或工作区做个快照,以后重来直接恢复,省掉 2 小时。