2. Camera HAL 架构基础:Android HAL3 架构、Pipeline 模型与关键接口

在功耗优化驱动的性能 Profiling 中,理解 Camera HAL 架构是定位瓶颈的前提。Android Camera HAL3 是当前主流框架,它摒弃了 HAL1 的固定管线,采用灵活的 Pipeline 模型,允许 SoC 厂商自定义处理流。本章将拆解 HAL3 的核心架构、Pipeline 数据流以及三个关键接口:open、close、process_capture_request。

2.1 Android Camera HAL3 架构总览

HAL3 架构分为三层:Application Framework、Camera Service 和 Camera HAL。其中 HAL 层直接与硬件交互,是功耗优化的主战场。

架构要点:HAL3 要求每个 capture request 独立描述输出流、参数和回调,这使得功耗管理可以精确到每一帧。
Android Camera HAL3 分层架构 Application Framework (Camera2 API) Camera Service (cameraserver) Camera HAL3 (vendor HAL + SoC Pipeline) Camera Hardware (Sensor / ISP / DSP)

2.2 Pipeline 模型:从 Request 到 Frame

HAL3 的核心抽象是 Pipeline——一个可配置的硬件处理链。每个 capture request 被拆分为多个阶段,依次经过 Sensor 曝光、ISP 处理、统计计算和输出合成。Pipeline 模型允许 SoC 厂商插入自定义硬件加速模块,同时也为功耗 Profiling 提供了清晰的阶段边界。

Pipeline 阶段 主要操作 功耗敏感点
Sensor Readout 曝光、行读出、增益调整 帧率、分辨率、HDR 模式
ISP Processing 去噪、Demosaic、颜色校正 时钟频率、处理单元数
Statistics AE/AWB/AF 统计计算 3A 算法频率、DSP 负载
Output Stream YUV/JPEG/HEIF 编码、DMA 传输 编码器功耗、带宽
HAL3 Pipeline 数据流 Capture Request Sensor ISP Stats Output Stream 每个阶段都可以插入功耗 Profiling 探针,测量延迟和电流 Pipeline 模型允许按阶段独立调优功耗

2.3 关键接口详解

HAL3 通过 camera3_device_ops_t 结构体暴露接口。功耗 Profiling 最关注以下三个函数:

2.3.1 open() —— 设备初始化与功耗基线

open() 在 Camera Service 启动时调用,负责初始化 Sensor、ISP 和内存池。此阶段会建立功耗基线,包括:

  • 时钟与电源域:开启 Sensor 时钟、ISP 电源、总线时钟。
  • 内存分配:分配 Gralloc buffer、统计 buffer。
  • Pipeline 配置:设置流数量、分辨率、格式。
Profiling 要点:在 open() 前后测量电流跳变,可以评估硬件模块的静态功耗。如果 open() 后电流过高,说明有模块未正确进入低功耗模式。

2.3.2 close() —— 资源释放与功耗收敛

close() 负责关闭设备、释放 buffer、关闭时钟。功耗 Profiling 需要验证:

  • 所有 DMA 通道是否停止。
  • ISP 和 Sensor 是否进入断电状态。
  • 内存是否完全释放(防止泄漏导致持续功耗)。
// 典型的 close() 实现片段
static int close(struct hw_device_t *device) {
    camera3_device_t *cam_dev = (camera3_device_t *)device;
    CameraModule *module = (CameraModule *)cam_dev->priv;

    // 停止所有 ongoing capture
    module->pipeline->flush();

    // 关闭 Sensor 电源
    module->sensor->power_down();

    // 释放 ISP 资源
    module->isp->deinit();

    // 释放 buffer 池
    module->buffer_manager->free_all();

    // 关闭设备文件描述符
    close(module->fd);

    return 0;
}

2.3.3 process_capture_request() —— 帧级功耗热点

这是最关键的接口,每帧调用一次。它接收 camera3_capture_request_t,包含:

  • settings:3A 参数、AE 模式、帧率控制。
  • output_buffers:目标 buffer 列表。
  • input_buffer:ZSL 或 reprocess 输入。

功耗 Profiling 在此接口内插入探针,可以精确测量每帧的处理时间和电流消耗。

参数 说明 功耗影响
frame_number 帧序号,用于追踪 无直接功耗影响
settings AE/AWB/AF 参数 高帧率或长曝光增加功耗
output_buffers 输出流数量与格式 多流、高分辨率增加带宽
input_buffer 重处理输入 增加 ISP 负载
process_capture_request 调用流程 Camera Service HAL process_capture_request Pipeline 处理 process_capture_result() notify() 错误/快门 Profiling 探针应放置在 process_capture_request 入口和 process_capture_result 出口 测量两者之间的延迟和电流积分,得到单帧功耗

2.4 关键数据结构

HAL3 使用 camera3_stream_t 和 camera3_capture_request_t 描述数据流。理解这些结构体是 Profiling 的基础。

// camera3_capture_request_t 核心字段
typedef struct camera3_capture_request {
    uint32_t                frame_number;       // 帧序号
    const camera3_stream_t  **output_buffers;   // 输出流数组
    uint32_t                num_output_buffers; // 输出流数量
    const camera3_stream_t  *input_buffer;      // 输入流(ZSL/reprocess)
    const camera_metadata_t *settings;          // 帧参数
} camera3_capture_request_t;
功耗陷阱:如果 num_output_buffers 大于 1(多流场景),Pipeline 需要同时处理多个输出,ISP 和 DMA 带宽会成倍增加。Profiling 时必须区分单流和多流功耗差异。

2.5 本章小结

  • HAL3 架构分为 App、Service、HAL 三层,功耗优化集中在 HAL 层。
  • Pipeline 模型将处理过程分为 Sensor、ISP、Stats、Output 四个阶段,每个阶段都可独立 Profiling。
  • open() 建立功耗基线,close() 验证功耗收敛,process_capture_request() 是帧级功耗热点。
  • 多流场景是功耗 Profiling 的重点和难点。