Camera HAL开发:Metadata处理与调试方法 - 第1节
1.1 Camera HAL在Android相机架构中的位置
Android相机架构采用分层设计,Camera HAL(Hardware Abstraction Layer)位于Framework与Kernel Driver之间,是连接上层相机服务与底层硬件的关键桥梁。HAL层屏蔽了不同SoC平台和传感器厂商的硬件差异,为上层提供统一的接口标准。
核心定位:Camera HAL是Android相机系统中唯一与硬件直接交互的抽象层,其实现质量直接决定相机启动速度、预览帧率、拍照延迟和图像质量。
1.1.1 架构分层与职责
Android相机架构从上到下依次为:
- 应用层(App):调用Camera2 API,发送拍照/录像请求。
- Framework层:包含CameraService、CameraProvider等系统服务,管理权限、会话和流配置。
- HAL层:实现ICameraDevice、ICameraDeviceSession等接口,处理metadata和buffer流转。
- Kernel层:V4L2、CSI驱动、ISP固件,控制传感器和图像信号处理器。
1.2 HAL接口版本演进
Camera HAL接口从Android早期版本至今经历了多次重大迭代,每次演进都带来了架构优化和功能增强。下表总结了主要版本的关键差异:
| HAL版本 | Android版本 | 接口定义 | 关键特性 |
|---|---|---|---|
| HAL v1 | 2.x ~ 4.x | hardware/libhardware | 单一设备接口,不支持多相机、无metadata |
| HAL v2 | 4.0 ~ 4.3 | hardware/libhardware | 引入Camera2概念,但未广泛采用 |
| HAL v3 | 4.4 ~ 7.x | camera3_device_t | 基于metadata的请求/结果模型,支持ZSL、高速连拍 |
| HAL v3.2 | 5.0 ~ 7.x | camera3_device_t | 增加partial result、stream configuration动态调整 |
| HAL v3.4 | 8.0 ~ 8.1 | camera3_device_t | 引入camera3_stream_configuration_t结构优化 |
| HAL v3.5 | 9.0 ~ 10 | camera3_device_t | 支持物理相机、逻辑相机、多摄像头同步 |
| HAL v3.6 | 11 ~ 12 | camera3_device_t | 添加Session参数、Repeating请求优化 |
| HAL v3.7 | 13+ | camera3_device_t | ULTRA_HIGH_RESOLUTION传感器支持、延迟丢失处理 |
版本选择建议:当前主流Android 12+项目应基于HAL v3.6或v3.7开发,以支持逻辑相机、超高分辨率传感器等新特性。HAL v1/v2已完全废弃,不应在新项目中使用。
1.2.1 HAL v3接口核心结构
HAL v3以camera3_device_t为核心结构体,包含以下关键函数指针:
typedef struct camera3_device {
hw_device_t common;
// 设备操作接口
int (*initialize)(const struct camera3_device *,
const camera3_callback_ops_t *callback_ops);
int (*configure_streams)(const struct camera3_device *,
camera3_stream_configuration_t *config);
int (*register_stream_buffers)(const struct camera3_device *,
const camera3_stream_buffer_set_t *buffer_set);
const camera_metadata_t *(*construct_default_request_settings)
(const struct camera3_device *, int type);
int (*process_capture_request)(const struct camera3_device *,
camera3_capture_request_t *request);
void (*dump)(const struct camera3_device *, int fd);
int (*flush)(const struct camera3_device *);
void (*signal_stream_flush)(const struct camera3_device *,
uint32_t num_streams,
const camera3_stream_t *const *streams);
int (*is_reconfiguration_required)(const struct camera3_device *,
const camera3_stream_configuration_t *new_config);
} camera3_device_t;
1.3 HAL与Framework的交互流程
HAL与Framework的交互遵循请求-结果(Request-Result)模型。每次拍照或预览都对应一个完整的交互周期,涉及metadata的传递和buffer的流转。
1.3.1 核心交互流程
- 初始化阶段:CameraService调用HAL的
initialize(),注册回调函数。 - 流配置阶段:Framework下发
configure_streams(),指定输出流格式、分辨率和用途。 - 请求下发阶段:Framework通过
process_capture_request()发送CaptureRequest,包含metadata和buffer句柄。 - HAL处理阶段:HAL解析metadata,驱动ISP和传感器完成曝光、对焦、图像处理。
- 结果回调阶段:HAL通过
process_capture_result()回调返回CaptureResult,包含结果metadata和填充后的buffer。
1.3.2 Metadata在交互中的角色
Metadata是HAL v3交互模型的核心数据载体,贯穿整个请求-结果周期:
| 交互阶段 | Metadata方向 | 关键Tag示例 | 作用 |
|---|---|---|---|
| 请求下发 | Framework → HAL | ANDROID_SENSOR_EXPOSURE_TIME ANDROID_CONTROL_AE_MODE |
指定曝光时间、自动曝光模式等控制参数 |
| 结果回调 | HAL → Framework | ANDROID_SENSOR_TIMESTAMP ANDROID_STATISTICS_FACE_RECTANGLES |
返回实际曝光时间、人脸检测结果等 |
| 静态信息 | HAL → Framework | ANDROID_SENSOR_INFO_PIXEL_ARRAY_SIZE ANDROID_LENS_INFO_AVAILABLE_FOCAL_LENGTHS |
上报传感器分辨率、可用焦距等硬件能力 |
常见调试陷阱:HAL实现中容易遗漏的metadata包括:
ANDROID_SENSOR_TIMESTAMP必须使用单调时钟源;ANDROID_CONTROL_AE_STATE状态机转换必须符合CTS规范;ANDROID_REQUEST_PIPELINE_DEPTH必须与实际pipeline延迟一致,否则会导致ANR或预览卡顿。
1.3.3 Buffer管理机制
除了metadata,buffer管理也是HAL交互的重要组成部分。Framework通过dequeue_buffer/queue_buffer机制与HAL共享图像缓冲区:
// HAL端buffer处理示例
int process_capture_request(const camera3_device_t *device,
camera3_capture_request_t *request) {
// 解析request中的metadata
camera_metadata_ro_entry_t entry;
find_camera_metadata_ro_entry(request->settings,
ANDROID_SENSOR_EXPOSURE_TIME, &entry);
int64_t exposure_time = entry.data.i64[0];
// 获取输出buffer
const camera3_stream_buffer_t *output_buffers = request->output_buffers;
for (size_t i = 0; i < request->num_output_buffers; i++) {
buffer_handle_t *buf = output_buffers[i].buffer;
void *addr;
gralloc_lock(*buf, GRALLOC_USAGE_SW_WRITE_OFTEN, &addr);
// 填充图像数据到addr
fill_image_data(addr, exposure_time);
gralloc_unlock(*buf);
}
// 构造结果metadata
camera_metadata_t *result_metadata = allocate_camera_metadata(...);
// 填充结果tag
// ...
// 回调返回
camera3_capture_result_t result = {
.frame_number = request->frame_number,
.result = result_metadata,
.num_output_buffers = request->num_output_buffers,
.output_buffers = output_buffers,
};
device->ops->process_capture_result(device->ops, &result);
return 0;
}
性能关键点:HAL实现中应避免在
process_capture_request中执行长时间阻塞操作。所有ISP配置、传感器控制应通过异步线程池处理,确保Framework侧不会因为HAL响应超时而触发ANR(Application Not Responding)。