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 的硬件差异,为上层提供统一的相机操作接口。
Android 相机软件栈层级结构 应用层(Camera App / API) Framework 层(CameraService / Camera2 API) Camera HAL 层(HAL3 / HAL1) 内核驱动层(V4L2 / Sensor Driver / ISP) 说明:HAL 层是 Framework 与硬件之间的“翻译官” 上层无需关心底层是 Qualcomm、MTK 还是 Exynos,HAL 统一接口
实战要点:在嵌入式系统开发中,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 的典型数据流:

HAL3 请求-响应数据流 CameraService capture_request HAL3 实现 capture_result ISP 处理 Sensor 输出 关键特性:每个 request 独立携带 metadata,支持 per-frame 参数切换 HAL3 内部维护多个 pipeline slot,实现流水线并行处理
迁移注意事项:从 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> 标签是否配置正确。