使用 Cuttlefish 虚拟 Android 设备

使用 Cuttlefish 虚拟 Android 设备,第1张

什么是 Cuttlefish?

cuttlefish 是一种可配置的虚拟 Android 设备,既可以远程运行(使用第三方云产品,如 Google Cloud Engine),又可以在本地运行(在 Linux x86 机器上)。

Cuttlefish 的目标 使平台和应用开发者不再依赖于物理硬件来开发和验证代码更改。通过与核心框架保持高度一致,以高保真度为重点来复制真实设备的基于框架的行为。支持 API 级别 28 之后的所有 API 级别。在各个 API 级别达到一致的功能水平,与物理硬件上的行为保持一致。

实现规模化:

能够并行运行多台设备。能够并发执行测试,实现高保真度且入门成本较低。

提供可配置的设备,能够调整设备类型、RAM、CPU 等。

Pangu-Immortal (Pangu-Immortal) · GitHubPangu-Immortal has 18 repositories available. Follow their code on GitHub.https://github.com/Pangu-Immortal 

Cuttlefish 与其他设备的对比情况 Cuttlefish 和 Android 模拟器

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

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

Cuttlefish 和物理设备

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

Cuttlefish 有哪些益处?

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

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

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

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

CTS框架合规性持续集成测试自定义测试套件 我是否可以在云端托管 Cuttlefish?

可以,Cuttlefish 本身支持 Google Cloud,并计划支持其他云平台。

入门

如需获得有关基于 AOSP 创建 Cuttlefish 实例的指导,请参阅入门指南。

Pangu-Immortal (Pangu-Immortal) · GitHubPangu-Immortal has 18 repositories available. Follow their code on GitHub.https://github.com/Pangu-Immortal 


Cuttlefish:GPU 图形加速

Cuttlefish 的加速图形模式会使用主机的物理图形处理器 (GPU) 进行渲染,具体方法是将客户机渲染命令传递给主机,在主机上运行渲染命令调用,然后将渲染后的结果传递回客户机。

默认情况下,Cuttlefish 设备中的客户机端渲染(例如界面和视频播放)由 SwiftShader 处理。SwiftShader 是对 OpenGL API 和 Vulkan API 的软件实现。由于 SwiftShader 是一种软件实现,因此它为 Cuttlefish 提供了一种可在任何主机上运行的通用渲染解决方案。

不过,使用 SwiftShader 的性能不及使用正常设备。渲染是一种可大规模并行处理的并行问题,因为像素值是可以单独计算的。图形处理器 (GPU) 是通过加速渲染解决此问题的硬件单元。

要求

加速图形模式要求主机具有以下驱动程序:

支持 EGL 的驱动程序(支持 GL_KHR_surfaceless_context 扩展程序)支持 OpenGL ES 的驱动程序支持 Vulkan 的驱动程序 使用加速图形模式 GfxStream

若要使用 GfxStream 加速图形模式,请使用 --gpu_mode=gfxstream 标记启动本地 Cuttlefish 设备。使用此模式时,OpenGL 和 Vulkan API 调用会直接转到主机。

launch_cvd --gpu_mode=gfxstream
Virgl

若要使用 Virgl 加速图形模式,请使用 --gpu_mode=drm_virgl 标记启动本地 Cuttlefish 设备。

launch_cvd --gpu_mode=drm_virgl

使用 Virgl 加速图形模式时,OpenGL API 调用会转换为中间表示形式(请参阅 Gallium3D)。系统会将相应中间表示形式传递给主机,并且主机上的 virglrenderer 库会将此中间表示形式重新转换为 OpenGL API 调用。

注意:此模式不支持 Vulkan。


Cuttlefish:多租户与 powerwashing

借助 Cuttlefish 多租户功能,您的主机可以通过一次启动调用来启动多个虚拟客户机设备。

这多个 Cuttlefish 虚拟机可以共用一些主机磁盘资源,从而节省磁盘空间。每个虚拟机都会获得一个覆盖 Android 分区(例如 superuserdataboot)的不重复的磁盘叠加层。对客户机磁盘的任何修改都将放置在客户机专用的磁盘叠加层中,从而为每个 Cuttlefish 虚拟机提供其磁盘分区的写入时复制视图。当每个虚拟设备向其磁盘视图写入更多数据时,主机磁盘上的叠加层文件大小会增加,因为它们会捕获原始状态和当前状态之间的增量。

