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、元数据一致性
CTS 测试提示: 在 CTS 测试中,HAL3 是强制要求(Android 9+)。测试用例需覆盖多 Camera 同时打开、多请求并发、元数据动态变更等场景,以验证 HAL3 Pipeline 的稳定性。
迁移建议: 对于仍使用 HAL1 的旧设备,CTS 测试会跳过部分高级用例。建议厂商尽快迁移至 HAL3,以通过更全面的 CTS 测试项。
HAL1 vs HAL3 架构对比 HAL1 同步流式模型 单一预览流 固定参数集 逐帧同步等待 高延迟 · 低灵活性 HAL3 异步 Pipeline 模型 多请求并发(CaptureRequest) 动态元数据(Metadata) Pipeline 并行处理 低延迟 · 高灵活性

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 启动/重启、设备枚举正确性、跨进程调用稳定性。
稳定性风险: CameraProvider 进程异常退出会导致所有 Camera 设备不可用。CTS 测试中需验证 Provider 在异常场景下的恢复能力,例如通过 kill -9 模拟 Provider 崩溃后重新枚举设备。
CameraProvider 服务化架构 Android 框架层(CameraService / CameraManager) HIDL / AIDL 接口 CameraProvider 服务进程(独立进程) HAL3 实现 HAL1 实现(兼容) USB Camera

2.3 CameraDevice:设备抽象与生命周期

CameraDevice 是 Android 框架层对物理或逻辑 Camera 设备的抽象。每个 CameraDevice 对应一个 Camera ID,通过 CameraManager.openCamera() 获取。CTS 测试中,CameraDevice 的生命周期管理是验证 HAL 稳定性的核心。

CameraDevice 生命周期状态

  1. UNINITIALIZED: 初始状态,设备未打开。
  2. OPENED: 设备已打开,但未创建 Session。
  3. CONFIGURED: 已创建 CameraSession,配置了输出流。
  4. CAPTURING: 正在捕获帧数据。
  5. CLOSED: 设备已关闭,释放资源。
CTS 测试用例示例: 测试 CameraDevice 在 OPENED 状态下重复打开/关闭 100 次,验证 HAL 无内存泄漏或崩溃。代码片段如下:
// 重复打开/关闭 CameraDevice
for (int i = 0; i < 100; i++) {
    CameraDevice device = cameraManager.openCamera(cameraId, callback, handler);
    device.close();
}
CameraDevice 生命周期状态机 UNINITIALIZED OPENED CONFIGURED CAPTURING CLOSED

2.4 CameraSession:会话管理与多流配置

CameraSession 是 CameraDevice 创建后用于管理输出流和捕获请求的会话对象。在 HAL3 中,CameraSession 通过 createCaptureSession() 创建,支持多输出流(预览、拍照、视频)和重复请求。

CameraSession 核心接口

接口 描述 CTS 测试关注点
createCaptureSession() 创建会话,配置输出 Surface 多流配置正确性、Session 创建失败处理
setRepeatingRequest() 设置重复捕获请求(预览) 请求连续性、帧率稳定性
capture() 单次捕获请求(拍照) 单帧延迟、结果回调完整性
abortCaptures() 中止所有进行中的捕获 中止后状态恢复、无残留请求
close() 关闭会话,释放资源 资源释放完整性、无内存泄漏
多 Camera 场景测试: 在 CTS 测试中,需同时打开多个 CameraDevice 并创建各自的 CameraSession,验证 HAL 在多 Session 并发下的稳定性。例如,同时打开前置和后置 Camera,分别创建预览 Session,持续捕获 30 分钟。
CameraSession 多流配置与请求流程 CameraDevice CameraSession 预览流 拍照流 视频流 分析流 CaptureRequest 队列

2.5 多 Camera 场景下的 HAL 稳定性验证要点

在 CTS 测试中,针对多 Camera 场景的 HAL 稳定性验证,需重点关注以下方面:

  • 并发打开/关闭: 同时打开多个 CameraDevice,验证 HAL 无死锁或资源竞争。
  • Session 切换: 在不同 Camera 之间快速切换 Session,验证状态机正确性。
  • 元数据一致性: 多 Camera 同时捕获时,验证每个 Camera 的元数据(如曝光、白平衡)独立且正确。
  • 异常恢复: 模拟 HAL 崩溃、Provider 重启、Session 异常关闭等场景,验证框架恢复能力。
  • 内存泄漏检测: 长时间运行多 Camera 捕获,监控内存使用是否持续增长。
常见失败模式: 在多 Camera 场景下,HAL 可能出现以下问题:
  • CameraDevice 打开失败(返回 CAMERA_ERROR)。
  • Session 创建超时(超过 5 秒)。
  • 捕获请求丢失或重复回调。
  • 元数据字段值异常(如 ANDROID_SENSOR_TIMESTAMP 跳变)。
这些失败模式应作为 CTS 测试用例的覆盖重点。