2. Camera HAL 架构解析:HAL3 vs HAL1 核心差异、Pipeline 模型、Camera Device 与 Camera Provider
2.1 HAL1 与 HAL3 核心差异
Android Camera HAL 从 HAL1 演进到 HAL3,本质是从“黑盒拍照”向“灵活 Pipeline 控制”的转变。HAL1 面向传统相机应用,操作简单但延迟高、灵活性差;HAL3 面向计算摄影,支持逐帧控制、多路流并发和零拷贝路径。
| 对比维度 | HAL1 | HAL3 |
|---|---|---|
| 操作模型 | 基于预览/拍照/录像的固定流程 | 基于 Capture Request / Result 的 Pipeline 模型 |
| 帧控制粒度 | 粗粒度,无法逐帧修改参数 | 逐帧指定 3A、AE、AF、AWB 等参数 |
| Stream 并发 | 通常只支持 1~2 路流 | 支持多路不同分辨率的流(YUV/RAW/JPEG) |
| Buffer 管理 | 应用层分配 Buffer,HAL 填充 | HAL 直接操作 Gralloc Buffer,支持零拷贝 |
| 延迟特性 | 预览延迟高,拍照需切换模式 | 低延迟,支持 ZSL(零快门延迟) |
| 适用场景 | 低端设备、传统相机应用 | 计算摄影、多帧合成、HDR+、夜景模式 |
调试要点: 在 logcat 中搜索
camera@1.0 或 camera@3.x 可快速判断设备当前使用的 HAL 版本。HAL3 设备若降级到 HAL1 兼容模式,通常会打印 legacy HAL 或 HAL1 fallback 关键字。
2.2 HAL3 Pipeline 模型
HAL3 的核心是 Capture Pipeline,它将一次拍照或预览分解为 Request → Processing → Result 的循环。应用层通过 ICameraDeviceSession::processCaptureRequest() 提交请求,HAL 按帧序号依次处理并返回结果。
Pipeline 调试技巧: 当出现预览卡顿或拍照黑帧时,重点检查
processCaptureRequest 的返回时间。HAL3 要求每个 Request 在 1 帧周期(通常 33ms)内完成,超时会触发 ERROR_REQUEST 回调。
2.3 Camera Device 与 Camera Provider
在 Android Treble 架构下,Camera HAL 被拆分为两个核心服务:
- Camera Provider:负责枚举设备、管理 HAL 库加载、提供
ICameraProvider接口。运行在独立的cameraserver进程中。 - Camera Device:代表单个物理或逻辑相机设备,实现
ICameraDevice和ICameraDeviceSession接口。每个设备对应一个 HAL 实例。
2.4 关键接口与调试入口
在实际调试中,以下接口是定位 HAL 问题的核心切入点:
| 接口 | 所属组件 | 典型调试场景 |
|---|---|---|
getCameraIdList() |
Camera Provider | 设备枚举失败,返回空列表 |
open() |
Camera Device | 打开相机超时或返回 NULL |
processCaptureRequest() |
Camera Device Session | 预览无画面、拍照无数据 |
flush() |
Camera Device Session | 切换分辨率或关闭时卡死 |
configureStreams() |
Camera Device Session | Stream 配置不兼容导致崩溃 |
常见陷阱: HAL3 下
configureStreams() 必须严格按照 CameraMetadata 中声明的 ANDROID_SCALER_AVAILABLE_STREAM_CONFIGURATIONS 来配置。如果应用请求了 HAL 不支持的输出格式(如 YUV420 但 HAL 只支持 NV12),Session 会直接返回 ERROR_STREAM_CONFIGURATION。
2.5 HAL1 到 HAL3 迁移路径
对于 legacy 设备,Android 提供了 HAL1 兼容层,允许 HAL1 实现运行在 HAL3 框架下。但兼容层会丢失 HAL3 的核心优势:
- 性能损失:兼容层需要额外的 Buffer 拷贝和格式转换。
- 功能受限:无法使用多帧合成、ZSL、RAW 流等特性。
- 调试复杂度:log 中会出现
legacy HAL和HAL1 adapter混杂信息。
调试建议: 在
cameraserver 的 log 中搜索 LegacyCameraDevice 或 HAL1Adapter,如果频繁出现,说明设备运行在兼容模式。此时应优先推动 HAL 升级到原生 HAL3,否则计算摄影类功能无法正常调试。