1. Camera HAL 概述
Camera HAL(硬件抽象层)是 Android 相机子系统中连接 Framework 与底层硬件驱动的关键桥梁。本章从系统位置、设计哲学与版本演进三个维度,帮助开发者建立对 Camera HAL 的全局认知。
1.1 Camera HAL 在 Android 系统中的位置
在 Android 相机软件栈中,Camera HAL 位于 Android Framework 与 Kernel 驱动 之间,承担硬件无关接口定义与硬件相关实现的双重角色。其上下层关系如下:
Android Camera 软件栈(自上而下)
- 应用层:Camera2 API / Camera1 API(Java/Kotlin)
- Framework 层:CameraService、CameraDeviceClient、CameraProviderService
- HAL 层:Camera HAL(HAL1 / HAL3 实现)
- Kernel 层:V4L2、CSI、ISP 驱动、Sensor 驱动
- 硬件层:图像传感器、ISP、闪光灯、马达等物理器件
关键理解:HAL 层是 Android 相机系统的“分水岭”——Framework 侧只依赖 HAL 接口定义,不关心具体硬件实现;OEM 厂商只需实现 HAL 接口即可适配任意硬件平台。
1.2 HAL 层的作用与设计哲学
Camera HAL 的核心作用可归纳为以下四点:
| 作用维度 | 具体说明 |
|---|---|
| 硬件抽象 | 屏蔽不同 SoC、Sensor、ISP 的硬件差异,向上提供统一接口 |
| 生命周期管理 | 负责 Camera 设备的打开/关闭、流(Stream)的创建/销毁、请求的排队与分发 |
| 数据流控制 | 管理从 Sensor 原始数据到输出 Buffer(YUV/JPEG/RAW)的完整 Pipeline |
| 性能与功耗优化 | 在 HAL 层实现帧率控制、Buffer 复用、低功耗预览等硬件级优化策略 |
HAL 层的设计哲学遵循 Android 平台一贯的 “接口与实现分离” 原则:
- 接口稳定:HAL 接口由 Android 平台定义(hardware/libhardware/include/hardware/camera.h),跨版本保持二进制兼容。
- 实现灵活:OEM 厂商可自由选择用户态实现方式(纯 CPU、GPU 辅助、DSP 卸载、专用 ISP 硬件等)。
- 解耦测试:HAL 层可独立于 Framework 进行单元测试与性能基准测试,降低集成风险。
1.3 HAL1 与 HAL3 的区别
Android 相机 HAL 经历了从 HAL1 到 HAL3 的重大演进。HAL1 是 Android 4.0 引入的早期版本,HAL3 从 Android 5.0 开始成为主流。两者在架构、数据流模型、控制粒度上存在本质差异。
以下表格从关键维度对比 HAL1 与 HAL3 的核心差异:
| 对比维度 | HAL1 | HAL3 |
|---|---|---|
| 引入版本 | Android 4.0 (API 14) | Android 5.0 (API 21) |
| 数据流模型 | 同步阻塞式,一次只处理一个操作 | 异步请求驱动,支持 Pipeline 并行处理 |
| 参数控制粒度 | 全局参数,切换模式需重新配置 | per-frame 参数,每帧可独立设置 3A/曝光/增益 |
| Buffer 管理 | HAL 内部管理 Buffer 分配与回收 | Framework 通过 Gralloc 管理 Buffer,HAL 只消费/生产 |
| 多路流支持 | 不支持同时多路流(预览+拍照需切换) | 原生支持多路流(如同时预览、拍照、录像) |
| 性能特征 | 延迟较高,帧率受限 | 低延迟,高帧率,适合 HDR/高帧率录像 |
| 实现复杂度 | 较低,适合功能简单的设备 | 较高,需要处理异步回调与 Pipeline 状态机 |
开发建议:新项目应优先选择 HAL3 实现。HAL1 仅在兼容老旧平台(Android 4.x 及以下)或极低端硬件时考虑。Google 已从 Android 8.0 开始逐步废弃 HAL1 支持。