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相机架构从上到下依次为:

  1. 应用层(App):调用Camera2 API,发送拍照/录像请求。
  2. Framework层:包含CameraService、CameraProvider等系统服务,管理权限、会话和流配置。
  3. HAL层:实现ICameraDevice、ICameraDeviceSession等接口,处理metadata和buffer流转。
  4. Kernel层:V4L2、CSI驱动、ISP固件,控制传感器和图像信号处理器。
Android相机架构分层图 应用层 (App) Camera2 API / 第三方相机应用 Framework层 CameraService / CameraProvider Camera HAL层 ICameraDevice / ICameraDeviceSession Kernel驱动层 V4L2 / CSI / ISP固件 HAL关键作用 • 硬件抽象 • 接口统一 • Metadata处理 • Buffer流转 • 性能调优

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 核心交互流程

  1. 初始化阶段:CameraService调用HAL的initialize(),注册回调函数。
  2. 流配置阶段:Framework下发configure_streams(),指定输出流格式、分辨率和用途。
  3. 请求下发阶段:Framework通过process_capture_request()发送CaptureRequest,包含metadata和buffer句柄。
  4. HAL处理阶段:HAL解析metadata,驱动ISP和传感器完成曝光、对焦、图像处理。
  5. 结果回调阶段:HAL通过process_capture_result()回调返回CaptureResult,包含结果metadata和填充后的buffer。
HAL与Framework交互时序图 Framework Camera HAL Kernel/ISP 1. initialize() 2. configure_streams() 3. process_capture_request() [含Request Metadata] 4. ISP配置 & 曝光 5. 图像数据 + 结果 6. process_capture_result() [含Result Metadata + Buffer] 关键设计原则 所有交互均为异步非阻塞;metadata以camera_metadata_t结构传递;buffer通过gralloc句柄共享,避免内存拷贝

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)。