服务器与大带宽专家 · 持牌IDC/CDN/ISP服务商
简米科技官网JIANMI TECH
资讯 2026-11-07 简米科技 4,888 字 12 分钟阅读

CTS测试虚拟机怎么搭建环境才能顺利通过?,怎么配置环境

导读cts测试虚拟机怎么配置硬件资源才能稳定运行很多团队在搭建CTS测试虚拟机时,第一反应是照搬物理机的配置,结果一跑CTS就出现各种莫名其妙的fail项,核心原因在于CTS对虚拟化环境的容忍度远低于日常开发,硬件资源与虚拟化加速没有对齐,后续的修复工作全是白费,要把cts测试虚拟机怎么配置这个问题解决好,关键在于……

cts测试虚拟机怎么配置硬件资源才能稳定运行

很多团队在搭建CTS测试虚拟机时,第一反应是照搬物理机的配置,结果一跑CTS就出现各种莫名其妙的fail项,核心原因在于CTS对虚拟化环境的容忍度远低于日常开发,硬件资源与虚拟化加速没有对齐,后续的修复工作全是白费,要把cts测试虚拟机怎么配置这个问题解决好,关键在于理解CTS的调度方式与虚拟机的资源隔离机制。

CTS测试虚拟机能否顺利通过,取决于硬件虚拟化加速、系统镜像选型、GPU渲染模式这三者的匹配程度,缺一不可。这一点在多次验证中得到了印证,尤其是在跑tsuite大模块时,配置不当的虚拟机往往连开机阶段都会卡死。

CPU与内存的分配底线

CTS测试虚拟机在跑兼容性测试时,会同时启动多个测试进程,对CPU核心数的需求是动态变化的,行业共识认为,至少分配4核CPU与8GB内存才能支撑Android系统镜像的完整启动与CTS的并行调度,如果你打算并行运行多个测试模块,建议物理机核心数不低于8核,否则虚拟机的CPU排队会直接反映在Timeout fail中。

具体操作上,在VirtualBox或QEMU/KVM中创建虚拟机时,需要关闭CPU的"嵌套页表"选项吗?不必,但必须开启VT-x/AMD-V嵌套虚拟化,部分云主机默认屏蔽了这个能力,这是cts测试环境搭建教程中首先要确认的硬件前提。

磁盘空间与I/O性能的取舍

CTS源码与android-cts工具包解压后,占用的空间在50GB左右,加上系统镜像与测试生成的日志文件,整个虚拟机分配磁盘建议不低于150GB,但空间只是基础,真正的瓶颈是磁盘读写延迟,机械硬盘在跑cts测试平台搭建过程中的大量文件读写时,容易出现ANR误判,建议使用SSD或NVMe虚拟磁盘。

一个实用做法是将虚拟机的磁盘控制方式设为SATA或VirtIO,在QEMU/KVM下使用VirtIO能获得更好的吞吐性能,日志输出目录可以挂载到宿主机共享文件夹,避免虚拟机内磁盘空间被log撑爆。

虚拟化加速选择:KVM与HAXM的取舍逻辑

CTS测试虚拟机的运行效率,直接由虚拟化加速方式决定,在Linux宿主机上,KVM是唯一可靠的选择;在Windows宿主机上,Intel用户使用HAXM,AMD用户则需要依赖WHPX或直接改用VirtualBox的Hyper-V模式,近年来的测试反馈显示,在Windows上用腾讯手游助手自带的虚拟化引擎跑CTS,会出现不少图形渲染相关的fail项,不建议混用。

KVM配置的关键步骤

在Ubuntu宿主机上搭建Android CTS测试虚拟机时,先确认CPU虚拟化是否已开启:

  • 执行egrep -c '(vmx|svm)' /proc/cpuinfo,返回数字大于0表示支持。
  • 安装KVM相关包:sudo apt install qemu-kvm libvirt-daemon-system virt-manager。
  • 在virt-manager创建虚拟机时,固件选择UEFI,CPU模型选择host-passthrough。

这个模式下,CTS的selftest模块的海量用例才能在合理时间内跑完。

