2. Camera HAL 架构:HAL3 vs HAL1、CameraProvider、CameraDevice、CameraSession
Camera HAL(Hardware Abstraction Layer)是 Android 相机框架中连接上层框架与底层硬件驱动的关键桥梁。在 CTS 测试中,理解 HAL 架构的演进与核心组件,是设计覆盖多 Camera 场景与验证 HAL 稳定性的基础。本节将深入剖析 HAL3 与 HAL1 的差异、CameraProvider 的服务化架构、CameraDevice 的设备抽象以及 CameraSession 的会话管理机制。
2.1 HAL3 vs HAL1:架构演进与核心差异
Android 相机 HAL 从 HAL1 演进到 HAL3,核心目标是提升性能、降低延迟并支持更复杂的多 Camera 场景。HAL1 基于流式同步模型,而 HAL3 引入了 Pipeline 异步模型和更精细的请求-结果控制。
| 对比维度 | HAL1 | HAL3 |
|---|---|---|
| 模型 | 同步流式模型 | 异步 Pipeline 模型 |
| 请求方式 | 单一预览/拍照流 | 多请求并发,支持 CaptureRequest |
| 元数据 | 固定参数集 | 动态元数据(Result/Request Metadata) |
| 多 Camera 支持 | 有限,需独立实例 | 原生支持多 Camera 同步 |
| 延迟 | 较高(逐帧等待) | 低延迟(Pipeline 并行处理) |
| CTS 测试重点 | 基本功能、稳定性 | 多流、多 Camera、元数据一致性 |
2.2 CameraProvider:HAL 的服务化封装
CameraProvider 是 Android 10 引入的 Treble 化组件,将 Camera HAL 封装为独立服务进程,通过 HIDL / AIDL 接口与框架通信。这种架构隔离了 HAL 实现与框架,提升了系统稳定性和可测试性。
- 职责: 枚举 Camera 设备、管理设备生命周期、提供 HAL 接口调用。
- 进程隔离: CameraProvider 运行在独立进程(cameraserver 或 provider 进程),崩溃不影响系统服务。
- 多 Provider 支持: 同一设备可存在多个 CameraProvider(如内置 Camera + USB Camera)。
- CTS 测试关注点: Provider 启动/重启、设备枚举正确性、跨进程调用稳定性。
kill -9 模拟 Provider 崩溃后重新枚举设备。
2.3 CameraDevice:设备抽象与生命周期
CameraDevice 是 Android 框架层对物理或逻辑 Camera 设备的抽象。每个 CameraDevice 对应一个 Camera ID,通过 CameraManager.openCamera() 获取。CTS 测试中,CameraDevice 的生命周期管理是验证 HAL 稳定性的核心。
CameraDevice 生命周期状态
- UNINITIALIZED: 初始状态,设备未打开。
- OPENED: 设备已打开,但未创建 Session。
- CONFIGURED: 已创建 CameraSession,配置了输出流。
- CAPTURING: 正在捕获帧数据。
- CLOSED: 设备已关闭,释放资源。
OPENED 状态下重复打开/关闭 100 次,验证 HAL 无内存泄漏或崩溃。代码片段如下:
// 重复打开/关闭 CameraDevice
for (int i = 0; i < 100; i++) {
CameraDevice device = cameraManager.openCamera(cameraId, callback, handler);
device.close();
}
2.4 CameraSession:会话管理与多流配置
CameraSession 是 CameraDevice 创建后用于管理输出流和捕获请求的会话对象。在 HAL3 中,CameraSession 通过 createCaptureSession() 创建,支持多输出流(预览、拍照、视频)和重复请求。
CameraSession 核心接口
| 接口 | 描述 | CTS 测试关注点 |
|---|---|---|
createCaptureSession() |
创建会话,配置输出 Surface | 多流配置正确性、Session 创建失败处理 |
setRepeatingRequest() |
设置重复捕获请求(预览) | 请求连续性、帧率稳定性 |
capture() |
单次捕获请求(拍照) | 单帧延迟、结果回调完整性 |
abortCaptures() |
中止所有进行中的捕获 | 中止后状态恢复、无残留请求 |
close() |
关闭会话,释放资源 | 资源释放完整性、无内存泄漏 |
2.5 多 Camera 场景下的 HAL 稳定性验证要点
在 CTS 测试中,针对多 Camera 场景的 HAL 稳定性验证,需重点关注以下方面:
- 并发打开/关闭: 同时打开多个 CameraDevice,验证 HAL 无死锁或资源竞争。
- Session 切换: 在不同 Camera 之间快速切换 Session,验证状态机正确性。
- 元数据一致性: 多 Camera 同时捕获时,验证每个 Camera 的元数据(如曝光、白平衡)独立且正确。
- 异常恢复: 模拟 HAL 崩溃、Provider 重启、Session 异常关闭等场景,验证框架恢复能力。
- 内存泄漏检测: 长时间运行多 Camera 捕获,监控内存使用是否持续增长。
- CameraDevice 打开失败(返回
CAMERA_ERROR)。 - Session 创建超时(超过 5 秒)。
- 捕获请求丢失或重复回调。
- 元数据字段值异常(如
ANDROID_SENSOR_TIMESTAMP跳变)。