1. Camera HAL 概述:构建稳定相机系统的基石
Camera HAL(硬件抽象层)是 Android 相机子系统中连接 Framework 与底层硬件驱动的关键中间层。本章将系统阐述 HAL 在 Android 系统中的位置、设计哲学以及 HAL3 与 HAL1 的核心差异,为后续实战项目奠定理论基础。
1.1 Camera HAL 在 Android 系统中的位置
在 Android 相机软件栈中,Camera HAL 位于 应用层(Application) 与 内核驱动层(Kernel Driver) 之间,是 Framework 与硬件解耦的核心枢纽。其层级关系如下图所示:
关键角色:HAL 层屏蔽了不同厂商、不同传感器、不同 ISP 的硬件差异,为上层提供统一的相机操作接口。
实战要点:在嵌入式系统开发中,HAL 层通常以动态库(.so)形式存在,由 CameraService 在运行时加载。调试 HAL 问题时,常需要结合 logcat 与 kernel log 进行交叉定位。
1.2 HAL 层的作用与设计哲学
Camera HAL 的设计遵循 接口隔离 与 平台无关性 两大核心原则。其具体作用可归纳为以下五个方面:
| 作用维度 | 具体职责 | 设计体现 |
|---|---|---|
| 接口标准化 | 定义统一的 camera_device_t / camera3_device_t 结构体 | 所有厂商必须实现相同函数指针表 |
| 硬件抽象 | 封装 sensor、ISP、闪光灯、对焦马达等硬件操作 | 上层通过 open/close/process_capture 等接口调用 |
| 资源管理 | 管理 buffer 队列、同步 fence、stream 配置 | HAL 负责分配/释放 GPU/ISP 共享内存 |
| 性能优化 | 提供批处理、零拷贝、硬件加速路径 | HAL3 支持 request 流水线,减少 CPU 介入 |
| 错误隔离 | 硬件崩溃时 HAL 层捕获并上报,避免 Framework 挂死 | 通过 notify 回调传递 error 消息 |
设计哲学总结:HAL 层追求“薄而全”——接口层尽量薄,减少不必要的抽象开销;功能覆盖尽量全,确保所有硬件能力都能被上层发现和使用。
1.3 HAL3 与 HAL1 的核心区别
HAL1 是 Android 4.x 时代引入的早期接口,HAL3 随 Android 5.0 的 Camera2 API 一同推出。两者在架构、数据流、控制模型上存在本质差异。以下从六个关键维度进行对比:
| 对比维度 | HAL1 | HAL3 |
|---|---|---|
| 引入版本 | Android 4.0 (API 14) | Android 5.0 (API 21) |
| 控制模型 | 状态机模型(预览/拍照/录像状态切换) | 请求-响应模型(per-frame 控制) |
| 数据流 | 单路流,预览与拍照互斥 | 多路流,支持同时输出预览、拍照、视频 |
| Buffer 管理 | HAL 内部管理,Framework 被动接收 | Framework 通过 DequeueBuffer/QueueBuffer 管理 |
| 元数据 | 固定参数集,扩展性差 | 基于 capture_result 的灵活 metadata |
| 性能 | 延迟较高,无法利用硬件流水线 | 支持 pipeline 并行,延迟更低 |
HAL3 的请求-响应模型是其最核心的架构改进。每个 capture request 可以独立指定 AE/AWB/AF 模式、输出尺寸、格式、帧率等参数,实现了 逐帧精细控制。下图展示了 HAL3 的典型数据流:
迁移注意事项:从 HAL1 迁移到 HAL3 时,需要重新设计状态机逻辑。HAL1 的“先停止预览再切换参数”模式在 HAL3 中不再适用,取而代之的是通过 request 中的 android.control.* 字段动态调整。常见陷阱包括:未正确设置 ANDROID_CONTROL_CAPTURE_INTENT 导致 AE 锁定、未处理 partial result 导致预览卡顿。
1.4 实战选型建议
在实际项目中,选择 HAL1 还是 HAL3 取决于目标平台与功能需求:
- 低端嵌入式平台(如单核 Cortex-A7):若仅需基础拍照功能,HAL1 实现更简单、资源占用更低。
- 中高端平台(如骁龙 6/7 系列):优先选择 HAL3,以利用多路流、HDR、高帧率等高级特性。
- 兼容性要求高:部分平台同时保留 HAL1 和 HAL3 实现,通过 ro.camera.hal1.package 属性切换。
调试技巧:在开发阶段,可以通过
adb shell dumpsys media.camera 查看当前使用的 HAL 版本及设备信息。若发现 HAL3 设备未注册,检查 /vendor/etc/camera/camera_config.xml 中的 <hal3> 标签是否配置正确。