KVM与模拟器的嵌套加速

当你需要在CTS测试虚拟机里再启动Android模拟器时,问题会变得复杂,Android模拟器依赖的HAXM不能在虚拟机中嵌套使用,但KVM支持嵌套虚拟化,在libvirt配置文件中加入<cpu mode='host-passthrough' check='none'/>后,模拟器会识别出KVM可用,从而创建x86架构的AVD。

如果你不想处理嵌套虚拟化,可以直接在虚拟机里跑ARM镜像,但那样cts测试平台搭建完成后,运行速度会慢到一个完整的CTS套件需要跑几天,严重影响迭代效率。

AVD与系统镜像选型:CTS测试虚拟机怎么避免架构不兼容

虚拟机的操作系统环境搭建好后,还需要创建Android虚拟设备ID,CTS对系统镜像的架构非常敏感,选错镜像会导致整个测试直接无法开始,或者出现大量abi相关的fail项。

x86与ARM镜像的选择标准

在KVM加速下,建议使用Google官方x86_64系统镜像,ARM镜像在虚拟机中只能通过软件模拟运行,速度较慢,且部分CTS用例对ARM架构的时序要求严格,在虚拟机中会导致误报。

对于Android 9及以下版本的系统,选用API 28的x86_64镜像比较稳妥;对于Android 10及以上,API 29到API 34的x86_64镜像均可,如果你需要测试特定厂商的定制系统,则系统镜像需由厂商提供,这一步需要单独确认。

创建AVD的实操命令

使用sdkmanager与avdmanager创建AVD时,参考以下流程:

  • 用sdkmanager --list查看可用系统镜像,找到system-images;android-33;google_apis;x86_64字样。
  • 执行sdkmanager "system-images;android-33;google_apis;x86_64"下载镜像。
  • 用avdmanager create avd -n test_avd -k "system-images;android-33;google_apis;x86_64" -d pixel_6创建AVD。
  • 启动AVD时,手动指定GPU模式,emulator -avd test_avd -gpu swiftshader_indirect -no-snapshot -no-audio -no-boot-anim。

这里特别提出一个容易踩坑的点:CTS测试虚拟机环境下,不要开启快照功能。快照会干扰CTS对系统状态的判断,导致某些用例在恢复快照时数据不一致,出现诡异的fail项。

GPU虚拟化与图形渲染:cts测试平台搭建绕不开的显示栈

CTS中的android.graphics.cts和android.hardware.cts模块大量涉及图形渲染相关测试,而虚拟机默认的GPU是虚拟显卡,这些用例在虚拟机上经常因为渲染精度不足或OpenGL ES版本不匹配而失败。

使用SwiftShader软件渲染的适用场景

在Android模拟器启动时使用-gpu swiftshader_indirect,可以让系统调用SwiftShader软件渲染器,这个渲染器对OpenGL ES 2.0的支持较为完善,但部分CTS用例要求OpenGL ES 3.1以上特性,这会导致失败,较新版本的模拟器增加了angle_indirect选项,可以把OpenGL调用转换为DirectX或Desktop OpenGL,兼容性更好。

从实际测试看,不使用独立显卡的虚拟机,在-gpu swiftshader_indirect模式下能通过大部分图形用例,完整通过率在较大比例场景下与真机存在差距,但对于日常开发自测来说足够定位问题。

宿主机显卡透传的进阶方案

如果你对图形渲染的要求比较高,可以尝试在宿主机上做GPU直通,将物理显卡直接分配给虚拟机,在QEMU/KVM中配置PCIe直通后,虚拟机内能识别出完整的GPU信息,CTS的Opengl ES用例通过率会有明显提升,但此方案对宿主机硬件要求较高,某些NVIDIA消费级显卡需要破解驱动限制,建议使用AMD或Intel显卡,行业共识认为这个方案适用于预算有限但需要逼近真机效果的团队。

cts测试环境搭建教程:adb与CTS命令的执行要点

前期的环境与AVD都准备好之后,进入CTS执行的环节,这里的操作细节决定了测试能否顺利跑完,不至于中途中断或生成大量无效日志。

