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 传递,不再依赖传统回调函数传递参数。
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等标志。
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 捕获请求处理流程如下:
- 框架下发请求:调用
process_capture_request(),传入camera3_capture_request_t,包含 settings 和 output buffers。 - HAL 解析元数据:从 settings 中提取 3A 参数、输出尺寸、格式等。
- Vendor 层驱动调用:通过 ioctl 配置传感器曝光时间、增益、帧间隔。
- ISP 处理:原始 Bayer 数据经过黑电平校正、去马赛克、颜色校正、Gamma 等管线。
- 填充结果:HAL 将处理后的图像写入 output buffer,构造
camera3_capture_result_t,调用process_capture_result()回调。 - Fence 同步:通过 AcquireFence 和 ReleaseFence 保证 Buffer 访问同步。
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 预期一致,避免后期集成测试时大面积失败。