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 模型,支持每帧独立的参数控制与多路输出流。
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 的返回值是定位问题的第一步。
2.3 Pipeline 与 Request 流程
HAL3 的核心处理模型是 Pipeline(流水线)。每个 Request 进入 Pipeline 后,经过 ISP 处理、3A 算法、后处理等阶段,最终输出一帧或多帧结果。Pipeline 的设计决定了相机的延迟、吞吐量和功能支持。
2.3.1 Request 生命周期
- App 发起 Capture Request:通过 CameraCaptureSession.capture() 或 setRepeatingRequest() 提交。
- Framework 封装为 HAL Request:包含 metadata(AE/AWB/AF 参数、输出 buffer 列表等)。
- HAL 处理 Request:Pipeline 按序处理,调用底层驱动捕获原始数据。
- 返回 Capture Result:包含最终 metadata 和填充好的输出 buffer。
- Framework 回调 App:通过 CameraCaptureCallback 通知应用。
常见兼容性问题: HAL 未正确处理
processCaptureRequest 的同步或超时,导致 ANR 或预览卡顿。调试时应重点检查 Request ID 的连续性以及 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 阻塞点。