2. Camera HAL架构:HAL3 vs HAL1、Camera Provider进程、HAL接口定义

Camera HAL(Hardware Abstraction Layer)是Android相机系统中连接Framework与底层硬件驱动的关键桥梁。理解HAL架构的演进、进程模型与接口定义,是进行CTS测试用例构造与HAL行为验证的基础。本章将系统梳理HAL1与HAL3的核心差异、Camera Provider进程的职责,以及HAL接口的详细定义。

核心要点:HAL3相比HAL1实现了从“黑盒控制”到“逐帧管道”的架构升级;Camera Provider进程将HAL服务化,支持多进程隔离与热插拔;HAL接口定义决定了CTS测试的覆盖边界。

2.1 HAL1 vs HAL3:架构演进与核心差异

Android Camera HAL经历了从HAL1到HAL3的重大架构升级。HAL1是早期Android版本(API 21之前)的默认架构,而HAL3从Android 5.0开始引入,并在Android 8.0后成为强制要求。

CTS测试提示:CTS测试中,android.hardware.camera2 全套测试用例仅针对HAL3设备生效。若设备仍使用HAL1,将跳过camera2相关测试项,可能导致认证失败。

2.1.1 架构对比表

对比维度 HAL1 HAL3
引入版本 Android 2.3 (API 9) Android 5.0 (API 21)
强制要求 Android 8.0前可选 Android 8.0+ 强制
控制模型 黑盒式:takePicture() / startPreview() 管道式:逐帧配置 CaptureRequest
数据流 单路同步流 多路异步流(ZSL、RAW、YUV并行)
元数据 无标准元数据 标准 CameraMetadata(android.* key)
性能 延迟高,无法逐帧控制 低延迟,支持逐帧参数切换
CTS覆盖 仅 android.hardware.Camera API android.hardware.camera2 全套

2.1.2 HAL3 逐帧管道架构

HAL3的核心设计是“逐帧管道”(Per-frame Pipeline)。每一帧的捕获都经过以下阶段:

  1. Request提交:Framework构造 CaptureRequest,包含传感器、AE/AWB/AF、输出流等配置。
  2. HAL处理:HAL3驱动解析Request,配置ISP、传感器、3A算法,生成RAW/YUV/JPEG数据。
  3. Result回调:HAL通过 process_capture_result 返回 CaptureResult(元数据)和 CaptureBuffer(图像数据)。
  4. 流复用:支持多个输出流(如预览流、拍照流、RAW流)同时处理,互不阻塞。
HAL3 逐帧管道架构 CaptureRequest HAL3 Pipeline CaptureResult App/CTS Sensor Config 3A Algorithm ISP Processing 说明: HAL3 每帧独立配置 Sensor、3A、ISP,支持多流并发(如 1080p 预览 + 4K 拍照 + RAW 同时输出)。 CTS 测试通过构造不同 CaptureRequest 组合,验证 HAL 逐帧行为的正确性。

2.2 Camera Provider进程

从Android 8.0(Treble架构)开始,Camera HAL被封装为独立的 Camera Provider 进程,运行在 cameraserver 之外,通过HIDL(Android 8~10)或AIDL(Android 11+)与Framework通信。

2.2.1 进程模型

  • cameraserver:系统服务进程,负责Camera API的权限管理、客户端连接调度。
  • camera.provider:独立HAL进程,实现 ICameraProvider 接口,管理物理Camera设备。
  • camera.hal:Provider内部加载的HAL实现库(如 camera..so),直接操作硬件。
CTS验证要点:CTS测试会检查Camera Provider进程是否在独立进程运行(ps -A | grep camera.provider),以及进程崩溃后能否自动重启。若Provider进程与cameraserver合并,将导致Treble兼容性测试失败。
Camera Provider 进程架构 cameraserver 系统服务进程 权限管理 / 客户端调度 camera.provider 独立HAL进程 ICameraProvider 接口 camera.hal HAL实现库 硬件驱动操作 进程隔离优势: 1. HAL崩溃不影响 cameraserver,系统可自动重启 Provider 进程。 2. 支持多Camera HAL共存(如主摄 + 广角 + 深度),每个Provider独立管理。 3. CTS测试通过 CameraManager#getCameraIdList() 验证Provider注册的Camera设备。

