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)。每一帧的捕获都经过以下阶段:
- Request提交:Framework构造
CaptureRequest,包含传感器、AE/AWB/AF、输出流等配置。 - HAL处理:HAL3驱动解析Request,配置ISP、传感器、3A算法,生成RAW/YUV/JPEG数据。
- Result回调:HAL通过
process_capture_result返回CaptureResult(元数据)和CaptureBuffer(图像数据)。 - 流复用:支持多个输出流(如预览流、拍照流、RAW流)同时处理,互不阻塞。
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兼容性测试失败。
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 而非崩溃。