3. 预览启动延迟测试:测试原理、测试用例详解、关键指标
预览启动延迟是衡量相机应用从触发预览到第一帧画面显示到屏幕所经历的时间,直接影响用户的“即拍即得”体验。在 CTS (Compatibility Test Suite) 中,该测试项通过自动化手段精确测量 Open Camera Latency 和 First Frame Latency 两个核心指标,用于评估 Camera HAL 层与 Framework 层的协同效率。
核心优化目标: 将预览启动总延迟控制在 500ms 以内(高端设备目标 <300ms),其中 Open Camera Latency 应 < 200ms,First Frame Latency 应 < 300ms。
3.1 测试原理与流程
测试基于 Android 的 Camera2TestRule 和 CameraUtil 框架,通过注入时间戳并监听 CameraDevice.StateCallback 与 CaptureSession 的回调,精确记录各阶段耗时。其核心流程分为三个阶段:
- Camera Open 阶段: 从应用调用
CameraManager.openCamera()到收到onOpened()回调。 - Session 配置阶段: 从创建
CaptureRequest.Builder到CameraCaptureSession的onConfigured()回调。 - First Frame 阶段: 从首次调用
session.setRepeatingRequest()到第一个预览帧的onCaptureStarted()回调。
测试环境要求: 测试必须在暗室或均匀光照环境下进行,避免自动曝光/自动白平衡收敛时间干扰测量结果。测试前需确保设备无后台高负载进程,且屏幕亮度固定为 200 cd/m²。
3.2 测试用例详解
CTS 中与预览启动延迟相关的核心测试用例位于 android.hardware.camera2.cts.CameraTest 和 CameraExtensionTest 中。以下为关键用例及其验证要点:
| 测试用例名称 | 测试方法 | 验证指标 | HAL 关注点 |
|---|---|---|---|
testPreviewStartsWithinTimeout |
调用 CameraManager.openCamera() 后,等待 onOpened 回调,再创建 CaptureSession 并发送重复请求 | Open Camera Latency ≤ 500ms First Frame Latency ≤ 300ms |
Camera HAL open() 实现是否阻塞;Stream 配置是否耗时 |
testPreviewFirstFrameLatency |
在 onConfigured 回调中立即调用 setRepeatingRequest,记录 onCaptureStarted 时间 | First Frame Latency ≤ 300ms | HAL 的 processCaptureRequest 首次调用延迟;Sensor 启动时间 |
testCameraOpenLatency |
循环 10 次打开/关闭相机,取平均延迟 | Open Camera Latency ≤ 200ms(平均) | HAL open() 中资源初始化、ISP 启动、Sensor 上电时间 |
testPreviewLatencyAfterRotation |
旋转设备后重新打开预览,测量延迟 | 延迟增加 ≤ 50ms | HAL 是否重新配置 Sensor 方向;Stream 复用策略 |
常见失败原因: 测试用例
testPreviewStartsWithinTimeout 失败通常是因为 HAL 的 open() 实现中执行了耗时的 Sensor 校准或 ISP 初始化,导致 Open Camera Latency 超过 500ms 阈值。建议将非关键初始化延迟到第一次 processCaptureRequest 时执行。
3.3 关键指标详解
3.3.1 Open Camera Latency
该指标衡量从应用层调用 CameraManager.openCamera() 到 CameraDevice.StateCallback.onOpened() 被回调的时间间隔。它包含以下 HAL 层耗时:
- HAL open() 调用: 加载 Camera HAL 库、初始化 Sensor 驱动、上电 ISP。
- Stream Configuration 协商: Framework 与 HAL 之间确认输出流格式、分辨率、帧率。
- Session 创建: 分配内部缓冲区、创建请求队列。
优化方向:
- 实现 Lazy Initialization:将 Sensor 校准、AF 初始化等非关键操作推迟到首次预览帧请求时执行。
- 使用 Stream Configuration Cache:缓存常用配置(如 1080p/30fps)的 Stream 参数,避免重复协商。
- 减少 IPC 调用次数:合并 HAL open() 中的多个初始化步骤为一次批量操作。
3.3.2 First Frame Latency
该指标衡量从 CameraCaptureSession.setRepeatingRequest() 调用到第一个预览帧的 onCaptureStarted() 回调的时间。它直接反映 HAL 从接收到请求到输出第一帧图像的速度。
关键影响因素:
| 因素 | 典型延迟 | HAL 优化策略 |
|---|---|---|
| Sensor 启动时间 | 30-80ms | 保持 Sensor 在低功耗待机模式,减少上电时间 |
| ISP 管线初始化 | 20-50ms | 预分配 ISP 管线资源,避免首次请求时动态分配 |
| 3A 收敛时间 | 50-150ms | 使用上一次的 3A 参数作为初始值,减少收敛周期 |
| Buffer 分配 | 10-30ms | 使用 BufferQueue 预分配策略,避免首次请求时申请内存 |
3.4 HAL 优化方向总结
针对预览启动延迟测试,HAL 层优化应聚焦于以下三个方向:
| 优化方向 | 具体措施 | 预期收益 | 风险/注意事项 |
|---|---|---|---|
| 减少 HAL open() 阻塞 | 将 Sensor 校准、AF 初始化、ISP 固件加载等操作异步化或延迟执行 | Open Camera Latency 降低 30%-50% | 需确保首次预览帧时这些资源已就绪,否则可能导致 First Frame Latency 增加 |
| Stream 配置缓存 | 缓存常用分辨率/帧率的 Stream 配置参数,避免每次 open 都重新协商 | Open Camera Latency 降低 10%-20% | 需处理配置变更(如旋转)时的缓存失效 |
| 预分配 Buffer 与管线资源 | 在 HAL open() 阶段预分配 BufferQueue 和 ISP 管线资源 | First Frame Latency 降低 20%-40% | 增加内存占用,需根据设备内存容量平衡预分配数量 |
性能调优建议: 使用
adb shell dumpsys media.camera 查看每次预览启动的详细时间戳分解,定位具体瓶颈。重点关注 HAL open() 和 configureStreams() 的耗时,这两个函数通常占 Open Camera Latency 的 70% 以上。