1. Camera HAL概述:Camera HAL在Android系统中的位置与作用、HAL3架构简介、HAL与Framework的交互流程
1.1 Camera HAL在Android系统中的位置与作用
Camera HAL(Hardware Abstraction Layer)是Android相机子系统中连接Framework与底层硬件驱动的关键中间层。它定义了统一的接口规范,使上层应用无需关心具体硬件实现细节,从而实现了“一次编写,多平台运行”的架构目标。
核心定位: HAL层是Android相机系统的“翻译官”与“隔离墙”——向上对Framework提供标准化的操作接口,向下屏蔽不同传感器、ISP、镜头模组等硬件的差异。
在Android系统分层架构中,Camera HAL位于以下位置:
| 系统层级 | 组件/模块 | 职责说明 |
|---|---|---|
| 应用层 | Camera App / 第三方应用 | 调用Android Camera API(如Camera2 API)发起拍照、录像、预览等请求 |
| Framework层 | CameraService / CameraProvider | 管理相机设备生命周期、权限控制、流配置协调,通过HIDL/AIDL与HAL通信 |
| HAL层 | Camera HAL(HAL3实现) | 实现硬件抽象接口,管理设备打开/关闭、请求处理、元数据生成、Buffer流转 |
| 内核层 | V4L2驱动 / Sensor驱动 / ISP驱动 | 直接控制硬件寄存器、图像传感器曝光、增益、帧同步等底层操作 |
HAL层的主要作用可归纳为:
- 接口标准化: 提供
camera3_device_ops_t和camera3_callback_ops_t等标准结构体,Framework无需感知硬件差异。 - 硬件抽象: 封装不同厂商的ISP、传感器、闪光灯、对焦马达等外设的控制逻辑。
- 性能隔离: 通过Buffer管理、请求队列调度、超时检测等机制,防止底层硬件异常直接导致Framework崩溃。
- 多摄协同: 在HAL层实现多摄像头同步、物理Camera切换、逻辑Camera合成等复杂功能。
1.2 HAL3架构简介
Android从5.0(Lollipop)开始引入Camera HAL3(即 camera3 架构),取代了旧的HAL1。HAL3基于 请求-结果(Request-Result) 模型,支持更精细的控制和更高的性能。
关键概念: HAL3的核心设计思想是将相机视为一个“可编程的流水线”——应用通过提交CaptureRequest描述期望的帧参数,HAL返回包含实际参数的CaptureResult。
HAL3架构的主要组件及关系如下:
HAL3架构相比HAL1的关键改进:
| 对比维度 | HAL1 | HAL3 |
|---|---|---|
| 控制模型 | 基于预览/拍照/录像的固定模式 | 基于CaptureRequest的灵活请求模型 |
| Buffer管理 | HAL内部管理,Framework被动接收 | Framework通过 dequeue/queue 与HAL共享Buffer |
| 元数据 | 有限的固定参数集 | 丰富的 camera_metadata_t,支持300+控制项 |
| 多摄支持 | 无原生支持,需厂商私有扩展 | 原生支持逻辑Camera和多物理Camera组合 |
| 性能 | 延迟较高,难以实现零拷贝 | 支持Gralloc Buffer直接传递,降低内存拷贝 |
1.3 HAL与Framework的交互流程
HAL与Framework的交互围绕 CaptureRequest → 硬件处理 → CaptureResult 这一闭环展开。以下是一次典型预览/拍照请求的完整交互流程:
交互流程中涉及的核心HAL接口函数:
// HAL设备打开时注册的操作函数表
typedef struct camera3_device_ops {
// 初始化设备,配置Stream
int (*initialize)(const struct camera3_device *,
const camera3_callback_ops_t *callback_ops);
// 配置输出流(分辨率、格式、用途等)
int (*configure_streams)(const struct camera3_device *,
camera3_stream_configuration_t *stream_list);
// 注册Buffer到Stream
int (*register_stream_buffers)(const struct camera3_device *,
const camera3_stream_buffer_set_t *buffer_set);
// 提交CaptureRequest(核心入口)
int (*process_capture_request)(const struct camera3_device *,
camera3_capture_request_t *request);
// 刷新未完成的请求
int (*flush)(const struct camera3_device *);
// 销毁设备
void (*close)(const struct camera3_device *);
} camera3_device_ops_t;
稳定性关键点: HAL的
process_capture_request() 必须在 request->settings 指定的超时时间内完成处理并回调。如果HAL因硬件异常无法及时返回Result,Framework会触发ANR或CameraService重启。实际移植中,建议在HAL层增加请求超时监控和看门狗机制。
交互流程中的关键时序约束:
- 请求提交到回调完成: 预览场景通常要求 < 33ms(30fps),拍照场景可放宽至100~200ms。
- Stream配置:
configure_streams()必须在500ms内返回,否则Framework认为HAL无响应。 - Buffer管理: HAL不能持有Framework的Buffer超过3帧时间,否则会导致预览卡顿或Buffer泄漏。