3. CTS Camera Test 分类:StillCaptureTest、VideoTest、MultiCameraTest、PerformanceTest 等

CTS (Compatibility Test Suite) Camera Test 是 Android 兼容性测试套件中针对相机子系统设计的专项测试集合。根据测试目标与场景的不同,官方将 Camera CTS 划分为多个核心分类。理解这些分类的结构与测试意图,是进行失败分析与 HAL 适配修复的第一步。

3.1 核心测试分类总览

Camera CTS 测试主要覆盖静态图像捕获、视频录制、多摄像头协同以及性能稳定性四大领域。下表列出了各分类的测试范围与典型测试项:

测试分类 测试范围 典型测试项(示例) 主要关注点
StillCaptureTest 单帧/多帧静态图像捕获、格式转换、EXIF 数据 testJpegCapture, testRawCapture, testBurstCapture 图像质量、格式合规、3A 稳定性
VideoTest 视频录制、编码格式、帧率、分辨率切换 testVideoCapture, testVideoSnapshot, testVideoStabilization 编码器行为、帧率一致性、音视频同步
MultiCameraTest 多摄像头同时打开、逻辑摄像头切换、物理 ID 映射 testConcurrentCamera, testLogicalCameraSwitch 并发能力、物理/逻辑摄像头关系
PerformanceTest 打开延迟、捕获延迟、帧率吞吐量、内存占用 testCameraOpenLatency, testCaptureLatency, testFrameRate 实时性、资源消耗、ANR 风险
Other (辅助类) 参数校验、权限管理、系统状态恢复 testCameraCharacteristics, testPermissionDenied API 合规、异常处理
实战提示: 在 CTS 失败报告中,测试用例的完整类名通常包含分类标识。例如 android.hardware.camera2.cts.StillCaptureTest#testJpegCapture,通过类名即可快速定位到对应的测试分类,从而缩小 HAL 层问题排查范围。

3.2 StillCaptureTest — 静态图像捕获测试

StillCaptureTest 是 Camera CTS 中用例数量最多、失败率最高的分类之一。它验证 HAL 层在单帧与多帧捕获场景下的行为是否符合 Android 相机框架的预期。

核心验证点:

  • 格式支持: JPEG、YUV、RAW10/RAW16 等输出格式的像素排列与数据完整性。
  • 3A 稳定性: 自动对焦 (AF)、自动曝光 (AE)、自动白平衡 (AWB) 在连续捕获中的收敛速度与一致性。
  • 多帧融合: 针对 HDR、夜景等场景,验证多帧输入到单帧输出的合成逻辑。
  • EXIF 元数据: 确保输出 JPEG 中包含正确的 GPS、厂商信息、缩略图等。
常见失败模式: HAL 返回的 JPEG 大小超过框架限制(通常为 100MB),或 YUV 格式的 stride 与 width 不匹配,导致 CTS 解析图像数据时发生 BufferOverflowException。
StillCaptureTest 数据流与验证点 App 发起 Capture Camera Framework HAL 3A 处理 Sensor 输出 验证 JPEG 格式合规 验证 3A 收敛时间 验证 EXIF 完整性 验证多帧融合 CTS 框架通过 CaptureResult 与捕获图像数据对比,判断 HAL 实现是否合规

3.3 VideoTest — 视频录制测试

VideoTest 主要验证 HAL 层在视频流模式下的行为。与静态捕获不同,视频测试对帧率稳定性、编码器交互以及音视频同步有更高要求。

核心验证点:

  • 编码器配置: 确保 HAL 输出的视频帧格式(如 NV12、NV21)与 MediaCodec 的输入要求匹配。
  • 帧率一致性: 在 30fps 或 60fps 配置下,实际输出帧率波动不得超过 ±5%。
  • 视频快照: 在视频录制过程中同时捕获静态图像,验证 HAL 是否支持 YUV 与 JPEG 并发输出。
  • 防抖支持: 验证电子防抖 (EIS) 或光学防抖 (OIS) 开启后,裁剪区域与时间戳的正确性。
