Cuttlefish安装指南及常见问题

1,904 阅读5分钟

Cuttlefish是一种可配置的Android虚拟设备,既可以在云端运行,也可以在本地运行。更多内容请参考Cuttlefish官方介绍

1. 环境检查

验证KVM可用性

如果你的CPU是x86平台,执行以下命令,返回值大于说明支持KVM

grep -c -w "vmx\|svm" /proc/cpuinfo

如果你的CPU是ARM平台,执行以下命令,能找到说明支持KVM

find /dev -name kvm

不支持可以跳过下面的内容

2. 安装Cuttlefish

sudo apt install -y git devscripts equivs config-package-dev debhelper-compat golang curl
git clone https://github.com/google/android-cuttlefish
cd android-cuttlefish
for dir in base frontend; do
  pushd $dir
  # Install build dependencies
  sudo mk-build-deps -i
  dpkg-buildpackage -uc -us
  popd
done
sudo dpkg -i ./cuttlefish-base_*_*64.deb || sudo apt-get install -f
sudo dpkg -i ./cuttlefish-user_*_*64.deb || sudo apt-get install -f
sudo usermod -aG kvm,cvdnetwork,render $USER

以上shell命令如果执行错误,请参考常见问题部分。无误则执行reboot命令重启

3. 下载并解压必要文件

打开Android CI官网 , 在分支名输入框填入aosp-android14-gsi android-ci.png 点击aosp_cf_x86_64_phone进入到文件选择页面, 然后下载以下两个文件

  • 系统映像文件(xxxxxx表示Build ID)
    • x86平台: aosp_cf_x86_64_phone-img-xxxxxx.zip
    • ARM平台: aosp_cf_arm64_only_phone-xxxxxx.zip
  • 宿主机相关文件
    • cvd-host_package.tar.gz

解压文件

  • x86:
mkdir cf
cd cf
tar -xvf /path/to/cvd-host_package.tar.gz
unzip /path/to/aosp_cf_x86_64_phone-img-xxxxxx.zip
  • ARM:
mkdir cf
cd cf
tar -xvf /path/to/cvd-host_package.tar.gz
unzip /path/to/aosp_cf_arm64_only_phone-img-xxxxxx.zip

4. 运行Cuttlefish

Cuttlefish可以用多种方法启动

使用普通方式运行

HOME=$PWD ./bin/launch_cvd --daemon

使用WebRTC方式运行

HOME=$PWD ./bin/launch_cvd --start_webrtc=true

用浏览器打开https://localhost:8443,就可以操作Cuttlefish了

查看运行情况

adb devices

停止运行

./bin/stop_cvd

5. 编译kernel源码

以common-android14-6.1分支为例,首先同步源码

mkdir common-android14-6.1
cd common-android14-6.1
repo init -u https://android.googlesource.com/kernel/manifest -b common-android14-6.1
repo sync -c -j$(nproc)

编译

  • x86
tools/bazel run //common-modules/virtual-device:virtual_device_x86_64_dist
  • ARM
tools/bazel run //common-modules/virtual-device:virtual_device_aarch64_dist

6. 使用kernel

  • x86
HOME=$PWD ./bin/launch_cvd -kernel_path=/path/to/common-android14-6.1/out/virtual_device_x86_64/dist/bzImage -initramfs_path=/path/tol/common-android14-6.1/out/virtual_device_x86_64/dist/initramfs.img
  • ARM
cvd start \
    -kernel_path=/path/to/common-android14-6.1/out/virtual_device_aarch64/dist/Image \
    -initramfs_path=/path/to/common-android14-6.1/out/virtual_device_aarch64/dist/initramfs.img

7. 编译Bootloader源码

同步源码

mkdir u-boot-mainline
cd u-boot-mainline
repo init -u https://android.googlesource.com/kernel/manifest -b u-boot-mainline
repo sync -j$(nproc) -q

编译

tools/bazel run //u-boot:crosvm_x86_64_dist

8. 使用Bootloader

  • x86
launch_cvd \
    -bootloader /path/to/u-boot-mainline/out/u-boot-mainline/dist/u-boot.rom \
    -pause_in_bootloader -console=true
  • ARM
