Android Camera HAL架构从原理到实战项目 - 第1节
1.1 Android Camera 系统整体架构
Android Camera 系统采用分层架构设计,从上至下依次为 应用层、框架层、HAL 层 和 内核驱动层。每一层都封装了特定的职责,并通过稳定的接口与相邻层通信。理解这一分层结构是掌握 Camera HAL 的基础。
核心要点: 应用层通过 Binder IPC 调用框架层的 CameraService,CameraService 再通过 HAL 接口调用具体的硬件实现。这种分层设计使得上层应用无需关心底层硬件差异。
1.2 HAL 层的作用与定位
HAL(Hardware Abstraction Layer,硬件抽象层)位于 Android 框架层与内核驱动层之间,其核心作用是 解耦。它定义了一套标准接口,使得 Android 系统无需关心底层硬件的具体实现细节,厂商只需按照接口规范实现 HAL 模块即可。
HAL 层的三大核心职责
| 职责 | 说明 | 关键影响 |
|---|---|---|
| 硬件抽象 | 将不同厂商、不同型号的 Camera 硬件差异封装在 HAL 内部,向上层提供统一的接口 | 应用层无需修改即可适配不同硬件 |
| 性能优化 | 允许厂商在 HAL 层实现硬件加速、ISP 调优、3A 算法(自动对焦/自动曝光/自动白平衡)等 | 直接影响拍照速度、画质和功耗 |
| 功能扩展 | 厂商可通过 HAL 层添加私有特性,如美颜、HDR、夜景模式、多帧合成等 | 形成产品差异化竞争力 |
实战视角: 在 Android 系统启动时,CameraService 会通过
hw_get_module() 或 Treble 架构下的 HIDL 服务加载 HAL 模块。如果 HAL 实现不符合规范,轻则功能异常,重则导致系统无法识别 Camera 设备。
1.3 HAL 版本演进:HAL1 vs HAL3
Android Camera HAL 经历了从 HAL1 到 HAL3 的重大演进。HAL1 是早期版本,设计简单但功能有限;HAL3 是当前主流版本,提供了更强大的控制能力和更高的性能。理解两者的差异对于 Camera 开发和调试至关重要。
HAL1 架构特点
- 单线程模型: 预览、拍照、录像等操作串行执行,无法并发。
- 固定流水线: 数据流路径固定,应用层无法灵活配置输出格式和分辨率。
- 延迟较高: 从请求到帧输出的延迟较大,不适合实时性要求高的场景。
- 兼容性: 在低端设备或旧版 Android 系统中仍有使用。
HAL3 架构特点
- 多线程并发: 支持多个请求同时处理,预览、拍照、录像可并行。
- 灵活配置: 应用层可精确控制每一帧的曝光、增益、对焦、白平衡等参数。
- 低延迟: 支持基于请求-响应的流水线模型,帧延迟显著降低。
- 多路输出: 支持同时输出不同分辨率、不同格式的帧数据。
- 强制要求: Android 8.0 及以上版本要求所有新设备必须支持 HAL3。
重要提示: 虽然 HAL3 是主流,但部分老旧设备或特殊硬件(如外接 USB Camera)可能仍使用 HAL1。在开发兼容性应用时,需要同时考虑两种 HAL 版本的支持。
HAL1 与 HAL3 核心接口对比
| 对比维度 | HAL1 | HAL3 |
|---|---|---|
| 模块结构体 | camera_module_t |
camera_module_t(扩展) |
| 设备结构体 | camera_device_t |
camera3_device_t |
| 操作接口 | start_preview() / take_picture() |
process_capture_request() / flush() |
| 数据回调 | data_callback() / data_callback_timestamp() |
process_capture_result() |
| 流配置 | 固定流(预览/拍照/录像) | configure_streams() 灵活配置 |
| 元数据 | 有限参数(通过 set_parameters()) |
完整 CameraMetadata(基于 capture_request) |
代码示例:HAL3 核心请求处理流程
// HAL3 处理一个 capture request 的典型流程
int camera3_device::process_capture_request(
const camera3_capture_request_t *request) {
// 1. 解析请求中的 metadata
CameraMetadata metadata(request->settings);
int32_t sensitivity = metadata.find(ANDROID_SENSOR_SENSITIVITY);
// 2. 获取输出 buffer
const camera3_stream_buffer_t *output_buffers = request->output_buffers;
// 3. 驱动 ISP 处理帧数据
isp_driver->set_sensitivity(sensitivity);
isp_driver->capture(output_buffers[0].buffer);
// 4. 构造结果并回调
camera3_capture_result_t result;
result.frame_number = request->frame_number;
result.result = build_result_metadata();
result.num_output_buffers = 1;
result.output_buffers = output_buffers;
callback->process_capture_result(&result);
return OK;
}
版本选择建议
- 新项目开发: 优先使用 HAL3,充分利用其高性能和灵活性。
- 兼容性适配: 对于 Android 8.0 以下设备,需同时支持 HAL1 和 HAL3。
- 性能敏感场景: 如实时滤镜、AR/VR、高速连拍等,必须使用 HAL3。
- 低端硬件: 若硬件不支持 HAL3 所需特性(如 ISP 可编程),则只能使用 HAL1。
调试技巧: 通过
adb shell dumpsys media.camera 可以查看当前设备支持的 HAL 版本和 Camera 特性。如果输出中 halVersion 为 3,则表示设备运行在 HAL3 模式。