QCOM平台Camera HAL层开发与性能优化 - 第1节
1.1 Android Camera 架构简介
Android Camera 子系统采用分层架构设计,从上至下依次为 Application Framework、Camera Service、Camera HAL 以及 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 等硬件外设 |
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 → Kernel) | V4L2 ioctl / DMA-BUF / ION | 控制 Sensor、ISP、Flash;传递 Buffer 句柄 |
| 向上(HAL → Service) | HIDL/AIDL 方法调用 | processCaptureRequest、configureStreams、flush |
| 内部(HAL 模块间) | Pipeline / Node Graph | QCOM 平台内部使用 ChiNode 图编排处理链路 |
1.3 QCOM 平台 Camera HAL 的演进历史
Qualcomm 平台的 Camera HAL 经历了从 Legacy HAL 到 CamX + ChiNode 的重大架构变革。理解这一演进过程,对于维护旧平台和开发新平台都至关重要。
演进阶段总览
| 阶段 | Android 版本 | HAL 版本 | 架构特点 |
|---|---|---|---|
| Legacy HAL | 4.x – 6.x | HAL1 | 单一设备、同步操作、扩展性差 |
| QCamera2 HAL | 5.x – 8.x | HAL1 / 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 等高级特性。
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 驱动层面,上层算法可以复用。
CamX 架构的核心组件
CamX 内部由以下关键模块构成,开发者需要重点掌握:
| 模块 | 缩写 | 功能 |
|---|---|---|
| Camera HAL Interface | CHI | 实现 HIDL/AIDL 接口,与 Camera Service 通信 |
| ChiNode | — | 可插拔处理节点,每个节点封装一个算法或硬件操作 |
| Usecase | UC | 定义应用场景的 Pipeline 图,决定哪些 ChiNode 参与处理 |
| Pipeline | PL | ChiNode 的执行顺序和依赖关系,由 Usecase 动态生成 |
| Sensor Manager | SM | 管理 Sensor 驱动、模式切换、曝光参数下发 |
| Stats Manager | Stats | 处理 ISP 统计信息,驱动 3A 算法 |