2. Camera HAL 架构深度解析:HAL3 vs HAL1,核心接口与数据流模型

Camera HAL(硬件抽象层)是 Android 相机系统中连接 Framework 与底层硬件驱动的关键桥梁。HAL 版本的选择直接决定了相机的启动路径、数据流效率以及预热延迟表现。本章将深入对比 HAL1 与 HAL3 的架构差异,剖析核心接口与数据流模型,为后续的预热延迟分析奠定基础。

2.1 HAL1 架构:传统同步模型

HAL1 是 Android 早期(API 级别 9-20)定义的相机 HAL 接口标准,采用 同步、单线程 的操作模型。CameraService 通过一个单一的 camera_device_t 接口与 HAL 交互,所有操作(预览、拍照、参数设置)都串行执行。

核心特征: 操作阻塞、状态机简单、内存拷贝频繁、不支持多路复用。

2.1.1 HAL1 核心接口

接口函数 功能描述 预热延迟影响
open() 打开相机设备,初始化传感器与 ISP 高(串行初始化,阻塞等待)
start_preview() 启动预览流,配置 DMA 通道 高(需等待第一帧就绪)
take_picture() 捕获静态图像,返回 JPEG 数据 中(需停止预览再恢复)
set_parameters() 设置曝光、白平衡、AE/AF 等参数 低(但频繁调用会阻塞)
get_parameters() 获取当前相机参数 低

2.1.2 HAL1 数据流模型

HAL1 的数据流是典型的 拉取(Pull)模型:

  1. CameraService 调用 start_preview(),HAL 开始从 Sensor 获取帧数据。
  2. HAL 将原始帧数据通过 preview_callback() 回调给 CameraService。
  3. CameraService 将数据传递给 SurfaceFlinger 进行显示。
  4. 拍照时,HAL 停止预览流,捕获单帧,编码为 JPEG 后回调。

这种模型导致每次操作都需要等待前一个操作完成,预热延迟累积明显。

HAL1 同步数据流模型 App / Framework CameraService HAL1 Sensor/ISP ⚠ 同步阻塞:start_preview() 等待第一帧就绪才返回 preview_callback() 📸 take_picture() 需停止预览 → 捕获 → 恢复预览 ⏱ 预热延迟 = open() + start_preview() + 第一帧就绪
HAL1 预热瓶颈: 由于所有操作串行且阻塞,从 open() 到第一帧预览显示的延迟通常在 200-500ms 甚至更高,具体取决于 Sensor 初始化时间和 ISP 配置复杂度。

2.2 HAL3 架构:现代异步管道模型

HAL3 从 Android 5.0(API 级别 21)引入,彻底重构了相机 HAL 架构。它采用 异步、多管道、基于请求-响应 的模型,支持多路复用、零拷贝缓冲区管理和灵活的流配置。

核心特征: 操作非阻塞、支持多路流、缓冲区复用、请求队列驱动、延迟可控。

2.2.1 HAL3 核心接口

接口函数 功能描述 预热延迟影响
open() 打开相机设备,初始化 HAL3 管道 中(可并行初始化)
configure_streams() 配置输出流(预览、拍照、录像) 高(需协商格式与分辨率)
process_capture_request() 提交捕获请求,非阻塞返回 低(异步提交)
process_capture_result() 回调捕获结果(帧数据 + 元数据) 低(异步回调)
flush() 清空所有待处理请求 低

2.2.2 HAL3 数据流模型

HAL3 采用 推送(Push)模型,基于请求队列驱动:

  1. App 通过 CameraManager 创建 CameraCaptureSession。
  2. Session 配置输出流(Surface),调用 configure_streams()。
  3. App 提交 CaptureRequest 到 HAL3 的请求队列。
  4. HAL3 异步处理请求,Sensor 捕获帧,ISP 处理后通过 process_capture_result() 回调。
  5. 结果帧直接写入 Surface(零拷贝),元数据通过回调返回。
HAL3 异步管道数据流模型 App CameraService HAL3 Sensor/ISP Surface 请求队列 process_capture_result() 零拷贝 HAL3 预热延迟分解 open() ~30-80ms configure_streams() ~50-150ms 第1个请求提交 ~5-15ms 第1帧回调 ~30-60ms
HAL3 预热优势: 由于 process_capture_request() 是非阻塞的,App 可以在 configure_streams() 完成前就提交请求,实现 流水线预热。整体预热延迟可优化至 100-250ms,比 HAL1 提升 2-5 倍。

2.3 HAL1 vs HAL3 核心差异对比

对比维度 HAL1 HAL3
操作模型 同步阻塞 异步非阻塞
数据流 拉取(Pull),回调驱动 推送(Push),请求队列驱动
多流支持 不支持(仅单预览流) 支持(预览+拍照+录像并行)
缓冲区管理 内存拷贝,CPU 参与 Gralloc 零拷贝,GPU/DMA 直接
元数据传递 通过参数 get/set 通过 CaptureResult 内嵌
预热延迟 200-500ms 100-250ms(可优化)
适用场景 低端设备、兼容模式 中高端设备、HDR/多帧/RAW

2.4 预热延迟关键路径分析

无论 HAL1 还是 HAL3,预热延迟的核心瓶颈都集中在以下三个环节:

  • Sensor 初始化(Sensor Init): 上电、PLL 锁定、MIPI CSI 链路训练,通常占 30-50% 的预热时间。
  • ISP 配置(ISP Config): 加载固件、配置管线、设置 AWB/AE 初始参数,占 20-30%。
  • 第一帧就绪(First Frame): 从 Sensor 曝光开始到 ISP 输出第一帧数据,占 20-30%。
预热延迟关键路径占比(典型值) Sensor 初始化 45% ISP 配置 30% 第一帧 25% 💡 优化重点:Sensor 初始化是最大瓶颈,可通过预上电、PLL 快速锁定、MIPI 链路预训练来优化 HAL3 的异步模型允许 ISP 配置与 Sensor 初始化部分并行,从而降低整体延迟

2.5 从 HAL1 迁移到 HAL3 的预热优化收益

在实际项目中,从 HAL1 迁移到 HAL3 并配合预热优化,可以带来显著的延迟改善:

优化阶段 HAL1 延迟 HAL3 基础延迟 HAL3 优化后延迟
open() 80-150ms 30-80ms 15-30ms(预加载)
configure_streams() 50-100ms 50-150ms 30-60ms(缓存配置)
第一帧就绪 70-250ms 30-60ms 15-30ms(流水线)
总预热延迟 200-500ms 110-290ms 60-120ms