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。
3.3 VideoTest — 视频录制测试
VideoTest 主要验证 HAL 层在视频流模式下的行为。与静态捕获不同,视频测试对帧率稳定性、编码器交互以及音视频同步有更高要求。
核心验证点:
- 编码器配置: 确保 HAL 输出的视频帧格式(如 NV12、NV21)与 MediaCodec 的输入要求匹配。
- 帧率一致性: 在 30fps 或 60fps 配置下,实际输出帧率波动不得超过 ±5%。
- 视频快照: 在视频录制过程中同时捕获静态图像,验证 HAL 是否支持 YUV 与 JPEG 并发输出。
- 防抖支持: 验证电子防抖 (EIS) 或光学防抖 (OIS) 开启后,裁剪区域与时间戳的正确性。
常见陷阱: 部分 HAL 在视频录制开始时返回的第一帧时间戳为 0,导致 CTS 音视频同步测试失败。HAL 层必须确保
ACAMERA_SENSOR_TIMESTAMP 在视频流中始终为单调递增且非零值。
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 会直接跳过该测试项,导致兼容性扣分。
3.5 PerformanceTest — 性能测试
PerformanceTest 不关注图像内容是否正确,而是聚焦于 HAL 层在时间与资源维度上的表现。这类测试通常有严格的阈值限制,一旦超标即判定为失败。
核心验证点:
- 打开延迟: 从
openCamera到onOpened回调的时间,通常要求 < 500ms。 - 捕获延迟: 从
capture到onCaptureCompleted的时间,通常要求 < 100ms。 - 帧率吞吐量: 在最大分辨率下,HAL 必须达到配置的帧率(如 30fps)且不丢帧。
- 内存占用: 在连续捕获 100 帧后,HAL 进程的内存增长不得超过 50MB。
常见失败原因: HAL 在首次打开摄像头时执行了过多的初始化操作(如加载 ISP 固件、校准数据),导致打开延迟超过 500ms。建议将耗时操作移至后台线程或延迟加载。
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% 以上的核心逻辑,提前修复可以大幅降低后续回归测试的失败率。