2. Camera HAL 架构:Android Camera HAL3 架构详解、HAL 接口层、HAL 实现层、vendor 层

Android Camera HAL3 架构是 CTS 兼容性测试的核心验证对象。HAL3 通过重新定义相机管道模型,将控制权从 HAL 上移至框架层,实现了更灵活的流配置和更低的拍照延迟。理解 HAL3 的分层结构,是定位 CTS 失败根因、优化 vendor 实现的前提。

2.1 HAL3 整体分层模型

HAL3 架构自底向上分为三层:Vendor 层(硬件驱动与传感器)、HAL 实现层(Camera HAL 模块与设备接口)、HAL 接口层(Android 框架定义的抽象接口)。框架层通过 camera3_device_t 和 camera3_callback_ops_t 与 HAL 实现交互。

关键设计原则:HAL3 采用"管道 + 捕获请求"模型,框架下发捕获请求(Capture Request),HAL 返回捕获结果(Capture Result),所有元数据通过 camera_metadata_t 传递,不再依赖传统回调函数传递参数。
Camera HAL3 分层架构图 Android 框架层(Camera Framework) HAL 接口层(camera3_device_t / camera3_callback_ops_t) HAL 实现层(Camera HAL Module + Device) Vendor 层(Kernel Driver / Sensor / ISP) 说明 框架层通过 HAL 接口层下发 Capture Request,HAL 实现层调用 Vendor 层驱动完成图像采集与处理。 CTS 测试覆盖从接口层到 Vendor 层的完整数据通路。

2.2 HAL 接口层详解

HAL 接口层由 Android 框架定义,位于 hardware/libhardware/include/hardware/camera3.h。核心接口包括:

接口结构体 职责 关键函数指针
camera3_device_t 代表一个 Camera 设备实例,提供操作入口 initialize(), configure_streams(), process_capture_request(), flush()
camera3_callback_ops_t 框架注册给 HAL 的回调,用于返回结果 process_capture_result(), notify()
camera3_stream_t 描述一个数据流(预览/拍照/视频) stream_type, width, height, format, usage
camera3_capture_request_t 一次捕获请求的完整描述 frame_number, settings, input_buffer, num_output_buffers
CTS 关注点:接口层必须严格遵循 AOSP 定义的函数签名和语义。例如 configure_streams() 必须支持 HAL_PIXEL_FORMAT_IMPLEMENTATION_DEFINED 格式,否则 CTS TestStreamConfiguration 用例将失败。

2.3 HAL 实现层核心模块

HAL 实现层是 vendor 工程师的主要开发阵地,包含以下核心模块:

  • Camera HAL Module:通过 HAL_MODULE_INFO_SYM 导出,提供 get_number_of_cameras() 和 get_camera_info() 接口。
  • Camera Device:实现 camera3_device_t 的全部函数指针,管理流配置、请求处理和结果返回。
  • Metadata 管理器:负责构建和解析 camera_metadata_t,处理静态信息(ANDROID_SENSOR_INFO_*)和动态结果(ANDROID_SENSOR_TIMESTAMP)。
  • Buffer 管理模块:管理 camera3_stream_buffer_t 的分配、锁定和释放,支持 GRALLOC_USAGE_HW_CAMERA_WRITE 等标志。
HAL 实现层内部模块关系 Camera Device HAL Module Metadata 管理器 Buffer 管理模块 Stream 配置器 模块协作流程 1. HAL Module 枚举 Camera 设备 → 2. Camera Device 接收 configure_streams() 请求 3. Stream 配置器与 Buffer 管理模块协作分配内存 → 4. Metadata 管理器填充结果返回框架

2.4 Vendor 层职责与接口

Vendor 层是 HAL 实现层与硬件之间的桥梁,通常包含:

  • Kernel 驱动:V4L2 或自定义驱动,负责传感器控制、ISP 配置和 DMA 传输。
  • Sensor 抽象层:封装不同传感器(Sony/OV/Samsung)的寄存器配置和初始化序列。
  • ISP 固件接口:通过 ioctl 或 MMIO 与 ISP 固件通信,完成 3A(AE/AWB/AF)计算。
  • Buffer 提供者:通过 ION 或 DMA-BUF 分配物理连续内存,供 ISP 写入图像数据。
CTS 常见失败场景:Vendor 层未正确实现 ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE 与 ANDROID_SENSOR_INFO_ACTIVE_ARRAY_SIZE 的映射关系,导致 CTS TestSensorInfo 用例失败。务必在 Vendor 层验证传感器裁剪区域与 HAL 上报的静态元数据一致。

2.5 关键数据结构对比

数据结构 所属层 CTS 验证项 常见错误
camera_metadata_t 接口层 / 实现层 Tag 完整性、值范围、类型匹配 缺少强制 Tag、枚举值越界
camera3_stream_buffer_t 实现层 Buffer 状态转换、AcquireFence 信号 Fence 未正确等待、Buffer 泄漏
camera3_capture_result_t 接口层 Partial result 顺序、Frame number 连续性 Partial result 乱序、重复 Frame number
v4l2_buffer Vendor 层 Timestamp 精度、Plane 数量 Timestamp 单位错误、Plane 偏移计算错误

2.6 请求处理流程(Pipeline)

一次典型的 HAL3 捕获请求处理流程如下:

  1. 框架下发请求:调用 process_capture_request(),传入 camera3_capture_request_t,包含 settings 和 output buffers。
  2. HAL 解析元数据:从 settings 中提取 3A 参数、输出尺寸、格式等。
  3. Vendor 层驱动调用:通过 ioctl 配置传感器曝光时间、增益、帧间隔。
  4. ISP 处理:原始 Bayer 数据经过黑电平校正、去马赛克、颜色校正、Gamma 等管线。
  5. 填充结果:HAL 将处理后的图像写入 output buffer,构造 camera3_capture_result_t,调用 process_capture_result() 回调。
  6. Fence 同步:通过 AcquireFence 和 ReleaseFence 保证 Buffer 访问同步。
HAL3 捕获请求处理流程 框架下发请求 HAL 解析元数据 Vendor 驱动调用 ISP 管线处理 填充结果回调 Fence 同步 虚线表示结果数据流回 HAL 实线表示请求下发路径

2.7 CTS 对 HAL3 架构的验证要点

  • 接口完整性:所有 camera3_device_t 函数指针必须非空,initialize() 必须正确注册回调。
  • 流配置合规性:configure_streams() 必须支持 CAMERA3_STREAM_OUTPUT 和 CAMERA3_STREAM_INPUT 类型,且返回 CAMERA3_STATUS_OK 或明确的错误码。
  • 元数据一致性:静态元数据(ANDROID_STATIC_METADATA)必须与 Vendor 层硬件能力匹配,例如 ANDROID_SENSOR_INFO_SENSITIVITY_RANGE 必须覆盖实际 ISO 范围。
  • Buffer 生命周期:每个 output buffer 必须被正确填充并回调,不允许出现 CAMERA3_BUFFER_STATUS_ERROR 以外的异常状态。
  • Partial result 顺序:camera3_capture_result_t.partial_result 必须从 1 开始递增,且最后一个 partial result 必须包含所有元数据。
实践建议:在开发初期,使用 camera3-test 工具(AOSP 源码中 cts/tests/camera/ 目录)对 HAL 实现层进行单元级验证,确保每个接口函数的行为与 CTS 预期一致,避免后期集成测试时大面积失败。