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 按帧序号依次处理并返回结果。

HAL3 Capture Pipeline 模型 App / Framework Capture Request HAL Pipeline Sensor ISP 3A PostProc Capture Result 关键特性 逐帧 Request/Result 配对 支持多路 Stream 并发
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 实例。
Camera Provider / Device 架构关系 Camera Framework HIDL / AIDL 接口层 Camera Provider getCameraIdList() Camera Device open() / processCaptureRequest() HAL 实现库 camera.xxx.so 调试关注点 Provider 启动失败 → 检查 HAL 库加载路径;Device open 失败 → 检查权限和 SELinux 策略

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,否则计算摄影类功能无法正常调试。