2. Camera HAL3 基础:架构、设备与流、Pipeline 与 Request 流程

Camera HAL3 是 Android Treble 架构中相机子系统的核心接口层,它定义了 Framework 与硬件厂商实现之间的标准契约。理解 HAL3 的架构、设备与流的关系以及 Pipeline 与 Request 流程,是进行兼容性调试的前提。

2.1 Camera HAL3 架构总览

HAL3 采用模块化分层设计,将相机控制抽象为三个主要层级:Framework、Camera HAL 与 Vendor Camera Driver。在 Treble 架构下,HAL 层通过 HIDL / AIDL 接口与 Framework 通信,实现了系统与供应商代码的解耦。

架构要点: HAL3 不再使用 HAL1 的同步回调模型,而是基于异步的 Capture Request / Result 模型,支持每帧独立的参数控制与多路输出流。
Camera HAL3 分层架构 Camera HAL3 分层架构(Treble 视角) Android Framework(CameraManager / CameraService) HAL 接口层(ICameraDevice / ICameraDeviceSession) Camera HAL 实现(Vendor HAL / CameraProvider) Vendor Camera Driver(Kernel / V4L2 / 私有驱动)

2.2 CameraDevice 与 CameraStream 的关系

在 HAL3 模型中,CameraDevice 代表一个物理或逻辑相机设备,而 CameraStream(流)是数据输出的通道。一个设备可以同时配置多个流,每个流具有独立的图像格式、分辨率和用途。

概念 角色 关键属性
CameraDevice 相机设备抽象,负责创建 Session 和配置流 ID、朝向、支持能力(static metadata)
CameraStream 图像数据输出通道,绑定到 Surface / BufferQueue 格式(YUV/JPEG/RAW)、分辨率、使用场景(PREVIEW/STILL_CAPTURE/VIDEO_RECORD)
CameraSession 流配置的会话上下文,管理 Pipeline 生命周期 包含一组 Stream 配置、输出目标列表
调试提示: 兼容性问题常出现在 Stream 配置阶段。例如,HAL 不支持同时输出 YUV_420_888 和 JPEG 流,或分辨率组合超出 ISP 限制。检查 configureStreams 的返回值是定位问题的第一步。
CameraDevice 与 Stream 关系 CameraDevice 与 CameraStream 关系 CameraDevice Stream 0: PREVIEW Stream 1: STILL_CAPTURE 格式: YUV_420_888 分辨率: 1920x1080 格式: JPEG 分辨率: 4000x3000

2.3 Pipeline 与 Request 流程

HAL3 的核心处理模型是 Pipeline(流水线)。每个 Request 进入 Pipeline 后,经过 ISP 处理、3A 算法、后处理等阶段,最终输出一帧或多帧结果。Pipeline 的设计决定了相机的延迟、吞吐量和功能支持。

2.3.1 Request 生命周期

  1. App 发起 Capture Request:通过 CameraCaptureSession.capture() 或 setRepeatingRequest() 提交。
  2. Framework 封装为 HAL Request:包含 metadata(AE/AWB/AF 参数、输出 buffer 列表等)。
  3. HAL 处理 Request:Pipeline 按序处理,调用底层驱动捕获原始数据。
  4. 返回 Capture Result:包含最终 metadata 和填充好的输出 buffer。
  5. Framework 回调 App:通过 CameraCaptureCallback 通知应用。
常见兼容性问题: HAL 未正确处理 processCaptureRequest 的同步或超时,导致 ANR 或预览卡顿。调试时应重点检查 Request ID 的连续性以及 Result 的返回顺序。
Pipeline 与 Request 流程 Pipeline 与 Request 处理流程 App 提交 Request Framework 封装 HAL Pipeline processCaptureRequest ISP 处理 + 3A 算法 返回 Capture Result Framework Callback App 接收 Result

2.4 关键数据结构与接口

HAL3 的核心接口定义在 hardware/libhardware/include/hardware/camera3.h 中。以下是开发者最常打交道的几个结构体:

结构体 / 接口 用途 调试关注点
camera3_device_t HAL 设备句柄,包含 ops 函数指针表 ops 是否全部实现,initialize 返回值
camera3_stream_t 描述单个输出流的格式、分辨率、使用场景 usage flags、max_buffers、format 兼容性
camera3_capture_request_t 一次捕获请求,包含 settings metadata 和 output buffers settings 是否完整、buffer 数量与 stream 匹配
camera3_capture_result_t 捕获结果,包含 result metadata 和 filled buffers result 是否包含所有请求的 metadata、partial_result 计数
process_capture_request() HAL 处理请求的核心入口 同步/异步处理、超时控制、错误返回
调试技巧: 使用 dumpsys media.camera 可以查看当前 CameraDevice 的 Session 状态、Stream 配置和未完成的 Request 队列。结合 logcat 中 Camera3-Device 和 Camera3-Stream 的日志,可以快速定位 Pipeline 阻塞点。

2.5 小结