1. HAL3 架构概述

1.1 Android Camera HAL3 整体架构

Android Camera HAL3 是 Android 系统为相机硬件抽象层定义的第三代接口规范,旨在提供更灵活、高性能的相机控制能力。与 HAL1 的“黑盒”模式不同,HAL3 将相机 pipeline 完全暴露给框架,使应用层能够精细控制每一帧的捕获参数与处理流程。

整体架构从上到下分为三个主要层次:

  • 应用层 (Application Framework):通过 android.hardware.camera2 API 与相机服务交互,发送 CaptureRequest、接收 CaptureResult。
  • 相机服务层 (Camera Service):位于 cameraserver 进程中,负责管理 CameraDevice、处理 Metadata 路由、协调多个客户端访问。
  • HAL 层 (Hardware Abstraction Layer):由 SoC 厂商或 OEM 实现,直接操作传感器、ISP、3A 算法等硬件模块。
关键点: HAL3 的核心设计理念是“一次请求,一帧结果”——每个 CaptureRequest 对应一个独立的帧,Metadata 作为请求与结果之间的结构化数据载体,贯穿整个 pipeline。
HAL3 整体架构分层图 Android Camera HAL3 整体架构分层 应用层 (Application Framework) Camera2 API · CaptureRequest · CaptureResult 相机服务层 (Camera Service) CameraDevice · Metadata 路由 · 多客户端协调 HAL 层 (Hardware Abstraction Layer) 传感器驱动 · ISP · 3A 算法 · 厂商实现 Metadata 在每一层之间双向传递,驱动整个捕获流程

1.2 Pipeline 模型

HAL3 引入的 Pipeline 模型将相机处理流程抽象为一系列可配置的阶段。每个阶段对应一个硬件或软件处理单元,框架通过 Metadata 控制每个阶段的参数。

典型的 HAL3 Pipeline 包含以下核心阶段:

阶段 功能描述 关键 Metadata
Sensor 控制曝光时间、增益、帧率等传感器参数 ANDROID_SENSOR_EXPOSURE_TIME, ANDROID_SENSOR_SENSITIVITY
3A (AE/AF/AWB) 自动曝光、自动对焦、自动白平衡算法 ANDROID_CONTROL_AE_MODE, ANDROID_CONTROL_AF_MODE
ISP (Image Signal Processor) 图像信号处理:去噪、锐化、色彩校正 ANDROID_NOISE_REDUCTION_MODE, ANDROID_EDGE_MODE
Post-Processing 后处理:几何校正、HDR 合成、多帧融合 ANDROID_TONEMAP_MODE, ANDROID_STATISTICS_LENS_SHADING_MAP_MODE
Output 输出格式转换、裁剪、旋转、编码 ANDROID_SCALER_CROP_REGION, ANDROID_JPEG_QUALITY
测试提示: Pipeline 模型中,Metadata 的传递顺序必须与硬件处理顺序一致。如果某个阶段的 Metadata 未正确设置,可能导致整帧处理失败或图像质量异常。测试时应逐阶段验证 Metadata 的写入与读取。
HAL3 Pipeline 模型流程图 HAL3 Pipeline 模型与 Metadata 流向 Sensor 曝光/增益 3A AE/AF/AWB ISP 去噪/锐化 Post-Proc HDR/融合 Output 编码/裁剪 Metadata 随 CaptureRequest 从左到右传递,结果反向返回 CaptureRequest 流向 (Metadata 下行) CaptureResult 流向 (Metadata 上行)

1.3 Metadata 在框架中的角色

Metadata 是 HAL3 架构中连接应用层、相机服务层和 HAL 层的核心数据契约。它定义了相机设备的能力、当前状态以及每一帧的捕获参数。在 Android Camera2 框架中,Metadata 以键值对的形式组织,每个键对应一个标准化的相机参数。