2.3 HAL接口定义

HAL接口是Framework与HAL实现之间的契约。在HAL3架构下,核心接口定义在 hardware/libhardware/include/hardware/camera3.h 中,主要包含以下关键结构体与回调函数。

2.3.1 核心接口结构体

结构体/接口 职责 关键字段/方法
camera3_device_ops_t 设备操作接口表 initialize(), configure_streams(), process_capture_request(), flush()
camera3_callback_ops_t HAL回调接口表 process_capture_result(), notify()
camera3_stream_t 数据流描述 stream_type (CAMERA3_STREAM_OUTPUT/INPUT), width, height, format, usage
camera3_capture_request_t 单次捕获请求 frame_number, settings (metadata), input_buffer, num_output_buffers, output_buffers
camera3_capture_result_t 捕获结果 frame_number, result (metadata), num_output_buffers, output_buffers, partial_result

2.3.2 关键接口调用流程

// HAL3 设备初始化与捕获流程(伪代码)
// 1. 打开设备
camera3_device_t *device;
hw_module_t->methods->open(hw_module, camera_id, &device);

// 2. 初始化设备,注册回调
camera3_callback_ops_t callback_ops = {
    .process_capture_result = on_capture_result,
    .notify = on_notify
};
device->ops->initialize(device, &callback_ops);

// 3. 配置数据流
camera3_stream_t streams[] = {
    {.stream_type = CAMERA3_STREAM_OUTPUT, .width = 1920, .height = 1080, .format = HAL_PIXEL_FORMAT_YCbCr_420_888}
};
device->ops->configure_streams(device, streams);

// 4. 提交捕获请求
camera3_capture_request_t request = {
    .frame_number = 1,
    .settings = metadata,  // 包含 AE/AWB/AF 等配置
    .num_output_buffers = 1,
    .output_buffers = &buffer
};
device->ops->process_capture_request(device, &request);

// 5. 回调处理(HAL异步调用)
void on_capture_result(const camera3_callback_ops_t *cb, const camera3_capture_result_t *result) {
    // 解析 result->result (metadata) 和 result->output_buffers (图像数据)
    // CTS 测试在此处验证 metadata 字段是否符合预期
}
CTS测试关联:CTS测试用例 CameraExtensionCharacteristicsTest 和 CameraCaptureSessionTest 会直接调用上述接口,验证HAL对 configure_streams() 返回的错误码、process_capture_request() 的帧序连续性、以及 process_capture_result() 中metadata的完整性。

2.3.3 接口契约与CTS验证点

  • 帧序连续性:HAL必须按 frame_number 递增顺序返回结果,不允许跳帧或乱序。CTS通过提交连续100帧请求验证。
  • Metadata完整性:每个 CaptureResult 必须包含 android.sensor.timestamp、android.statistics.lensShadingMap 等强制字段。CTS使用 CameraMetadataTest 逐字段检查。
  • Stream配置合规:HAL必须支持 android.scaler.availableStreamConfigurations 中声明的所有分辨率/格式组合。CTS通过 CameraDeviceTest#testStreamConfigurationMap 验证。
  • 错误通知:当HAL内部发生致命错误(如传感器超时),必须通过 notify() 回调发送 CAMERA3_MSG_ERROR_REQUEST。CTS测试会模拟异常场景验证。
HAL开发建议:在实现 process_capture_request() 时,务必对 settings 中的每个metadata key做合法性校验。CTS测试中 CameraMetadataTest#testInvalidValues 会注入非法值(如负曝光时间),期望HAL返回 -EINVAL 而非崩溃。

2.4 本章小结