1. Camera HAL概述:HAL在Android相机架构中的位置、HAL的主要职责、HAL版本演进(HAL1 vs HAL3)
1.1 Android相机整体架构分层
Android相机系统采用分层架构设计,从上至下依次为:应用层、框架层、HAL层和内核驱动层。其中,Camera HAL(Hardware Abstraction Layer)位于框架层与内核驱动之间,是连接Android相机服务与具体硬件实现的桥梁。
核心观点:HAL层是Android相机系统的“适配器”,它屏蔽了不同SoC平台和传感器厂商的硬件差异,为上层框架提供统一的接口标准。
1.2 Camera HAL在架构中的位置
从分层图中可以清晰看到,Camera HAL处于中间层的关键位置:
- 向上对接:CameraService通过HIDL(HAL Interface Definition Language)或Treble架构与HAL通信,下发控制命令并接收图像数据。
- 向下驱动:HAL直接操作内核驱动(如V4L2、Sensor驱动、ISP驱动),完成硬件初始化、流配置、帧捕获等底层操作。
- 平台适配:不同SoC厂商(Qualcomm、MediaTek、Exynos、麒麟)提供各自的HAL实现,但都遵循Android定义的HAL接口规范。
开发提示:在HAL开发中,你主要工作在HAL层和内核驱动层之间。理解HAL的边界职责,有助于快速定位问题是出在上层框架还是底层硬件。
1.3 Camera HAL的主要职责
Camera HAL承担以下五大核心职责:
| 职责领域 | 具体内容 | 关键接口/操作 |
|---|---|---|
| 设备管理 | 枚举相机设备、初始化/去初始化传感器、管理相机电源状态 | open()、close()、getCameraInfo() |
| 流配置 | 配置图像输出流(分辨率、格式、帧率)、管理Stream和Surface | configureStreams()、processCaptureRequest() |
| 帧捕获 | 接收上层请求、驱动ISP曝光、生成图像帧、返回Metadata | capture()、flush() |
| 3A控制 | 自动对焦(AF)、自动曝光(AE)、自动白平衡(AWB)算法集成 | set3aMode()、triggerAf() |
| 元数据管理 | 生成并返回Camera Metadata(静态能力、动态状态、控制参数) | getCameraCharacteristics()、getCaptureResult() |
1.4 HAL版本演进:HAL1 vs HAL3
Android相机HAL经历了从HAL1到HAL3的重大演进。HAL3是当前主流版本,HAL1仅用于兼容老旧设备。
1.5 HAL1与HAL3详细对比
| 对比维度 | HAL1 | HAL3 |
|---|---|---|
| 引入版本 | Android 4.0 (API 14) | Android 5.0 (API 21) |
| 线程模型 | 单线程,串行处理请求 | 多线程流水线,支持并发 |
| 请求模型 | 预览/拍照/录像各自独立接口 | 统一Capture Request + Result |
| 逐帧控制 | 不支持,只能全局设置 | 支持,每帧可独立设置参数 |
| 输出格式 | 主要YUV/JPEG | YUV、RAW、JPEG、HEIC、Depth |
| 元数据 | 有限,通过回调传递 | 丰富,CameraCharacteristics + CaptureResult |
| 适用场景 | 功能机、低端设备、兼容模式 | 中高端智能手机、专业相机应用 |
开发避坑:从HAL1迁移到HAL3时,最大的挑战是线程模型和请求流水线的重构。HAL3要求HAL实现者必须支持多线程并发访问,并且要正确处理请求的排队、超时和取消。如果底层硬件不支持多路并发,需要在HAL内部做同步和缓冲。
1.6 版本选择建议
在实际项目开发中,版本选择遵循以下原则:
- 新项目一律使用HAL3:Android 10+已强制要求HAL3,且Camera2 API完全依赖HAL3。
- HAL1仅用于兼容:老旧平台(如Android 4.x)或低端功能机可能仍需HAL1。
- Treble架构影响:Android 8.0引入Treble后,HAL被拆分为HIDL Service,HAL3与Treble结合更紧密。
- 性能考量:HAL3的流水线模型能充分发挥多核ISP和硬件加速能力,是高性能相机的基础。