QCOM平台Camera HAL层开发与性能优化 - 第1节

1.1 Android Camera 架构简介

Android Camera 子系统采用分层架构设计,从上至下依次为 Application Framework、Camera Service、Camera HAL 以及 Kernel Driver。每一层都定义了清晰的接口边界,使得应用开发者、系统集成商和硬件厂商可以独立演进。

核心分层: Application → Camera2 API → Camera Service → HAL Interface → HAL Implementation → Kernel Driver

Android 从 API level 21(Android 5.0)开始全面推行 Camera2 API,取代了旧的 Camera1 API。Camera2 提供了更精细的流控制、每帧参数配置以及多摄像头支持,但同时也对 HAL 层的实现提出了更高的要求。

层级组件职责
应用层Camera2 API提供 Java/Kotlin 接口,管理 CaptureRequest、CaptureResult、CameraDevice
框架层Camera Service管理权限、会话、流配置;调用 HAL 接口完成实际操作
HAL 层Camera HAL (HIDL/AIDL)封装硬件差异,提供标准化的设备操作接口
内核层V4L2 / Camera Subsystem驱动 Sensor、ISP、Flash 等硬件外设
Android Camera 分层架构 Application (Camera2 API) Camera Service HAL Interface (HIDL / AIDL) Camera HAL Implementation (QCOM) Kernel Driver (V4L2 / MIPI / ISP)

1.2 HAL 层在系统中的位置与作用

Camera HAL 是 Android 相机系统中唯一与硬件直接交互的抽象层,位于 Camera Service 之下、Kernel Driver 之上。它的核心作用是屏蔽不同 SoC 平台(QCOM、MTK、Exynos 等)的硬件差异,向上提供统一的 ICameraDevice、ICameraDeviceSession 等接口。

HAL 层的关键职责

  • 设备管理: 枚举摄像头、打开/关闭设备、处理电源状态切换。
  • 流配置: 根据应用请求配置输出流(YUV、JPEG、RAW、HEIC)和输入流(Reprocess)。
  • 请求处理: 接收 CaptureRequest,驱动 ISP 完成曝光、增益、对焦、白平衡等 3A 操作。
  • 结果回调: 返回 CaptureResult 和 Buffer,包含元数据和图像数据。
  • 错误处理: 上报设备错误、请求超时、Buffer 丢失等异常。
关键理解: HAL 层是 Android 相机性能优化的主战场。帧率、延迟、功耗、图像质量等核心指标,最终都取决于 HAL 层对硬件流水线的调度效率。
方向接口/数据流说明
向下(HAL → Kernel)V4L2 ioctl / DMA-BUF / ION控制 Sensor、ISP、Flash;传递 Buffer 句柄
向上(HAL → Service)HIDL/AIDL 方法调用processCaptureRequest、configureStreams、flush
内部(HAL 模块间)Pipeline / Node GraphQCOM 平台内部使用 ChiNode 图编排处理链路

1.3 QCOM 平台 Camera HAL 的演进历史

Qualcomm 平台的 Camera HAL 经历了从 Legacy HAL 到 CamX + ChiNode 的重大架构变革。理解这一演进过程,对于维护旧平台和开发新平台都至关重要。

演进阶段总览

阶段Android 版本HAL 版本架构特点
Legacy HAL4.x – 6.xHAL1单一设备、同步操作、扩展性差
QCamera2 HAL5.x – 8.xHAL1 / HAL3引入 Pipeline 概念,支持 ZSL、HDR
CamX (Camera eXtension)9.x – 至今HAL3 (HIDL/AIDL)模块化、ChiNode 可插拔、多摄像头原生支持

Legacy HAL 阶段(Android 4.x – 6.x)

早期的 QCOM HAL 基于 mm-camera 架构,所有操作集中在单个 qcamera_device 中。每次请求都需要同步等待 ISP 完成,无法支持多路并发流。该阶段 HAL 代码与硬件耦合极深,移植到新平台几乎需要重写。

QCamera2 HAL 阶段(Android 5.x – 8.x)

随着 Android HAL3 接口的推出,QCOM 推出了 QCamera2 架构。它引入了 Pipeline 和 Stream 的概念,支持同时输出预览、拍照和视频流。QCamera2 仍然使用 mm-camera-interface 与内核通信,但内部增加了 ZSL(零快门延迟)和 HDR 等高级特性。

注意: QCamera2 虽然功能增强,但代码体积庞大(约 30 万行),模块间依赖混乱,调试和定制成本很高。从 Android 9 开始,QCOM 逐步淘汰该架构。

CamX + ChiNode 阶段(Android 9.x – 至今)

CamX(Camera eXtension)是 QCOM 当前主推的 HAL 架构,与 Android 的 Treble 和 HIDL 设计理念对齐。其核心设计原则是 模块化 和 可扩展:

  • ChiNode: 可插拔的处理节点,每个节点完成一个独立功能(如 3A、NR、HDR、EIS)。OEM 可以编写自定义 ChiNode 来替换或增强默认算法。
  • Usecase 驱动: 根据应用场景(预览、拍照、录像、高帧率)动态构建 Pipeline 图,而非固定流水线。
  • 多摄像头原生支持: 通过 ChiNode 图可以轻松组合主摄、广角、长焦、ToF 等 Sensor 的输出。
  • 跨平台兼容: CamX 抽象层将硬件差异限制在 Sensor 和 ISP 驱动层面,上层算法可以复用。
QCOM Camera HAL 架构演进 Legacy HAL mm-camera / 同步 QCamera2 HAL Pipeline / ZSL / HDR CamX + ChiNode 模块化 / 可插拔 Android 4.x – 6.x Android 5.x – 8.x Android 9.x – 至今 关键架构差异 • Legacy: 单设备、同步、无流复用 • QCamera2: 引入 Pipeline、支持多流、代码膨胀 • CamX: ChiNode 可插拔、Usecase 驱动、多摄原生、HIDL/AIDL • 迁移成本: Legacy → QCamera2 需重写驱动;QCamera2 → CamX 需重构 Pipeline 图

CamX 架构的核心组件

CamX 内部由以下关键模块构成,开发者需要重点掌握:

模块缩写功能
Camera HAL InterfaceCHI实现 HIDL/AIDL 接口,与 Camera Service 通信
ChiNode—可插拔处理节点,每个节点封装一个算法或硬件操作
UsecaseUC定义应用场景的 Pipeline 图,决定哪些 ChiNode 参与处理
PipelinePLChiNode 的执行顺序和依赖关系,由 Usecase 动态生成
Sensor ManagerSM管理 Sensor 驱动、模式切换、曝光参数下发
Stats ManagerStats处理 ISP 统计信息,驱动 3A 算法
开发建议: 在 QCOM 新平台(如 SM8550、SM8650)上,OEM 定制相机功能的主要方式是通过编写自定义 ChiNode 和调整 Usecase 配置,而非修改 HAL 核心代码。这大大降低了集成和升级的难度。