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)模型:
- CameraService 调用
start_preview(),HAL 开始从 Sensor 获取帧数据。 - HAL 将原始帧数据通过
preview_callback()回调给 CameraService。 - CameraService 将数据传递给 SurfaceFlinger 进行显示。
- 拍照时,HAL 停止预览流,捕获单帧,编码为 JPEG 后回调。
这种模型导致每次操作都需要等待前一个操作完成,预热延迟累积明显。
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)模型,基于请求队列驱动:
- App 通过 CameraManager 创建 CameraCaptureSession。
- Session 配置输出流(Surface),调用
configure_streams()。 - App 提交
CaptureRequest到 HAL3 的请求队列。 - HAL3 异步处理请求,Sensor 捕获帧,ISP 处理后通过
process_capture_result()回调。 - 结果帧直接写入 Surface(零拷贝),元数据通过回调返回。
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%。
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 |