Android Camera HAL架构从原理到实战项目 - 第1节

1.1 Android Camera 系统整体架构

Android Camera 系统采用分层架构设计,从上至下依次为 应用层、框架层、HAL 层 和 内核驱动层。每一层都封装了特定的职责,并通过稳定的接口与相邻层通信。理解这一分层结构是掌握 Camera HAL 的基础。

核心要点: 应用层通过 Binder IPC 调用框架层的 CameraService,CameraService 再通过 HAL 接口调用具体的硬件实现。这种分层设计使得上层应用无需关心底层硬件差异。
Android Camera 系统分层架构 应用层 (Application Layer) Camera2 API / Camera1 API · 第三方相机 App · 系统相机 App 框架层 (Framework Layer) CameraService · CameraProvider · 权限管理 · 策略控制 HAL 层 (Hardware Abstraction Layer) Camera HAL3 / Camera HAL1 · 厂商实现 · 硬件抽象接口 内核驱动层 (Kernel Driver Layer) V4L2 驱动 · ISP 驱动 · Sensor 驱动 · MIPI CSI 接口 HAL 层是连接 Android 框架与硬件驱动的桥梁,是 Camera 系统性能与兼容性的关键

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 设备。
HAL 层在 Camera 系统中的定位 Android 框架层 CameraService CameraProvider HAL 层 camera_module_t camera3_device_t 内核驱动层 V4L2 驱动 Sensor 驱动 HAL 层的核心价值 1. 接口标准化:定义 camera_module_t / camera3_device_t 等标准结构体 2. 厂商自由实现:硬件初始化、流配置、帧处理等完全由厂商控制 3. 版本兼容:HAL1 和 HAL3 可共存,通过 get_number_of_cameras() 区分 4. 性能隔离:HAL 运行在独立进程(Treble 架构)或 CameraService 进程内 5. 调试便利:可通过 logcat 和 dumpsys 追踪 HAL 层行为

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 vs HAL3 架构对比 HAL1 架构(传统) 应用请求 HAL1 处理 固定输出 串行阻塞 HAL3 架构(现代) 请求队列 HAL3 处理 多路输出 并行流水线 HAL1 vs HAL3 关键差异 数据流模型: HAL1 固定流水线 vs HAL3 请求-响应流水线 并发能力: HAL1 串行处理 vs HAL3 多请求并行 控制粒度: HAL1 粗粒度(仅预览/拍照/录像) vs HAL3 细粒度(每帧参数控制) 输出灵活性: HAL1 单一输出流 vs HAL3 多路输出(不同分辨率/格式) 延迟表现: HAL1 高延迟(约 100-200ms) vs HAL3 低延迟(约 30-50ms) Android 版本要求: HAL1 兼容所有版本 vs HAL3 Android 8.0+ 强制要求

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 模式。