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。每个请求和结果都携带完整的控制参数和状态元数据,形成“请求-结果”的闭环。
HAL3 整体架构分层图 HAL3 整体架构分层图 应用层(App / Camera2 API) Framework 层(CameraService / CameraDeviceClient) HAL 层(Camera HAL3 Implementation) 内核 / 硬件层(Sensor / ISP / V4L2) 说明:HAL3 是 Framework 与硬件之间的桥梁,负责将上层请求转换为硬件指令,并返回元数据。

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 失败。
核心组件交互流程 核心组件交互流程 CameraDevice CameraCaptureSession CaptureRequest createCaptureSession() capture() / setRepeatingRequest() HAL 处理管道 下发请求 CaptureResult 返回结果 每帧一个 Request 对应一个 Result

1.3 架构设计要点总结

HAL3 架构的设计哲学可以概括为以下要点:

  1. 显式控制优于隐式行为:所有控制参数必须在 CaptureRequest 中显式设置,HAL 层不做“智能猜测”。
  2. 每帧独立性:每一帧的 CaptureRequest 和 CaptureResult 都是独立的,不依赖前后帧状态(除部分 3A 状态外)。
  3. 元数据驱动:CameraCharacteristics 定义了设备能力边界,CaptureResult 提供了每帧的精确状态,两者共同构成 HAL3 的“契约”。
  4. 流水线并行:HAL3 支持多请求流水线处理,允许应用在等待上一帧结果的同时发送下一帧请求,提升吞吐量。
性能优化切入点: 理解 HAL3 的流水线模型后,性能优化的核心方向包括:减少 Session 重建频率、优化 Request 元数据大小、利用重复请求减少 IPC 开销、以及合理配置输出 Surface 数量以降低内存带宽压力。