1. HAL3概述:Camera HAL3架构演进、与HAL1的核心区别、HAL3整体框架图

1.1 Camera HAL架构演进路线

Android Camera HAL(硬件抽象层)从HAL1演进到HAL3,核心驱动力是性能瓶颈与功能需求的双重压力。早期HAL1基于“流式管道”模型,仅支持单路YUV输出,无法满足多摄像头、高帧率、RAW域处理等现代成像需求。HAL3重新设计了CaptureRequest/CaptureResult异步模型,将控制权从HAL移交到Camera Service,实现了精细化的逐帧控制。

演进关键节点: Android 4.4(KitKat)引入HAL3原型 → Android 5.0(Lollipop)正式发布HAL3接口 → Android 8.0(Oreo)废弃HAL1,强制要求HAL3 → Android 10+ 引入HIDL化与Treble架构。
Camera HAL 架构演进时间线 HAL1 流式管道 HAL3 请求-结果模型 HIDL HAL Treble化 AIDL HAL 统一接口 Android 2.3 Android 5.0 Android 8.0 Android 13+ HAL1已废弃,当前主流为HIDL HAL3,AIDL HAL3为未来演进方向

1.2 HAL1与HAL3核心区别

HAL1与HAL3在数据流模型、控制粒度、同步机制三个维度存在根本性差异。下表从工程实现角度进行对比:

对比维度 HAL1 HAL3
数据流模型 同步流式管道,HAL内部维护预览/拍照流 异步请求-响应,Camera Service下发CaptureRequest
控制粒度 粗粒度:只能设置预览/拍照模式 逐帧控制:每帧可独立设置AE/AWB/AF、输出格式、ROI
输出能力 单路YUV输出,无法同时输出RAW+YUV+JPEG 多路并行输出:RAW、YUV、JPEG、HEIC可同时配置
Buffer管理 HAL内部管理Buffer,Camera Service被动接收 Camera Service通过Gralloc分配Buffer,HAL填充后返回
多摄像头 不支持,需通过HAL扩展实现 原生支持多摄像头,通过logical camera组合
Metadata传递 无标准Metadata通道 android.hardware.camera2包定义完整Metadata规范
性能开销 低延迟(无额外调度) 较高延迟(需跨进程通信),但可通过批处理优化
迁移建议: 从HAL1迁移到HAL3时,最核心的改动在于将“HAL主动推流”改为“被动响应请求”。需要重新设计ISP pipeline的调度逻辑,并实现process_capture_request()回调的异步完成机制。

1.3 HAL3整体框架图

HAL3框架分为应用层、框架层(Camera Service)、HAL层三个层级。核心交互围绕CaptureRequest和CaptureResult展开,通过camera3_device_ops_t函数表进行跨进程调用。

Camera HAL3 整体框架图 应用层 (Application Framework) Camera2 API CameraManager CaptureRequest.Builder CameraCaptureSession CaptureRequest 框架层 (Camera Service / Framework) CameraDeviceClient 请求序列化 & 分发 Camera3Device HAL接口封装 BufferQueue管理 Gralloc Buffer分配 camera3_device_ops_t HAL层 (Camera HAL Implementation) process_capture_request() 解析Request,配置ISP ISP Pipeline调度 Sensor & ISP 控制 process_capture_result() 返回Metadata + Buffer 硬件层:Sensor → ISP → Image Processor → Memory

1.4 HAL3关键数据结构

HAL3的核心数据结构定义在 hardware/libhardware/include/hardware/camera3.h 中,以下为最关键的三个结构体:

// camera3_device_ops_t:HAL3设备操作函数表
typedef struct camera3_device_ops {
    // 初始化设备,返回静态信息
    int (*initialize)(const struct camera3_device *,
                      const camera3_callback_ops_t *callback_ops);
    
    // 配置数据流(配置Stream)
    int (*configure_streams)(const struct camera3_device *,
                             camera3_stream_configuration_t *config);
    
    // 注册Buffer(Stream绑定Buffer)
    int (*register_stream_buffers)(const struct camera3_device *,
                                   const camera3_stream_buffer_set_t *buffer_set);
    
    // 核心函数:处理CaptureRequest
    int (*process_capture_request)(const struct camera3_device *,
                                   camera3_capture_request_t *request);
    
    // 刷新所有待处理请求
    int (*flush)(const struct camera3_device *);
    
    // 销毁设备
    void (*close)(struct camera3_device *);
} camera3_device_ops_t;
// camera3_capture_request_t:单帧请求描述
typedef struct camera3_capture_request {
    uint32_t                frame_number;      // 帧序号,单调递增
    camera3_stream_buffer_t *input_buffers;    // 输入Buffer(重处理场景)
    uint32_t                num_input_buffers; // 输入Buffer数量
    camera3_stream_buffer_t *output_buffers;   // 输出Buffer数组
    uint32_t                num_output_buffers;// 输出Buffer数量
    const camera_metadata_t *settings;         // 控制Metadata(AE/AWB/AF等)
    uint32_t                settings_updated;  // 标记settings是否更新
} camera3_capture_request_t;
常见陷阱: process_capture_request() 必须同步返回,但实际ISP处理可以异步完成。HAL需要立即复制request中的settings指针内容,因为Camera Service在函数返回后可能释放该内存。同时,output_buffers中的buffer_handle_t必须在process_capture_result()回调中返回,不能提前释放。

1.5 HAL3核心流程:一次完整的CaptureRequest生命周期

  1. 应用构建请求: 通过Camera2 API创建CaptureRequest.Builder,设置AE模式、输出格式、ROI等参数。
  2. 框架序列化: CameraService将请求封装为camera3_capture_request_t,分配frame_number,通过process_capture_request()下发到HAL。
  3. HAL解析与调度: HAL解析settings中的android.control.*字段,配置ISP寄存器,启动Sensor曝光。
  4. ISP处理: Sensor输出RAW数据,ISP执行Bayer处理、降噪、色调映射,输出到output_buffers指定的Gralloc Buffer。
  5. 结果回调: HAL通过camera3_callback_ops_t.process_capture_result()返回CaptureResult(包含实际使用的参数、时间戳、Buffer句柄)。
  6. 框架分发: CameraService将结果转发到应用层的CameraCaptureSession.CaptureCallback。
性能关键点: 整个流程中,process_capture_request() → process_capture_result() 的延迟决定了相机启动速度和拍照响应时间。HAL实现应尽量将ISP配置与Sensor曝光并行化,避免在process_capture_request()中做耗时同步操作。