launch_cvd \
    -bootloader /path/to/u-boot-mainline/out/u-boot-mainline/dist/u-boot.bin \
    -pause_in_bootloader -console=true

常见问题

1. 连接bazel.build失败

curl: (28) Failed to connect to bazel.build port 443 after 134648 ms: Connection timed out
gpg: no valid OpenPGP data found.

解决方法:
在终端执行

curl -fsSL https://bazel.build/bazel-release.pub.gpg | gpg --dearmor >android-cuttlefish/bazel-archive-keyring.gpg

然后修改android-cuttlefish/tools/buildutils/installbazel.sh文件, 注释curl -fsSL https://bazel.build/bazel-release.pub.gpg | gpg --dearmor >bazel-archive-keyring.gpg所在行, 最后再次执行安装Cuttlefish步骤

2. deb文件不存在

dpkg: error: cannot access archive './cuttlefish-base_*_*64.deb': No such file or directory
dpkg: error: cannot access archive './cuttlefish-user_*_*64.deb': No such file or directory

解决方法:
android-cuttlefish/release页面下载cuttlefish_packages.7z文件
复制到android-cuttlefish目录
然后解压

7z x cuttlefish_packages.7z

最后再次执行安装Cuttlefish步骤

3. 编译aosp源码遇到含有/dev/loop0的错误提示

Info: Disable heap-based policy
Info: Debug level = 0
Info: Trim is enabled
Info: open /dev/loop0 failed errno:13
        Error: Not available on mounted device!
exit status 255

在没有安装cuttlefish的电脑上,编译target为cuttlefish时一般会出现这种错误
解决方法:
按照上面的方法安装cuttlefish

Cuttlefish 的目标

1.使平台和应用开发者不再依赖于物理硬件来开发和验证代码更改。
2.通过与核心框架保持高度一致,以高保真度为重点来复制真实设备的基于框架的行为。
3.支持 API 级别 28 之后的所有 API 级别。
4.在各个 API 级别达到一致的功能水平,与物理硬件上的行为保持一致。
5.实现规模化:
    能够并行运行多台设备。
    能够并发执行测试,实现高保真度且入门成本较低。

6.提供可配置的设备,能够调整外形规格、RAM、CPU 等。

Cuttlefish 与其他设备的对比情况

Cuttlefish 和 Android 模拟器

Cuttlefish 与 Android 模拟器有许多相似之处,但 Cuttlefish 可以保证 Android 框架(无论这是纯 AOSP,还是您自己的树中的自定义实现)实现全保真。在实际应用中,这意味着 Cuttlefish 应该会在操作系统级别响应您的互动,就像使用相同的自定义或纯 Android OS 源代码构建的实体手机目标一样。

Android 模拟器围绕简化应用开发的用例构建而成,它包含许多功能钩子来迎合 Android 应用开发者的用例。如果您要使用您的自定义 Android 框架来构建模拟器,这可能会带来一些挑战。如果您需要能够代表您的自定义平台/框架代码或 Android 树形结构的虚拟设备,那么 Cuttlefish 虚拟设备是理想的选择。它是用于表示当前 AOSP 开发状态的规范设备。

Cuttlefish 和物理设备

Cuttlefish 虚拟设备与实体设备之间的主要区别在于硬件抽象层 (HAL) 级别,以及与任何自定义硬件互动的任何软件。除了硬件专用实现之外,您应该会发现 Cuttlefish 和实体设备表现出在功能上等效的行为。

Cuttlefish 有哪些益处?

您可以像与任何可能用于调试的其他 Android 设备互动一样与 Cuttlefish 互动。它会通过 adb 将自身注册为正常设备,您可以像与实体设备互动一样通过远程桌面与之互动。Cuttlefish 的用例非常广泛,涵盖应用测试、自定义系统构建测试等。

由于 Cuttlefish 力求实现框架保真度,因此可用于对您的框架或应用进行功能测试,在测试中没有无法模拟的物理硬件依赖项。

目前 Cuttlefish 通常如何用于测试?

Cuttlefish 在测试方面的一些常见应用包括:

CTS
框架合规性
持续集成测试
自定义测试套件