注意:这篇文章上次更新于329天前,文章内容可能已经过时。
本文记录如何在 Ubuntu 24.04 上编译 AOSP,并使用 Cuttlefish 模拟运行编译好的系统镜像。
在中国想要编译并模拟运行 AOSP,最好首先准备好一个质量不错的代理。因为无论是同步代码还是安装 Cuttlefish,都需要访问一些被屏蔽的服务器。
AOSP(Android Open Source Project) 是 Android 系统的开源版本。
它的中文官网如下:https://source.android.com/?hl=zh-cn
本文的所有工作都是按照官网的教程进行,并记录一些踩坑。
下载 AOSP 源码
安装 Repo 工具
AOSP 项目由很多个 Git 仓库组成,Google 提供了一个名为 Repo 的工具来管理这些仓库。
在 Ubuntu 上安装 Repo 工具的步骤如下:
1 | sudo apt update |
同步代码
创建一个工作目录来存放 AOSP 源码:
1 | $ mkdir -p ~/AOSP |
使用 Repo 初始化工作目录:
1 | $ repo init --partial-clone -b main -u https://android.googlesource.com/platform/manifest |
终端最后输出 repo has been initialized in ~/AOSP 表示初始化成功。
然后就可以开始正式下载 AOSP 源码了:
1 | $ repo sync -c -j8 |
这一步会非常耗时,取决于你的网络速度和代理质量。
短则一个小时,长则几天。
中间可能会因为网络问题导致下载失败,重复执行 repo sync 命令即可继续下载。
安装 Cuttlefish
如果没有物理设备的话,可以使用 Cuttlefish 模拟运行 AOSP。
本节内容的原文在这里: https://source.android.com/docs/devices/cuttlefish/get-started?hl=zh-cn
Cuttlefish 和 Android 模拟器
Cuttlefish 与 Android 模拟器有许多相似之处,但 Cuttlefish 可以保证 Android 框架(无论这是纯 AOSP,还是您自己的树中的自定义实现)实现全保真。在实际应用中,这意味着 Cuttlefish 应该会在操作系统级别响应您的互动,就像使用相同的自定义或纯 Android OS 源代码构建的实体手机目标一样。Android 模拟器围绕简化应用开发的用例构建而成,它包含许多功能钩子来迎合 Android 应用开发者的用例。如果您要使用您的自定义 Android 框架来构建模拟器,这可能会带来一些挑战。如果您需要能够代表您的自定义平台/框架代码或 Android 树形结构的虚拟设备,那么 Cuttlefish 虚拟设备是理想的选择。它是用于表示当前 AOSP 开发状态的规范设备。
Cuttlefish 和物理设备
Cuttlefish 虚拟设备与实体设备之间的主要区别在于硬件抽象层 (HAL) 级别,以及与任何自定义硬件互动的任何软件。除了硬件专用实现之外,您应该会发现 Cuttlefish 和实体设备表现出在功能上等效的行为。
验证 KVM 可用性
Cuttlefish 是一种虚拟设备,依赖于宿主机上可用的虚拟化。
在宿主机上的终端中,确保可以在基于内核的虚拟机 (KVM) 上实现虚拟化:
1 | grep -c -w "vmx\|svm" /proc/cpuinfo |
此命令返回一个大于 0 的数字表示 KVM 可用。
下载、构建并安装 Cuttlefish
- 安装依赖
1 | sudo apt install -y git devscripts equivs config-package-dev debhelper-compat golang curl |
- 下载 Cuttlefish 源码
1 | git clone https://github.com/google/android-cuttlefish |
- 构建 Cuttlefish
1 | tools/buildutils/build_packages.sh |
- 安装 Cuttlefish
1 | sudo dpkg -i ./cuttlefish-base_*_*64.deb || sudo apt-get install -f |
在 Ubuntu 24.04 上,在构建 Cuttlefish 时我遇到了一些问题,都在 AI 的帮助下解决了。
问题一 : bazel 未安装
点击查看报错详情:
1 | The package has been created. |
解决方案: 可以去 https://github.com/bazelbuild/bazel/releases 下载最新的 Bazel 安装包。
问题二 : 缺少 libtinfo5 依赖
点击查看报错详情:
1 | $ tools/buildutils/build_packages.sh |
问题原因是 Ubuntu 24.04(Noble)默认使用的是 libtinfo6,而 libtinfo5 在 Ubuntu 24.04 官方源中已被移除。然而,Cuttlefish 的依赖还在使用老版本的 libtinfo5。
解决方案:手动安装 libtinfo5
1 | sudo apt update |
问题三:网络连接问题
点击查看报错详情:
1 | INFO: Repository +_repo_rules3+selinux instantiated at: |
其实我已经是挂着代理在编译了,但还是遇到了网络连接问题。
解决方案:设置好全局代理,反复尝试。
编译 AOSP
下面开始正式编译 AOSP。
切换到 AOSP 源码目录并且初始化编译环境:
1 | cd ~/AOSP |
接下来使用 lunch 命令选择要编译的设备。
lunch 命令的规则是 lunch product_name-release_config-build_variant。
在 2024 年以前,在终端执行 lunch 命令会列出所有可用的设备和配置。
但在我同步的代码中,在终端执行 lunch 命令会提示 No target specified.
1 | $ lunch |
我们可以分别使用 list_products 来查看支持的产品列表:
1 | $ list_products |
为了能在 Cuttlefish 上运行 AOSP,我们应该选择带有 cf_ 前缀的产品。
在我这里我选择了 aosp_cf_x86_64_phone。
接下来选择 release_config,可以使用 list_releases aosp_cf_x86_64_phone 命令查看可用的 release 配置。
1 | $ list_releases aosp_cf_x86_64_phone |
我的理解是 aosp_current 相当于开发分支,ap2a、ap3a 、ap4a、bp1a 是 release 的版本,而 trunk_staging 暂存分支。
这里我们选择 trunk_staging。
最后还差 build_variant 的选择,可以使用 list_variants 来查看支持的 build 变体。
1 | $ list_variants |
user 版就是发布给用户的,权限最小。
userdebug 版是给开发者的,权限较大,适合调试。
eng 版是给工程师的,权限最大,适合开发。
这里我们选择 eng 版。
组合上面 3 个部分,我们最终在终端执行如下命令:
1 | $ lunch aosp_cf_x86_64_phone-trunk_staging-eng |
最后我们可以执行 m 命令来编译 AOSP,也可以执行 make -j$(nproc) 来编译。
正式编译开始之后,就会大量消耗 CPU 和内存。
这里遇到过一个坑,从 ubuntu 22 开始,编译进程会因为占用大量内存而被 OOM Killer 杀掉。
我们可以手动卸载
systemd-oomd
1 | sudo apt purge systemd-oomd -y |
在一开始做编译分析的时候会消耗大量的内存,我这里物理机是 32GB 内存,又开了 64GB 的交换分区,编译分析阶段最高消耗了 50GB 左右的内存。

