1. HAL3 整体架构概述

1.1 Camera HAL3 的设计目标

Android Camera HAL3(Hardware Abstraction Layer 3)是 Android 从 5.0(API 21)开始引入的新一代相机硬件抽象层。其核心设计目标可归纳为以下四点:

  • 高性能零拷贝管道:支持 gralloc 图形缓冲区直接传递,避免 CPU 内存拷贝,满足 4K/60fps 甚至更高帧率的实时处理需求。
  • 逐帧精细控制:应用层通过 CaptureRequest 对每一帧的曝光、增益、对焦、ISP 参数进行独立配置,实现专业级摄影效果。
  • 多路流并发:同时支持预览、拍照、视频录制、深度图等多路输出流,且各流可配置不同的分辨率、格式和帧率。
  • 厂商扩展灵活性:通过 android.request.availableCapabilities 和 vendor tag 机制,允许 OEM 在不破坏框架兼容性的前提下添加私有功能。
设计哲学对比: HAL1 是“黑盒”模型,应用只能调用固定 API(如 startPreview、takePicture),无法干预内部处理流程;HAL3 则是“白盒”管道,每一帧的配置和结果都暴露给框架层。

1.2 Pipeline 模型详解

HAL3 的核心抽象是 Pipeline(管道),它将一次完整的图像捕获过程拆解为多个可配置的阶段。每个 CaptureRequest 提交后,会依次经过以下逻辑阶段:

  1. Request 解析与校验:HAL 服务端解析 CaptureRequest 中的 metadata,校验参数合法性(如 AE 模式、输出流格式)。
  2. Sensor 配置与曝光:根据请求中的 android.sensor.* 参数配置传感器寄存器,执行曝光、增益、帧同步。
  3. ISP 处理:RAW 数据经过黑电平校正、去马赛克、白平衡、色彩校正、降噪、锐化等 ISP 流水线。
  4. 输出流分发:处理后的图像数据根据 StreamConfigurationMap 分发到不同的输出 Surface(预览、编码、拍照)。
  5. Result 回传:HAL 填充 CaptureResult 中的 metadata(如实际曝光时间、AE 收敛状态),并回调给框架。
HAL3 Pipeline 核心流程 HAL3 Pipeline 核心流程 CaptureRequest 参数校验 Sensor 曝光 ISP 处理 输出分发 CaptureResult 每个阶段均可通过 CaptureRequest 参数独立控制,异常定位时需逐段检查 metadata 与硬件状态

1.3 HAL1 / HAL2 / HAL3 对比

下表从控制粒度、性能、兼容性等维度对比三代 HAL 架构:

对比维度 HAL1 HAL2(已废弃) HAL3
引入版本 Android 4.0 Android 4.2(实验性) Android 5.0
控制粒度 粗粒度(仅预览/拍照/录像) 中等(支持部分参数逐帧设置) 细粒度(逐帧全参数控制)
输出流模型 单路输出(需切换模式) 多路但限制多 多路并发,独立配置
零拷贝支持 有限(需 CPU 拷贝) 部分支持 完全零拷贝(gralloc 直接传递)
厂商扩展性 差(需修改框架) 中等 强(vendor tag + capabilities)
调试复杂度 低(黑盒) 中 高(需理解 Pipeline 各阶段)
实战提示: 目前 Android 主流设备均使用 HAL3。如果遇到老平台或特殊外设(如 USB Camera),可能回退到 HAL1 兼容模式。在 adb shell dumpsys media.camera 输出中可查看当前使用的 HAL 版本。

1.4 HAL3 软件架构分层

从软件栈视角,HAL3 位于 Camera Framework 与 Kernel Driver 之间,其内部结构可进一步拆分为:

  • Camera HAL 接口层:实现 camera3_device_t 结构体,提供 initialize()、configure_streams()、process_capture_request() 等核心接口。
  • Pipeline 调度器:管理请求队列,协调 Sensor、ISP、JPEG 编码器等硬件模块的并行执行。
  • 硬件抽象适配层:封装不同厂商的硬件寄存器操作,向上提供统一的 hal_core 接口。
  • Buffer 管理模块:通过 gralloc 分配和回收图形缓冲区,实现零拷贝传递。
HAL3 软件架构分层 HAL3 软件架构分层 Camera Framework (CameraService / CameraManager) Camera HAL 接口层 (camera3_device_t) Pipeline 调度器 (Request Queue / Stream Manager) 硬件抽象适配层 (Sensor / ISP / Flash 驱动封装) 异常定位时,需逐层排查:Framework 参数传递 → HAL 接口返回值 → Pipeline 调度状态 → 硬件寄存器

1.5 关键数据结构速览

HAL3 链路中,以下三个数据结构是参数校验与异常定位的核心:

数据结构 作用 常见异常字段
camera3_capture_request_t 描述一次捕获请求,包含 metadata、输出 buffer 列表 settings 指针为空、num_output_buffers 与流配置不匹配
camera3_stream_buffer_t 描述单个输出流的 buffer 信息 status 为 CAMERA3_BUFFER_STATUS_ERROR、acquire_fence 超时
camera3_capture_result_t HAL 返回的捕获结果,包含 metadata 和 buffer 状态 partial_result 未递增、result 中缺少关键 tag
常见陷阱: 在 HAL3 调试中,process_capture_request() 返回 -EINVAL 并不一定意味着参数错误——也可能是 Pipeline 尚未完成 configure_streams() 的配置。务必先检查 camera3_device_t.status 状态机。