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 路以上不同格式的流。
HAL3 架构设计目标与核心能力 Camera HAL3 异步流水线架构 目标 1:高吞吐低延迟 并行请求/结果 帧率 ≥ 30fps 目标 2:灵活可配置 Per-frame 参数控制 逐帧 3A 调节 目标 3:多摄多流 多物理 Camera 同时打开 多路输出流 能力:异步捕获 process_capture_request notify/process_capture_result 能力:流配置 configure_streams Stream 模板配置 能力:元数据 Camera Metadata 标准 静态/动态/控制 设计目标驱动接口定义,Vendor 层需严格对齐

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)。
HAL1 与 HAL3 架构对比 HAL1:同步阻塞模型 App 请求 setParameters HAL1 实现 同步等待 ISP 完成 返回数据 阻塞结束 特点:简单但低效,无法并发 HAL3:异步流水线模型 Request 队列 Result 队列 HAL3 实现 异步处理,立即返回 process_capture_request process_capture_result 特点:高吞吐、低延迟、支持多流

1.3 核心设计哲学:Pipeline、Metadata、Stream

HAL3 的设计哲学可以概括为三个关键词:Pipeline(流水线)、Metadata(元数据)、Stream(流)。理解这三者之间的关系,是掌握 HAL3 适配的基础。

  1. Pipeline 哲学: 将 Camera 处理过程视为一个可配置的流水线。每一帧的捕获都是一个独立的 Request,经过 ISP 处理后产生一个 Result。多个 Request 可以同时处于流水线的不同阶段,实现帧级并行。
  2. Metadata 哲学: 所有控制参数和结果信息都通过标准化的 Metadata 传递。android.* 命名空间定义了数百个 Key,覆盖曝光、增益、对焦、白平衡、统计信息等。Vendor 层必须正确填充这些 Metadata,框架才能正常工作。
  3. Stream 哲学: 输出流(Stream)在 configure_streams 阶段一次性配置,之后在捕获过程中保持不变。每个 Stream 有固定的格式(YUV/JPEG/RAW)、分辨率和用途(预览/拍照/分析)。框架负责分配缓冲区,HAL 负责填充数据。
实战要点: 在 Vendor 层适配时,Pipeline 的实现质量直接决定帧率稳定性;Metadata 的完整性决定 CTS(Compatibility Test Suite)测试能否通过;Stream 的配置合理性决定多摄场景下的内存和带宽压力。
HAL3 核心设计哲学:Pipeline、Metadata、Stream Pipeline 异步请求/结果流水线 Metadata 标准化控制与结果 Stream 多路输出流配置 三者关系:Pipeline 是执行引擎,Metadata 是控制语言,Stream 是数据通道 Vendor 层适配 = 实现 Pipeline + 填充 Metadata + 管理 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 层适配的代码模板。