网络与adb连接的稳定性

CTS会频繁重启或安装APK,如果adb连接不稳定,会直接导致install相关用例失败,建议使用USB网络或虚拟网卡方式连接,避免通过局域网WiFi连接虚拟机的adb端口。

在虚拟机内部执行adb kill-server与adb start-server,确保服务重启后无报错,使用adb devices确认设备状态是device而不是unauthorized,否则测试会无法开始。

运行CTS前的系统设置

在AVD启动后,需要手动关闭系统的动画缩放:

  • 在开发者选项中,将窗口动画缩放、过渡动画缩放、动画程序时长缩放均设为关闭。
  • 设置屏幕超时时间为10分钟,避免休眠导致的唤醒问题。
  • 禁用不必要的系统应用,如Google搜索和Chrome,这些应用可能在测试中被自动拉起,干扰CTS的隔离环境。

这些准备动作做完后,再执行cts-tradefed run cts -m CtsOsTestCases,整体流程会顺畅得多。

常见失败分析与排查路径

即便环境搭建正确,CTS测试虚拟机也会出现一些常见问题的失败项,这类问题通常和虚拟化环境自身的局限有关。

关于Timeout和OOM的失败

虚拟机中的内存不足,或者CPU调度不及时,会触发CTS的ProcessCpuUsage超时监控,导致产生Timeout类型fail,此时需要增大虚拟机的内存与CPU配额,并确认宿主机没有其他高负载任务争抢资源,另一个常见原因是JVM堆内存不足,可在tradefed.sh中调整JAVA_OPTS的-Xmx参数,例如-Xmx4096m。

关于Sensor与Battery相关用例的失败

虚拟机中不存在物理传感器与电池,因此CtsSensorTestCases和CtsBatteryTestCases的较大比例用例会失败或跳过,这不是环境搭建问题,而是CTS设计上的合理性此类用例默认不在虚拟机中运行,你可以在本机执行时使用--skip-device-info battery等参数跳过,或者直接排除这一类模块。

cts测试虚拟机常见问题解答

关于CTS测试虚拟机的搭建,以下问题出现频率较高,在此集中说明。

CTS测试虚拟机需要安装哪个版本的Android系统,才能兼顾兼容性测试的覆盖面?

如果目标是验证应用兼容性,优先选择Android 11(API 30)或Android 12(API 31)的x86_64系统镜像,这两个版本在CTS测试虚拟机中表现较为稳定,且覆盖了近年主流设备的系统特性,如果你需要适配最新的Android 14或15,建议使用对应版本的Google官方镜像,但需要确认你的CTS版本支持该API级别,否则会因为版本不匹配而无法运行。

CTS测试环境搭建教程中,如何让虚拟机中的系统时间与宿主机保持一致?

CTS中的很多用例对时间戳敏感,如果时间不同步会导致TLS证书或性能统计相关的fail项,在虚拟机内使用adb shell date查看时间,若与宿主机不一致,有两种处理方式:一种是在AVD启动时加上-no-snapshot参数并关闭虚拟机的时间自动同步干扰;另一种是在虚拟机内执行adb shell settings put global auto_time 1,确保系统与NTP服务器同步,多数情况下,这一设置配合物理机的NTP服务,可以保证测试期间时间偏差在毫秒级。

CAN总线或车载系统测试时,CTS测试虚拟机怎么配置串口与GPIO虚拟化?

CTS本身不涉及车载专用接口的测试,这些属于VTS或其他平台的范畴,但在Android Automotive系统的CTS测试中,需要确保虚拟机包含android.automotive.cts模块所需的系统服务,若你的虚拟机没有配置对应的HAL,测试会直接报unsupported,对此需要自研或复用厂商提供的HAL库,并放入虚拟机的/vendor/lib/hw目录下,这一环节在cts测试平台搭建过程中常被忽略。

分享本文
本文为 简米科技官网 原创,已由运维技术专家审核。转载请注明来源:原文链接
售前咨询 服务热线 售后 邮箱