OmniLab ATS 中的虚拟设备

OmniLab ATS 支持 Cuttlefish 虚拟设备,让您可以在没有实体 Android 设备的情况下运行测试。Cuttlefish 适合测试与硬件无关的功能。在开始使用虚拟设备之前,请按照用户指南安装 OmniLab ATS。

OmniLab ATS 以两种模式(本地和远程)支持虚拟设备。下表对这两种模式进行了比较。

本地虚拟设备 远程虚拟设备
在 ATS worker 主机上运行 在 ATS worker 主机可以通过 SSH 访问的远程主机上运行
基于 X86 可以是 x86 或 ARM,具体取决于主机的架构
更容易设置 设置起来更复杂

本地和远程虚拟设备可以单独启用。如需详细了解每种模式,请参阅:

设置本地虚拟设备

本部分介绍了为本地虚拟设备设置 OmniLab ATS 的步骤。

安装 Cuttlefish 依赖项

运行以下命令以确保加载必要的内核模块:

sudo modprobe -a kvm tun vhost_net vhost_vsock

使用本地虚拟设备启动 OmniLab ATS

在启动 OmniLab ATS 之前,请确保所有 Cuttlefish 实例都已停止。OmniLab ATS 在测试周期内会自动启动和停止虚拟设备,而现有的 Cuttlefish 实例与 OmniLab ATS 管理的实例冲突。如需详细了解如何停止 Cuttlefish 实例,请参阅停止 Cuttlefish

如需启用本地虚拟设备,请运行以下命令:

mtt start --max_local_virtual_devices N

N 表示 OmniLab ATS 可以同时分配的虚拟设备的最大数量。默认数量为 0。

如果此命令由于缺少设备节点而失败,请按照错误消息中的步骤加载内核模块。如果命令仍然失败,请重新启动虚拟机。

设置远程虚拟设备

本部分介绍了为远程虚拟设备设置 OmniLab ATS 的步骤。

安装 Cuttlefish 依赖项

如需安装 Cuttlefish 依赖项,请按以下步骤操作。

  1. 按照 Cuttlefish > 入门中的步骤,在远程主机上安装 Debian 软件包。

  2. 按照以下步骤配置远程主机上的虚拟设备数量上限:

    1. 使用 root 特权修改 /etc/default/cuttlefish-host-resources
    2. num_cvd_accounts 设为在此主机上允许的虚拟设备数量上限。
    3. 运行 sudo systemctl restart cuttlefish-host-resources
    4. 运行 ifconfig 并验证 cvd-wtap-* 接口的数量。

创建 SSH 账号

由于 OmniLab ATS 主机通过 SSH 连接到远程主机,因此您必须在远程主机上准备好 SSH 账号。由于 OmniLab ATS 会操控 HOME 目录中的文件,因此我们建议您创建一个专用账号。

OmniLab ATS 主机需要一对 SSH 密钥才能在无需密码的情况下登录到远程主机。以下步骤介绍了如何设置 SSH 密钥:

  1. 如需生成私钥和公钥,请在 OmniLab ATS 主机上运行 ssh-keygen
  2. 将公钥上传并附加到远程主机上的 ~/.ssh/authorized_keys

如果您的 SSH 账号与用于安装 Cuttlefish 依赖项的账号不同,请在远程主机上运行以下命令,以允许 SSH 账号启动 Cuttlefish:

sudo usermod -aG kvm,cvdnetwork,render $USER

使用远程虚拟设备启动 OmniLab ATS

在启动 OmniLab ATS 之前,请确保所有 Cuttlefish 实例都已停止。OmniLab ATS 在测试周期内会自动启动和停止虚拟设备,而现有的 Cuttlefish 实例与 OmniLab ATS 管理的实例冲突。如需详细了解如何停止 Cuttlefish 实例,请参阅停止 Cuttlefish

为了获得更好的性能,我们建议在局域网中设置 OmniLab ATS 主机和远程主机

如需启用远程虚拟设备,请在 OmniLab ATS 主机上运行以下命令:

mtt start --remote_virtual_devices USER@HOST/N \
--remote_ssh_key KEY

USER 是 SSH 账号名称。

HOST 是远程主机的 IPv4 地址。

N 是 OmniLab ATS 可以同时分配的虚拟设备的最大数量。

KEY 是指向 OmniLab ATS 主机上的 SSH 私钥的路径。

该命令会在启动 OmniLab ATS 之前测试与远程主机的连接情况。如果控制台中显示 The specified --remote_virtual_devices and --remote_ssh_key are invalid. 等警告消息,您应检查 SSH 设置。

为避免资源冲突,一个 OmniLab ATS 主机最多只能连接到一个远程主机。多个 OmniLab ATS 主机无法同时连接到一个远程主机。

使用虚拟设备运行测试

本部分介绍了在本地或远程虚拟设备上运行测试的步骤。

选择设备

在设备列表上,OmniLab ATS 会将虚拟设备显示为占位符,而不是其实际序列号。对于本地虚拟设备,占位符以 HOSTNAME:local-virtual-device-ID 的格式显示,对于远程虚拟设备,以 remote-virtual-ADDRESS-ID 的格式显示。HOSTNAME:local-virtual-device-IDHOSTNAME:local-virtual-device-ID状态是“Available”或“Allocated”。“Available”状态占位符表示虚拟设备未运行并且可以分配给测试。

选择虚拟设备

图 1. 选择虚拟设备

添加设备操作

如果您至少选择一个虚拟设备,则关联的设备操作应该会自动添加到列表中。操作包含创建虚拟设备所需的 TradeFed 参数和测试资源。

本地虚拟设备操作

图 2. 本地虚拟设备的设备操作

远程虚拟设备操作

图 3. 远程虚拟设备的设备操作

设置测试资源

Cuttlefish 虚拟设备需要三项测试资源,即虚拟机工具、映像和 Acloud。在典型的 Cuttlefish build(例如,ci.android.com 上的 aosp_cf_x86_64_phone)中,虚拟机工具封装在 cvd-host_package.tar.gz 中,映像位于 aosp_cf_x86_64_phone-img-*.zip 中。Acloud 二进制文件内置于 OmniLab ATS 中,并与所有版本的 Cuttlefish 兼容。您只需出于调试目的更改 Acloud 二进制文件的默认下载网址。

虚拟设备测试资源

图 4. 虚拟设备测试资源

查看测试运行

设备日志(包括 kernel.loghost_log.txtlauncher.log)会收集在输出文件文件夹中。点击查看输出文件即可查看。

测试运行结果

图 5. 测试运行结果