1. HAL3 架构概述
1.1 Android Camera HAL3 整体架构
Android Camera HAL3(Hardware Abstraction Layer 3)是 Android 系统从 5.0(Lollipop)开始引入的新一代相机硬件抽象层架构。与 HAL1 的“黑盒”设计不同,HAL3 采用流水线式(Pipeline)设计,将相机传感器、ISP(图像信号处理器)和算法模块抽象为可精细控制的逻辑单元,使上层应用能够以逐帧(Per-frame)粒度控制曝光、增益、对焦、白平衡等参数,并获取每帧的元数据(Metadata)。
HAL3 架构的核心设计目标包括:
- 逐帧控制(Per-frame Control):每一帧的 CaptureRequest 独立指定参数,互不干扰。
- 同步元数据(Synchronized Metadata):每帧的 CaptureResult 携带完整的传感器/ISP 状态快照。
- 高吞吐与低延迟:支持 ZSL(零快门延迟)、HDR、多帧融合等高级特性。
- CTS 可验证性:通过 android.hardware.camera2.cts 测试套件验证实现正确性。
关键概念: HAL3 将相机设备抽象为“管道”,应用通过发送 CaptureRequest 到管道,管道返回 CaptureResult。每个请求和结果都携带完整的控制参数和状态元数据,形成“请求-结果”的闭环。
1.2 核心组件详解
HAL3 架构由四个核心组件构成,它们共同定义了相机应用的编程模型:
| 组件 | 角色 | 关键职责 |
|---|---|---|
| CameraDevice | 相机设备抽象 | 代表物理或逻辑相机,管理设备状态、创建 CaptureSession |
| CameraCaptureSession | 捕获会话 | 管理请求队列、配置输出 Surface、处理帧回调 |
| CaptureRequest | 单帧请求 | 封装每帧的控制参数(曝光、增益、对焦等)及输出目标 |
| CaptureResult | 单帧结果 | 携带每帧的元数据(传感器状态、3A 状态、统计信息) |
1.2.1 CameraDevice
CameraDevice 是相机硬件的逻辑表示。应用通过 CameraManager.openCamera() 获取 CameraDevice 实例。它负责:
- 查询相机特性(
CameraCharacteristics),如传感器尺寸、支持的分辨率、AE/AF/AWB 模式。 - 创建
CameraCaptureSession,绑定输出 Surface(如 PreviewSurface、ImageReader)。 - 管理设备状态:
STATE_OPENED→STATE_ACTIVE→STATE_CLOSED。
1.2.2 CameraCaptureSession
CameraCaptureSession 是请求-结果循环的核心容器。它维护一个请求队列,按顺序将 CaptureRequest 发送到 HAL 层,并将返回的 CaptureResult 分发给回调。关键特性:
- 单次请求(Capture):发送单个请求,适用于拍照。
- 重复请求(Repeating Request):持续发送相同请求,适用于预览。
- 输出 Surface 配置:Session 创建时需指定所有输出 Surface,运行时不可更改。
性能提示: 在创建 CameraCaptureSession 时,应尽量复用已有的 Surface 对象,避免频繁重建 Session。每次重建都会导致 HAL 层重新配置硬件管道,引入 100-300ms 的延迟。
1.2.3 CaptureRequest
CaptureRequest 是 HAL3 逐帧控制的“指令单”。每个 CaptureRequest 包含:
- 目标 Surface 列表:指定帧数据输出到哪些 Surface。
- 控制参数(Metadata):如
CONTROL_AE_MODE、SENSOR_EXPOSURE_TIME、LENS_FOCUS_DISTANCE等。 - 标签(Tag):用于在回调中识别请求。
HAL3 要求每个 CaptureRequest 必须包含完整的控制参数集合,即使某些参数与上一帧相同。这保证了每帧的独立性。
1.2.4 CaptureResult
CaptureResult 是 HAL3 返回的“状态快照”。它包含:
- 传感器元数据:实际使用的曝光时间、增益、帧持续时间。
- 3A 状态:AE/AF/AWB 的锁定状态、收敛状态。
- 统计信息:如直方图、人脸检测结果、场景模式。
- 物理相机元数据(多摄场景):每个物理相机的独立状态。
CTS 验证要点: CaptureResult 必须包含所有在 CaptureRequest 中请求的元数据字段,且值必须在 CameraCharacteristics 声明的范围内。任何缺失或越界的元数据都会导致 CTS 测试项
android.hardware.camera2.cts.CaptureResultTest 失败。
1.3 架构设计要点总结
HAL3 架构的设计哲学可以概括为以下要点:
- 显式控制优于隐式行为:所有控制参数必须在 CaptureRequest 中显式设置,HAL 层不做“智能猜测”。
- 每帧独立性:每一帧的 CaptureRequest 和 CaptureResult 都是独立的,不依赖前后帧状态(除部分 3A 状态外)。
- 元数据驱动:CameraCharacteristics 定义了设备能力边界,CaptureResult 提供了每帧的精确状态,两者共同构成 HAL3 的“契约”。
- 流水线并行:HAL3 支持多请求流水线处理,允许应用在等待上一帧结果的同时发送下一帧请求,提升吞吐量。
性能优化切入点: 理解 HAL3 的流水线模型后,性能优化的核心方向包括:减少 Session 重建频率、优化 Request 元数据大小、利用重复请求减少 IPC 开销、以及合理配置输出 Surface 数量以降低内存带宽压力。