Metadata 在框架中承担以下关键角色:

  • 能力描述 (Static Metadata):通过 CameraCharacteristics 暴露相机设备的硬件能力,如支持的分辨率、帧率范围、AE 模式等。这些信息在相机打开时一次性获取,不会变化。
  • 请求参数 (CaptureRequest Metadata):应用层通过 CaptureRequest.Builder 设置每一帧的捕获参数,如曝光时间、对焦位置、白平衡模式等。这些参数随请求下发到 HAL。
  • 结果反馈 (CaptureResult Metadata):HAL 完成帧捕获后,将实际使用的参数和统计信息通过 CaptureResult 返回给框架,包括实际曝光时间、传感器温度、3A 状态等。
  • 动态控制 (Dynamic Metadata):部分 Metadata 可以在 pipeline 运行过程中动态更新,例如 AE 收敛后的实际曝光值、AF 的 lens 位置等。
Metadata 类型 获取时机 典型用途 测试关注点
Static CameraManager.getCameraCharacteristics() 查询设备能力、选择配置 能力枚举是否完整、值范围是否准确
Request 每次 capture() 或 setRepeatingRequest() 控制每帧参数 参数是否被 HAL 正确解析、边界值处理
Result 每帧捕获完成后回调 获取实际参数、调试分析 结果值与请求值是否一致、时间戳是否合理
常见陷阱: 测试中经常发现 HAL 返回的 CaptureResult 中某些字段缺失或值为默认值,这通常是因为 HAL 未正确实现对应的 Metadata 标签。务必检查 ANDROID_REQUEST_PARTIAL_RESULT_COUNT 和 ANDROID_REQUEST_METADATA_AVAILABLE 等关键字段。
Metadata 在框架中的角色交互图 Metadata 在框架中的角色与交互 应用层 Camera2 API CaptureRequest.Builder 相机服务层 Metadata 路由 请求/结果分发 HAL 层 硬件控制 3A/ISP 实现 Request Request Result Result Static Metadata 在相机打开时一次性获取,不参与每帧交互 Request/Result Metadata 每帧双向传递,形成闭环控制 Static Metadata Static Metadata 描述设备能力,贯穿整个生命周期

1.4 Metadata 传递的核心流程

理解 Metadata 的传递流程是测试验证的基础。一次完整的捕获周期包含以下步骤:

  1. 应用层构建 CaptureRequest:通过 CameraDevice.createCaptureRequest() 创建请求,设置目标输出 Surface 和各项 Metadata 参数。
  2. 相机服务层序列化:将 CaptureRequest 中的 Metadata 序列化为 HAL 可识别的 camera_metadata_t 结构,通过 HAL 接口 process_capture_request() 下发。
  3. HAL 处理:HAL 解析 Metadata,驱动 Sensor、ISP 等硬件模块完成捕获,生成原始帧数据。
  4. HAL 返回 CaptureResult:HAL 将实际使用的参数和统计信息封装为 camera_metadata_t,通过 process_capture_result() 回调返回。
  5. 相机服务层反序列化:将 HAL 返回的 Metadata 转换为 CaptureResult 对象,回调给应用层。
测试验证要点: 在步骤 2 和步骤 4 中,Metadata 的序列化/反序列化过程是常见的错误来源。测试时应使用 dumpMetadata() 或类似工具对比输入输出 Metadata 的完整性和一致性。
Metadata 传递流程 Metadata 传递流程(一次捕获周期) ① 构建 Request 应用层设置参数 ② 序列化下发 Service → HAL ③ HAL 处理 硬件捕获 ④ 返回 Result HAL → Service ⑤ 回调 应用层 测试验证重点:步骤 ②→③ 的 Request Metadata 完整性,步骤 ③→④ 的 Result Metadata 一致性 使用 dumpsys media.camera 或自定义 HAL 日志进行逐帧跟踪 t₀ t₁ t₂ t₃ t₄ 时间轴 → 每帧捕获周期通常为 16~33ms (30~60fps)