3. CTS测试用例执行:运行Camera CTS命令、测试计划选择、日志收集方法
在高通Camera项目的CTS兼容性验证中,测试用例的执行效率与日志收集的完整性直接影响故障定位的准确性。本章围绕Camera CTS的典型执行流程,详细说明命令构造、测试计划筛选策略以及日志收集的标准化方法。
3.1 Camera CTS测试命令与执行流程
Camera CTS测试通常通过cts-tradefed命令行工具驱动。以下为高通平台Camera模块最常用的命令模板及参数说明:
核心命令模板:
# 运行全部Camera CTS测试用例(含android.hardware.camera2与android.hardware.camera)
./cts-tradefed run cts --plan CTS -m Camera
# 按模块分组运行(仅Camera2 API测试)
./cts-tradefed run cts --plan CTS -m CtsCameraTestCases
# 按测试类名运行单个测试类
./cts-tradefed run cts --plan CTS -m CtsCameraTestCases \
--test android.hardware.camera2.cts.CameraDeviceTest
# 按测试方法名运行单个用例
./cts-tradefed run cts --plan CTS -m CtsCameraTestCases \
--test android.hardware.camera2.cts.CameraDeviceTest#testCameraDeviceCreate
执行过程中,cts-tradefed会自动将测试结果写入test_result.xml,同时生成详细的日志文件。对于高通Camera项目,建议在命令中附加以下参数以增强日志粒度:
| 参数 | 作用 | 推荐场景 |
|---|---|---|
--log-level VERBOSE |
输出HAL层与驱动层的详细日志 | 首次运行或出现未知失败时 |
--retry-strategy RETRY_ANY_FAILURE |
自动重试失败的测试用例 | 排查偶发性失败时关闭,避免掩盖问题 |
--screenshot-on-failure |
在测试失败时自动截取屏幕 | UI相关Camera测试(如预览、拍照) |
--enable-assertion |
启用更严格的断言检查 | 验证HAL实现边界条件 |
高通平台经验:在运行Camera CTS前,务必确认设备已通过
adb root获取root权限,并执行adb disable-verity关闭dm-verity保护,否则部分测试用例会因权限不足而跳过或失败。
3.2 测试计划选择策略
CTS测试计划(Test Plan)定义了测试用例的集合与执行顺序。针对高通Camera项目,推荐采用分层筛选策略,从全量回归到定向验证逐步缩小范围:
- 全量回归计划(CTS Full Plan):适用于基线版本或大版本升级后的完整验证,耗时约8-12小时。
- Camera模块计划(CTS Camera Plan):仅包含
android.hardware.camera2与android.hardware.camera相关测试,耗时约2-4小时。 - 失败用例重测计划(Retry Plan):基于上一次运行结果的
test_result.xml自动生成重测列表,用于验证修复效果。 - 自定义测试计划(Custom Plan):针对特定HAL特性(如HDR、多摄像头、RAW输出)编写XML过滤规则。
以下为自定义测试计划的XML片段示例,用于筛选与多摄像头相关的测试用例:
<?xml version="1.0" encoding="utf-8"?>
<TestPlan name="MultiCameraPlan">
<Entry uri="CtsCameraTestCases">
<Metadata key="test" value="*MultiCamera*" />
<Metadata key="test" value="*LogicalCamera*" />
<Metadata key="test" value="*ConcurrentCamera*" />
</Entry>
</TestPlan>
注意:高通平台的多摄像头配置(如广角+长焦+主摄)在CTS中对应
LogicalCamera与ConcurrentCamera测试组。如果设备未正确配置物理摄像头ID映射表,这些测试将全部失败。建议在运行前先通过adb shell dumpsys media.camera确认摄像头ID拓扑。
3.3 日志收集方法与关键文件定位
日志是CTS故障排查的核心依据。Camera CTS运行过程中会生成多类日志文件,以下为标准化收集流程:
3.3.1 日志文件清单
| 日志类型 | 文件路径/命令 | 关键内容 |
|---|---|---|
| CTS结果日志 | android-cts/results/<日期>/test_result.xml |
测试用例通过/失败/跳过的汇总统计 |
| CTS详细日志 | android-cts/logs/<日期>/host_log_*.txt |
测试执行过程中的Host端日志,包含异常堆栈 |
| 设备端logcat | adb logcat -b all -d > logcat_camera.txt |
Camera HAL、驱动、服务层的运行时日志 |
| 内核日志 | adb shell dmesg > dmesg_camera.txt |
驱动加载、中断、DMA错误等底层信息 |
| Camera元数据 | adb shell dumpsys media.camera > camera_dump.txt |
摄像头ID、分辨率列表、特性支持情况 |
| Bugreport | adb bugreport bugreport_camera.zip |
系统整体状态快照,包含ANR、crash等 |
3.3.2 日志收集自动化脚本
为提升效率,建议在CTS执行前后自动触发日志收集。以下为高通Camera项目常用的日志收集脚本模板:
#!/bin/bash
# collect_camera_logs.sh - 高通Camera CTS日志收集脚本
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
LOG_DIR="./camera_cts_logs_${TIMESTAMP}"
mkdir -p ${LOG_DIR}
# 1. 收集CTS结果与Host日志
cp -r android-cts/results/* ${LOG_DIR}/results/
cp -r android-cts/logs/* ${LOG_DIR}/logs/
# 2. 收集设备端logcat(过滤Camera相关标签)
adb logcat -b all -d | grep -E "(Camera|camx|CHI|mm-camera)" \
> ${LOG_DIR}/logcat_camera_filtered.txt
# 3. 收集内核日志
adb shell dmesg > ${LOG_DIR}/dmesg_camera.txt
# 4. 收集Camera dumpsys
adb shell dumpsys media.camera > ${LOG_DIR}/camera_dump.txt
# 5. 收集Bugreport(后台执行,避免阻塞)
adb bugreport ${LOG_DIR}/bugreport_camera.zip &
echo "日志收集完成,保存至: ${LOG_DIR}"
3.4 Camera CTS执行与日志收集流程架构
以下SVG图展示了从命令执行到日志归档的完整数据流,帮助理解各组件之间的依赖关系:
3.5 高通Camera专属日志增强技巧
高通平台的Camera HAL基于camx(Camera X)架构,其日志输出具有独特的层级结构。以下为针对高通平台的日志增强配置:
- 启用camx详细日志:通过
adb shell setprop vendor.camera.hal.logs 1开启HAL层详细日志,覆盖sensor、ISP、IPE等模块。 - CHI(Camera Hardware Interface)日志:设置
adb shell setprop persist.vendor.camera.chi.logs 1,用于跟踪Usecase与Pipeline的创建销毁过程。 - 驱动层日志:通过
adb shell echo 0x1F > /sys/module/msm_camera/parameters/debug_mask开启内核驱动调试信息。 - 性能日志:使用
adb shell setprop vendor.debug.camera.perf 1记录每一帧的耗时分布,用于定位帧率不达标问题。
实战建议:在CTS执行前,将上述属性写入
adb shell setprop并重启cameraserver服务(adb shell pkill cameraserver),确保日志从测试开始即完整记录。注意:开启详细日志会增加CPU开销,可能影响测试帧率,建议仅在调试阶段使用。
3.6 常见日志收集问题与解决方案
| 问题现象 | 原因分析 | 解决方案 |
|---|---|---|
| logcat中Camera日志缺失 | 日志缓冲区被其他进程覆盖 | 使用adb logcat -G 16M增大缓冲区,或使用logcat -b all收集所有缓冲区 |
| test_result.xml为空 | CTS执行被异常中断 | 检查host_log_*.txt中的异常堆栈,确认是否为内存不足或进程被杀 |
| dmesg日志不完整 | 内核环形缓冲区溢出 | 在CTS执行前执行adb shell dmesg -c清空缓冲区,执行后立即收集 |
| Bugreport生成失败 | 设备存储空间不足 | 执行前检查adb shell df /data,确保剩余空间大于2GB |