正式开始编译就会把整个 CPU 性能吃满,风扇转速拉到极限。

整体的编译时长取决于电脑的配置,我的电脑大概用了 2 个小时左右。
最后在终端看到如下内容,整个编译就结束了。

使用 Cuttlefish 运行 AOSP
在使用 Cuttlefish 测试我们编译好的镜像之前,先确保已经安装好的 Cuttlefish 可以正确运行。
首先从安卓 CI 平台上下载已经编译好的镜像。
下载地址在这里:https://ci.android.com/builds/branches/aosp-android-latest-release/grid?legacy=1

然后点击下载 aosp_cf_x86_64_only_phone-img-xxxxxx.zip

在面板中向下滚动,然后下载 cvd-host_package.tar.gz。请务必从与映像相同的 build 中下载主机软件包。
如果你从 Google 的网站上下载困难,也可以尝试从我这里下载:
下载完成后,在本地创建一个目录作为容器文件夹:
1 | mkdir cf |
启动 Cuttlefish:
1 | HOME=$PWD ./bin/launch_cvd --daemon |

然后就可以访问 https://localhost:8443 来进行手机操作了。

可以使用 adb 命令来连接 Cuttlefish:
1 | ./bin/adb devices |
停止 Cuttlefish:
1 | HOME=$PWD ./bin/stop_cvd |
如果能够成功运行 Cuttlefish,那么理论上你就可以运行自己编译的 AOSP 镜像。
为了对环境进行隔离,我们创建一个新的目录来启动自编译的 AOSP 镜像。
1 | mkdir cf2 |
并不是 vsoc_x86_64 下的所有文件都需要拷贝过来,其实把所有的 .img 文件拷贝过来即可。
最后使用如下命令启动 Cuttlefish:
1 | HOME=$PWD ./bin/launch_cvd --daemon |


