高通Camera HAL层HAL3适配工程案例 - 第1节

1.1 Android Camera HAL 架构演进

Android Camera HAL(硬件抽象层)是连接 Android 框架与底层 Camera 硬件的关键桥梁。从 Android 4.0 到 Android 14,HAL 架构经历了从 HAL1 到 HAL3 的重大演进,每一次迭代都旨在解决性能瓶颈、扩展功能边界并提升图像质量。

核心演进驱动力: 移动摄影从“拍照”转向“计算摄影”,需要更精细的硬件控制、更低的延迟以及更灵活的 ISP 管线调度能力。

1.1.1 架构演进时间线

Android 版本 HAL 版本 关键特性 局限性
4.0 (ICS) HAL1 简单预览/拍照,单路流 无法多路流,延迟高,无逐帧控制
4.4 (KitKat) HAL1.2 增加 HDR、连拍支持 仍基于 HAL1 架构,扩展性差
5.0 (Lollipop) HAL3 引入 Camera3 接口,逐帧控制,多路流 驱动适配复杂,需重写 ISP 管线
8.0 (Oreo) HAL3 + Treble HIDL 化,vendor 与 framework 解耦 接口标准化,但性能开销增加
12+ HAL3 + HIDL/AIDL 可选的 AIDL 接口,更低的 binder 延迟 需同时维护两套接口

1.1.2 架构演进 SVG 时间线

Android Camera HAL 架构演进时间线 HAL1 Android 4.0 HAL1.2 Android 4.4 HAL3 Android 5.0 HAL3+Treble Android 8.0 演进趋势 单路流 → 多路流 → 逐帧控制 → 框架/厂商解耦 → 低延迟 AIDL

1.2 HAL3 与 HAL1 核心区别

HAL3 并非 HAL1 的简单升级,而是对 Camera 控制模型的彻底重构。HAL1 采用“黑盒”模式,Framework 只能发起预览/拍照/录像等粗粒度操作;HAL3 则暴露了 ISP 管线的逐帧控制能力,使 Framework 和 App 能够精确控制每一帧的曝光、增益、白平衡、AE/AF/AWB 策略等参数。

1.2.1 核心差异对比表

对比维度 HAL1 HAL3
控制粒度 粗粒度(打开/关闭 Camera) 逐帧细粒度控制(per-frame controls)
数据流模型 单路流(预览/拍照/录像互斥) 多路流(同时输出预览、拍照、分析帧)
Buffer 管理 Framework 分配,HAL 填充 HAL 管理 Buffer 池,Framework 注册
3A 控制 HAL 内部自动完成 Framework 可下发 3A 策略,HAL 执行
元数据 无标准元数据通道 CaptureResult 携带完整元数据
多 Camera 协同 不支持 支持逻辑 Camera 和多物理 Camera 协同
延迟 预览启动延迟高(~500ms) 预览启动延迟低(~200ms)

1.2.2 控制模型对比 SVG

HAL1 vs HAL3 控制模型对比 HAL1 黑盒模型 Framework HAL1 黑盒 Sensor/ISP Framework 只能发起:startPreview() takePicture() / startRecording() 内部 3A 完全由 HAL 控制 HAL3 逐帧控制模型 Framework HAL3 管线 Sensor/ISP Framework 下发 CaptureRequest 包含:exposure/gain/awbMode/afMode HAL 返回 CaptureResult + 图像 Buffer

1.3 高通平台 HAL3 整体框架

高通平台的 Camera HAL3 实现基于 mm-camera 架构,经过多年演进已形成一套成熟的模块化软件栈。整体框架从上到下分为:Camera Service → Camera HAL3 → Chi (Camera Hardware Interface) → 底层驱动。

1.3.1 高通 HAL3 分层架构

层级 模块 职责 关键文件/接口
Framework CameraService 管理 Camera 生命周期,分发请求 ICameraService.hal
HAL 层 camera3_device 实现 HAL3 接口,管理 Stream/Request camera3.h, qcamera3HWI.cpp
Chi 层 chi_ops 高通自定义扩展,Usecase 管理 chi_api.h, chi_metadata.h
ISP 层 mm-camera-isp ISP 管线调度,3A 算法执行 isp_ops.h, aec/aec.c
驱动层 Kernel Sensor/CSIDriver 硬件寄存器配置,MIPI CSI 接收 msm_sensor.c, msm_isp.c

1.3.2 高通 HAL3 整体框架 SVG

高通平台 HAL3 整体框架 Android Framework / CameraService Camera HAL3 (camera3_device_t) Chi (Camera Hardware Interface) mm-camera (ISP / 3A / Sensor) Kernel Driver (V4L2 / MSM_CAM) 高通 HAL3 核心数据流:CaptureRequest → Chi Usecase → ISP Pipeline → Sensor → Buffer + Result

1.3.3 高通 HAL3 关键模块说明

  • camera3_device_t:HAL3 标准接口,包含 initialize()、configure_streams()、process_capture_request() 等核心函数。
  • Chi (Camera Hardware Interface):高通自定义扩展层,负责将标准 HAL3 请求映射到高通 ISP 管线。Chi 引入了 Usecase 概念,一个 Usecase 对应一组固定的 Stream 配置和 3A 策略。
  • mm-camera-isp:ISP 硬件抽象层,管理 Bayer 处理、Demosaic、降噪、色调映射等模块。3A 算法(AEC/AWB/AF)运行在此层。
  • Kernel Driver:基于 V4L2 框架的 MSM_CAM 驱动,负责 MIPI CSI 接收、时钟控制、GPIO 配置等底层操作。
工程提示: 在高通平台进行 HAL3 适配时,80% 的工作量集中在 Chi 层的 Usecase 配置和 ISP 调优上。理解 Chi 的 metadata 流转机制是掌握高通 HAL3 的关键。

1.3.4 高通 HAL3 数据流时序

  1. CameraService 调用 open() 打开 Camera 设备,返回 camera3_device_t 实例。
  2. configure_streams() 配置输出流(预览/拍照/录像)和输入流(YUV/RAW)。
  3. process_capture_request() 下发 CaptureRequest,包含 metadata 和 output buffers。
  4. Chi 解析 Request,选择对应的 Usecase,将请求拆分为 ISP 可执行的子任务。
  5. mm-camera-isp 执行 ISP 管线处理,3A 算法更新 metadata。
  6. process_capture_result() 回调返回 CaptureResult(含 metadata)和填充好的 buffers。
常见适配陷阱: HAL3 要求所有 Stream 必须在 configure_streams() 阶段一次性配置完成,后续不能动态增减。如果 App 在运行中需要切换分辨率或格式,必须重新调用 configure_streams(),这会导致预览中断约 200-500ms。