1. HAL3 架构概述
1.1 Android Camera HAL3 整体架构
Android Camera HAL3 是 Android 系统为相机硬件抽象层定义的第三代接口规范,旨在提供更灵活、高性能的相机控制能力。与 HAL1 的“黑盒”模式不同,HAL3 将相机 pipeline 完全暴露给框架,使应用层能够精细控制每一帧的捕获参数与处理流程。
整体架构从上到下分为三个主要层次:
- 应用层 (Application Framework):通过
android.hardware.camera2API 与相机服务交互,发送 CaptureRequest、接收 CaptureResult。 - 相机服务层 (Camera Service):位于
cameraserver进程中,负责管理 CameraDevice、处理 Metadata 路由、协调多个客户端访问。 - HAL 层 (Hardware Abstraction Layer):由 SoC 厂商或 OEM 实现,直接操作传感器、ISP、3A 算法等硬件模块。
关键点: HAL3 的核心设计理念是“一次请求,一帧结果”——每个 CaptureRequest 对应一个独立的帧,Metadata 作为请求与结果之间的结构化数据载体,贯穿整个 pipeline。
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 的写入与读取。
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 等关键字段。
1.4 Metadata 传递的核心流程
理解 Metadata 的传递流程是测试验证的基础。一次完整的捕获周期包含以下步骤:
- 应用层构建 CaptureRequest:通过
CameraDevice.createCaptureRequest()创建请求,设置目标输出 Surface 和各项 Metadata 参数。 - 相机服务层序列化:将 CaptureRequest 中的 Metadata 序列化为 HAL 可识别的
camera_metadata_t结构,通过 HAL 接口process_capture_request()下发。 - HAL 处理:HAL 解析 Metadata,驱动 Sensor、ISP 等硬件模块完成捕获,生成原始帧数据。
- HAL 返回 CaptureResult:HAL 将实际使用的参数和统计信息封装为
camera_metadata_t,通过process_capture_result()回调返回。 - 相机服务层反序列化:将 HAL 返回的 Metadata 转换为
CaptureResult对象,回调给应用层。
测试验证要点: 在步骤 2 和步骤 4 中,Metadata 的序列化/反序列化过程是常见的错误来源。测试时应使用
dumpMetadata() 或类似工具对比输入输出 Metadata 的完整性和一致性。