常见陷阱: 部分 HAL 在视频录制开始时返回的第一帧时间戳为 0,导致 CTS 音视频同步测试失败。HAL 层必须确保 ACAMERA_SENSOR_TIMESTAMP 在视频流中始终为单调递增且非零值。
VideoTest 帧流与编码交互 HAL 视频流 Camera Framework MediaCodec MP4 Muxer 验证帧率波动 < 5% 验证时间戳单调递增 验证编码器输入格式 验证音视频同步 CTS 通过对比编码前后帧的时间戳与 PTS 来判断 HAL 与编码器的协作是否正常

3.4 MultiCameraTest — 多摄像头测试

随着多摄手机的普及,MultiCameraTest 在 CTS 中的权重逐年增加。该分类主要验证 HAL 层对多摄像头并发、逻辑摄像头抽象以及物理 ID 映射的支持。

核心验证点:

  • 并发打开: 同时打开主摄与广角、主摄与长焦等组合,验证 HAL 是否支持多个 CameraDevice 实例。
  • 逻辑摄像头: 验证 LOGICAL_MULTI_CAMERA 能力,确保物理摄像头 ID 列表与框架预期一致。
  • 同步帧: 验证多摄像头同时捕获时,各帧的时间戳偏差是否在允许范围内(通常 < 1ms)。
  • 切换稳定性: 在视频录制过程中动态切换主摄与副摄,验证 HAL 是否出现闪黑或帧中断。
适配要点: 如果设备支持逻辑摄像头,HAL 必须在 camera_metadata 中正确填充 ANDROID_REQUEST_AVAILABLE_CAPABILITIES 中的 LOGICAL_MULTI_CAMERA 标记,否则 CTS 会直接跳过该测试项,导致兼容性扣分。
MultiCameraTest 逻辑与物理摄像头关系 逻辑摄像头 (ID=0) 物理 ID=0 (主摄) 物理 ID=2 (广角) 物理 ID=3 (长焦) 验证物理 ID 列表完整 验证并发打开无冲突 验证帧同步时间戳

3.5 PerformanceTest — 性能测试

PerformanceTest 不关注图像内容是否正确,而是聚焦于 HAL 层在时间与资源维度上的表现。这类测试通常有严格的阈值限制,一旦超标即判定为失败。

核心验证点:

  • 打开延迟: 从 openCamera 到 onOpened 回调的时间,通常要求 < 500ms。
  • 捕获延迟: 从 capture 到 onCaptureCompleted 的时间,通常要求 < 100ms。
  • 帧率吞吐量: 在最大分辨率下,HAL 必须达到配置的帧率(如 30fps)且不丢帧。
  • 内存占用: 在连续捕获 100 帧后,HAL 进程的内存增长不得超过 50MB。
常见失败原因: HAL 在首次打开摄像头时执行了过多的初始化操作(如加载 ISP 固件、校准数据),导致打开延迟超过 500ms。建议将耗时操作移至后台线程或延迟加载。
PerformanceTest 关键延迟阈值对比 打开延迟 < 500ms 捕获延迟 < 100ms 帧率吞吐量 ≥ 30fps HAL 适配检查清单 1. 检查 openCamera 中是否有阻塞式固件加载 2. 检查 capture 流程中是否有不必要的 memcpy 3. 检查帧率是否受限于 ISP 处理管线 4. 检查连续捕获时是否有内存泄漏

3.6 测试分类与 HAL 适配的关联

不同的 CTS 测试分类对 HAL 层的关注点差异显著。HAL 开发者在分析失败报告时,应首先根据测试分类定位问题域:

CTS 分类 HAL 层主要接口 常见失败根因 适配优先级
StillCaptureTest processCaptureRequest, flush JPEG 编码参数错误、3A 超时 高
VideoTest processCaptureRequest, configureStreams 帧率不达标、时间戳异常 高
MultiCameraTest getCameraIdList, isLogicalMultiCamera 物理 ID 映射错误、并发冲突 中
PerformanceTest openCamera, processCaptureRequest 延迟超标、内存泄漏 中
实战建议: 在 CTS 测试执行前,建议先针对 StillCaptureTest 和 VideoTest 进行预测试。这两个分类覆盖了 HAL 层 80% 以上的核心逻辑,提前修复可以大幅降低后续回归测试的失败率。