叠加层文件可以重置,以将 Cuttlefish 磁盘恢复为其原始状态。此过程称为“PowerPowering”。

实例号

Cuttlefish 设备会在与其“实例号”相关联的主机上创建并消耗资源。例如,对于实例号为 1 的 Cuttlefish 设备,其 adb 连接会通过位于端口 6520 的 TCP 服务器端套接字进行公开。当启动多个实例时,它会在端口 6520 处为第一个设备创建 TCP 服务器端套接字,为第二个设备创建 6521,并递增每个其他设备的端口号。

修改支持的实例的数量上限

必须为 Cuttlefish 虚拟机预先分配主机端资源(例如 TAP 网络设备)。默认情况下,cuttlefish-common Debian 软件包会为 1 到 10 号实例预配资源。

如需进行更改,请在 /etc/default/cuttlefish-common 中修改 num_cvd_accounts,并通过执行以下命令来重启 cuttlefish-common 服务:

sudo systemctl restart cuttlefish-common
控制多租户实例

本部分介绍了如何启动、停止设备以及对设备执行 powerwash *** 作。这适用于单租户和多租户 launch_cvd 调用。

启动

如需同时启动多个 Cuttlefish 设备,请使用 --num_instances=N 标记,其中 N 为要启动的设备数量。默认情况下,将会从实例号为 1 的设备开始启动。

launch_cvd --num_instances=N

如需更改起始实例号,请执行以下某项 *** 作:

添加 --base_instance_num=N 标记,并将 N 作为第一个实例号。

launch_cvd --base_instance_num=N

使用与 vsoc-NN 匹配的用户帐号启动 Cuttlefish,其中 NN 为两位数形式的基础实例号。例如,如需使用用户帐号 vsoc-01 启动 Cuttlefish,请运行以下命令:

launch_cvd --base_instance_num=1
停止

注意:在多设备环境中使用时,停止程序会同时应用于所有设备。

如需停止上次 launch_cvd 调用启动的所有设备,请运行以下命令:

stop_cvd
powerwashing

注意:“powerwashing”发生在您重启虚拟设备时。在单设备环境或多设备环境中使用时,powerwashing 会同时应用于所有设备。

如需在原始状态(构建后的状态)下启动设备,请使用 launch_cvd 命令添加 --resume=false 标记。

// Launch and interact with your devices
launch_cvd --num_devices=N --daemon
// Stop all your devices
stop_cvd
// Restart devices in their original states
launch_cvd --daemon --num_devices=N --resume=false

Cuttlefish:WebRTC 流式传输

借助 WebRTC 流式传输功能,用户可通过浏览器远程控制 Cuttlefish 虚拟设备,而无需在客户端计算机上安装任何其他软件。WebRTC 流式传输功能的其他优势包括:

编码效率高于 VNC浏览器内 ADB可扩展协议(摄像头数据流、麦克风、传感器数据都可以通过 WebRTC 实现) 使用 WebRTC

如需在浏览器中使用 WebRTC 并与您的 Cuttlefish 设备互动,请执行以下 *** 作:

如需使用 WebRTC 启动设备,请在 launch_cvd 调用中添加 --start_webrtc=true 标记。

launch_cvd --start_webrtc=true

如需查看您可以连接的所有设备的列表,请让浏览器指向 

端口使用情况

WebRTC 除使用 TCP:8443 之外,还会使用其他端口建立连接并运行。 如果从与执行 Cuttlefish 的计算机不同的计算机进行连接,则必须在防火墙中允许这些端口。所需端口的列表如下:

TCP:15550UDP:15550UDP:15551UDP:15552UDP:15553UDP:15554UDP:15555UDP:15556UDP:15557UDP:15558
Cuttlefish:运行稳定版 CTS

本页介绍了如何运行兼容性测试套件 (CTS),以便根据 AOSP 源代码评估虚拟设备。

