1. Camera HAL 概述

Camera HAL(Hardware Abstraction Layer)是 Android 相机系统中连接 Framework 与底层硬件驱动的关键中间层。它定义了统一的接口规范,使上层应用无需关心具体硬件实现,同时为芯片厂商(如 Qualcomm、MediaTek、Rockchip)提供硬件适配的标准化入口。

1.1 Camera HAL 在 Android 系统中的位置

从 Android 相机软件栈的纵向分层来看,Camera HAL 位于 Camera Service 与 Kernel Driver 之间,承担“承上启下”的角色:

  • 上层:Application → Camera2 API → Camera Service(CameraManager / CameraDevice)
  • 中间层:Camera HAL(HAL 接口 + 厂商实现库)
  • 下层:Kernel V4L2 / ISP Driver → Sensor / Flash / Actuator 硬件
关键定位:HAL 是 Android 系统唯一允许以闭源二进制形式存在的相机组件,芯片厂商通过 HAL 层封装硬件差异,Google 通过 CTS / VTS 测试保证 HAL 接口兼容性。
Android 相机软件栈 — Camera HAL 位置 Application(相机 App) Camera2 API / Camera Service Camera HAL(HAL3 / HAL1 接口) 厂商闭源实现库(libcamera_xxx.so) Kernel V4L2 / ISP Driver Sensor / Flash / Actuator 硬件 HAL 是唯一闭源层 厂商适配 + CTS 验证

1.2 HAL 层的作用

Camera HAL 的核心职责可以归纳为以下五个方面:

作用维度 具体说明 调试关注点
接口标准化 定义统一的 camera_device / camera3_device 结构体,Framework 通过 HAL 接口下发请求、获取结果 接口版本对齐、函数指针完整性
硬件抽象 屏蔽不同 Sensor、ISP、Flash 的寄存器差异,向上提供一致的流处理能力 Sensor 驱动适配、ISP pipeline 配置
流管理 管理预览、拍照、录像等数据流的创建、配置、切换与销毁 Stream 配置冲突、buffer 申请/释放时序
元数据处理 负责 3A(AE/AWB/AF)状态上报、静态特性(static metadata)与动态结果(result metadata)的填充 metadata 字段完整性、3A 收敛速度
性能与功耗优化 通过 buffer 复用、帧率控制、ISP 时钟调节等手段平衡画质与功耗 帧率稳定性、CPU/GPU 负载、功耗曲线
调试经验:在实际项目中,80% 的相机稳定性问题(如预览黑屏、拍照卡顿、3A 不收敛)都可以追溯到 HAL 层的接口实现或 metadata 配置错误。掌握 HAL 层的调试方法是解决相机问题的第一步。

1.3 HAL3 与 HAL1 的区别

Android 从 5.0(Lollipop)开始引入 HAL3(Camera3),以替代早期的 HAL1(Camera1)。两者在设计理念、数据流模型、控制方式上存在本质差异:

对比维度 HAL1(Camera1) HAL3(Camera3)
引入版本 Android 1.0 ~ 4.4 Android 5.0+(推荐)
数据流模型 固定 pipeline:预览 → 拍照 → 录像,串行切换 请求-结果(Request-Result)模型,支持多路并发
控制粒度 粗粒度:setParameters() 全局设置 细粒度:每个 capture request 独立配置 3A、输出格式、ROI
Buffer 管理 HAL 内部管理 buffer,Framework 被动接收 Framework 通过 BufferQueue 传递 buffer,HAL 填充后返回
Metadata 机制 无标准 metadata,厂商自定义参数 标准化的 static / dynamic / control metadata 体系
多摄像头支持 仅支持单摄,切换需关闭再打开 原生支持多摄像头同时打开、同步输出
性能与延迟 延迟较高,pipeline 切换开销大 低延迟,支持高速连拍(30fps+ burst)
兼容性要求 CTS 覆盖少,厂商定制空间大 CTS / VTS 强制要求,接口一致性高
HAL1 与 HAL3 数据流模型对比 HAL1:固定串行 Pipeline setParameters() 预览流 拍照流 录像流 串行切换:预览→拍照→录像 切换需关闭当前流,重新配置 HAL3:并发 Request-Result 模型 Capture Request 1 Result 1(预览) Capture Request 2 Result 2(拍照) Capture Request 3 Result 3(录像) 并发请求:预览/拍照/录像可同时进行 每个 Request 独立配置 3A、ROI、输出格式

1.4 实际项目中的选型建议

  • 新项目一律使用 HAL3:Android 10 以后已强制要求 HAL3,HAL1 在 Android 12+ 中被标记为 deprecated。
  • 兼容旧平台(Android 4.4 以下):部分低端 IoT 设备仍使用 HAL1,但建议尽快迁移。
  • 调试工具链差异:HAL3 可使用 dumpsys media.camera、CameraMetadata 工具;HAL1 主要依赖 logcat + 厂商私有工具。
常见陷阱:部分厂商在 HAL3 实现中仍沿用 HAL1 的串行思维,导致多路并发时出现 buffer 死锁或帧率下降。调试时务必确认 HAL 层的 process_capture_request 是否支持乱序返回结果。