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 提交后,会依次经过以下逻辑阶段:
- Request 解析与校验:HAL 服务端解析
CaptureRequest中的metadata,校验参数合法性(如 AE 模式、输出流格式)。 - Sensor 配置与曝光:根据请求中的
android.sensor.*参数配置传感器寄存器,执行曝光、增益、帧同步。 - ISP 处理:RAW 数据经过黑电平校正、去马赛克、白平衡、色彩校正、降噪、锐化等 ISP 流水线。
- 输出流分发:处理后的图像数据根据
StreamConfigurationMap分发到不同的输出 Surface(预览、编码、拍照)。 - Result 回传:HAL 填充
CaptureResult中的metadata(如实际曝光时间、AE 收敛状态),并回调给框架。
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分配和回收图形缓冲区,实现零拷贝传递。
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 状态机。