1. Camera HAL3 概述:架构设计目标、与 HAL1 对比、核心设计哲学
Camera HAL3(Hardware Abstraction Layer 3)是 Android 系统从 Lollipop(API 21)开始引入的新一代相机硬件抽象层规范。它彻底重构了 HAL1 的同步、单线程模型,转而采用 异步、流水线、多缓冲区 的架构,旨在解决移动设备上日益复杂的多摄像头、高帧率、计算摄影需求。
学习提示: HAL3 是理解 Android Camera 系统的分水岭。如果你熟悉 HAL1,请重点关注“异步”和“按需配置流”这两个思维转变;如果你是新手,请将 HAL3 视为一个“可编程的 ISP 管道”,而非简单的“拍照函数”。
1.1 架构设计目标:为什么需要 HAL3?
HAL3 的设计围绕三个核心目标展开,这些目标直接决定了其复杂的接口定义和回调机制:
- 高吞吐量与低延迟: 支持 30fps、60fps 甚至 240fps 的连续帧处理,要求 Camera 管道必须能够并行处理请求(Request)和返回结果(Result),避免串行阻塞。
- 灵活性与可配置性: 应用层可以按帧(per-frame)精细控制曝光、增益、白平衡、对焦区域等参数,而非像 HAL1 那样只能设置全局参数。
- 多摄像头与多流支持: 原生支持同时打开多个物理摄像头(如广角+长焦),并允许同时输出不同分辨率/格式的数据流(如预览流、拍照流、分析流)。
关键指标对比: HAL1 的典型延迟在 100-200ms(从请求到回调),而 HAL3 在理想流水线状态下可将延迟压缩到 1-2 帧周期(约 33-66ms @30fps),且支持同时输出 3 路以上不同格式的流。
1.2 HAL3 与 HAL1 的对比:从“黑盒”到“管道”
下表从架构模型、数据流、控制粒度、多摄支持等关键维度,系统对比 HAL1 与 HAL3 的差异:
| 对比维度 | HAL1(传统模型) | HAL3(流水线模型) |
|---|---|---|
| 架构模型 | 同步、单线程、阻塞式 | 异步、多线程、流水线式 |
| 数据流控制 | 单一输出流(预览/拍照切换) | 多路并发输出流(YUV/JPEG/RAW) |
| 参数控制粒度 | 全局设置(setParameters) | 逐帧控制(captureRequest 中的 settings) |
| 缓冲区管理 | HAL 内部管理,框架被动接收 | 框架提供缓冲区(StreamBuffer),HAL 填充 |
| 多摄像头 | 不支持同时打开多个 Camera | 原生支持多 Camera 同时工作 |
| 元数据标准 | 无统一标准,Vendor 自定义 | Camera Metadata 标准化(android.* 命名空间) |
| 调试复杂度 | 较低(单线程易追踪) | 较高(需追踪 Request/Result 配对、超时、丢帧) |
Vendor 适配警告: 从 HAL1 迁移到 HAL3 时,最常见的错误是 Vendor 层仍然使用“同步等待”的方式处理 process_capture_request。HAL3 要求该函数必须立即返回,并在后台线程完成 ISP 处理后通过回调返回结果。任何阻塞都会导致框架 ANR(Application Not Responding)。
1.3 核心设计哲学:Pipeline、Metadata、Stream
HAL3 的设计哲学可以概括为三个关键词:Pipeline(流水线)、Metadata(元数据)、Stream(流)。理解这三者之间的关系,是掌握 HAL3 适配的基础。
- Pipeline 哲学: 将 Camera 处理过程视为一个可配置的流水线。每一帧的捕获都是一个独立的 Request,经过 ISP 处理后产生一个 Result。多个 Request 可以同时处于流水线的不同阶段,实现帧级并行。
- Metadata 哲学: 所有控制参数和结果信息都通过标准化的 Metadata 传递。android.* 命名空间定义了数百个 Key,覆盖曝光、增益、对焦、白平衡、统计信息等。Vendor 层必须正确填充这些 Metadata,框架才能正常工作。
- Stream 哲学: 输出流(Stream)在 configure_streams 阶段一次性配置,之后在捕获过程中保持不变。每个 Stream 有固定的格式(YUV/JPEG/RAW)、分辨率和用途(预览/拍照/分析)。框架负责分配缓冲区,HAL 负责填充数据。
实战要点: 在 Vendor 层适配时,Pipeline 的实现质量直接决定帧率稳定性;Metadata 的完整性决定 CTS(Compatibility Test Suite)测试能否通过;Stream 的配置合理性决定多摄场景下的内存和带宽压力。
1.4 本章小结:HAL3 对 Vendor 层的核心要求
从架构设计目标、与 HAL1 的对比、核心设计哲学三个维度,我们可以提炼出 HAL3 对 Vendor 层适配的 三个核心要求:
| 要求维度 | 具体描述 | 常见 Vendor 问题 |
|---|---|---|
| 异步实现 | process_capture_request 必须非阻塞,后台线程处理 ISP | 同步等待 ISP 完成,导致 ANR |
| Metadata 完整性 | 所有 android.* 控制 Key 必须正确解析,结果 Key 必须正确填充 | 缺少关键 Key 导致 CTS 失败或相机功能异常 |
| Stream 管理 | configure_streams 必须支持多路流,且缓冲区管理正确 | 流配置失败或缓冲区泄漏导致预览黑屏 |
后续章节预告: 在下一章中,我们将深入 HAL3 的接口定义,详细讲解 camera3_device_t、camera3_callback_ops_t、process_capture_request 等核心结构体和函数的实现规范,并给出 Vendor 层适配的代码模板。