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 调用会直接转到主机。
Virgllaunch_cvd --gpu_mode=gfxstream
若要使用 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 分区(例如 super
、userdata
、boot
)的不重复的磁盘叠加层。对客户机磁盘的任何修改都将放置在客户机专用的磁盘叠加层中,从而为每个 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
调用启动的所有设备,请运行以下命令:
powerwashingstop_cvd
注意:“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:15550
UDP:15550
UDP:15551
UDP:15552
UDP:15553
UDP:15554
UDP:15555
UDP:15556
UDP:15557
UDP: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
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)