构建 Cuttlefish

在运行 CTS 之前,请先构建要使用 CTS 测试的虚拟设备。对于 AOSP Cuttlefish,请执行以下 *** 作:

source build/envsetup.sh
lunch aosp_cf_x86_64_phone-userdebug
make -j
构建 CTS

CTS 是独立于设备工件构建的。如需构建 CTS,请按照以下说明 *** 作。

从构建 Cuttlefish 所在树的根目录中,运行以下命令:

source build/envsetup.sh
m -j cts WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY=false TARGET_PRODUCT=aosp_x86_64
启动多租户 Cuttlefish 实例

注意:如需详细了解如何启动多台 Cuttlefish 设备,请参阅 Cuttlefish 多租户与 powerwashing。

从构建 Cuttlefish 所在树的根目录中,运行以下命令:

source build/envsetup.sh
lunch aosp_cf_x86_64_phone-userdebug
launch_cvd --num_instances=8 --daemon

启动实例时,请验证每台设备是否都可以访问 adb

adb devices

输出应类似于以下示例输出:

List of devices attached
127.0.0.1:6520  device
127.0.0.1:6521  device
127.0.0.1:6522  device
127.0.0.1:6523  device
127.0.0.1:6524  device
127.0.0.1:6525  device
127.0.0.1:6526  device
127.0.0.1:6527  device
在 Cuttlefish 实例中启用 Wi-Fi

如果未启用 Wi-Fi,部分 CTS 测试会失败。如需在本地托管的所有 Cuttlefish 设备上启用 Wi-Fi,请按照以下说明 *** 作。

从构建 Cuttlefish 所在树的根目录中,运行以下命令:

for SERIAL in adb devices | grep -E '127.+device$ | cut -f1'; do
adb -s ${SERIAL} install -r -g tools/tradefederation/core/res/apks/wifiutil/WifiUtil.apk
adb -s ${SERIAL} shell su root svc wifi enable
adb -s ${SERIAL} shell am instrument -e method "connectToNetwork" -e scan_ssid "false" -e ssid "VirtWifi" -w com.android.tradefed.utils.wifi/.WifiUtil
done
运行 CTS 稳定版子集

并非在 Cuttlefish 上进行的所有 CTS 都会通过,因为某些测试更多是针对实体设备量身定制的。如需使用 cts-virtual-device-stable 测试计划(用于跟踪在虚拟平台上运行稳定的最新功能)运行 CTS,请按照以下说明 *** 作。

从构建 Cuttlefish 所在树的根目录中,运行以下命令:

source build/envsetup.sh
lunch aosp_cf_x86_64_phone-userdebug
cts-tradefed run cts-virtual-device-stable --no-enable-parameterized-modules --max-testcase-run-count 2 --retry-strategy RETRY_ANY_FAILURE --reboot-at-last-retry --shard-count 8

预计运行该测试需要 20 到 25 分钟时间,并显示类似如下的总结:

=============== Summary ===============
Total Run time: 22m 8s
184/184 modules completed
Total Tests       : 92483
PASSED            : 92363
FAILED            : 0
IGNORED           : 71
ASSUMPTION_FAILURE: 49
Shard 0 used: [127.0.0.1:6522]
Shard 1 used: [127.0.0.1:6525]
Shard 2 used: [127.0.0.1:6524]
Shard 3 used: [127.0.0.1:6521]
Shard 4 used: [127.0.0.1:6520]
Shard 5 used: [127.0.0.1:6527]
Shard 6 used: [127.0.0.1:6526]
Shard 7 used: [127.0.0.1:6523]
============== End of Results ==============
清理

测试完成后,请停止虚拟设备。

从构建 Cuttlefish 所在树的根目录中,运行以下命令:

source build/envsetup.sh
lunch aosp_cf_x86_64_phone-userdebug
stop_cvd

Pangu-Immortal (Pangu-Immortal) · GitHubPangu-Immortal has 18 repositories available. Follow their code on GitHub.https://github.com/Pangu-Immortal

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/992723.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-21
下一篇 2022-05-21

发表评论

登录后才能评论

评论列表(0条)

保存