4. Metadata Tag 分类:android.* 命名空间与核心 Tag 分组

在 Camera HAL3 的 Metadata 体系中,所有 Tag 均遵循 android.* 命名空间规范。该命名空间采用分层结构,将成百上千个 Tag 按功能域(Functional Section)进行分组。理解这些分组是进行 Metadata 传递测试的基础,因为每个分组对应着 HAL 中不同的处理模块和硬件单元。

4.1 命名空间结构:android.* 的层级规则

每个 Metadata Tag 的完整名称由三部分组成:android.<section>.<tagName>。例如 android.sensor.sensitivity 表示“sensor 分组的感光度 Tag”。这种命名方式确保了 Tag 的唯一性和可扩展性。

命名层级 示例 说明
android android 固定根命名空间,表示 Android 标准定义
section(分组) sensor 功能域,如 sensor、control、lens、flash 等
tagName(标签名) sensitivity 具体属性名称,通常为小写驼峰
测试要点: 在验证 Metadata 传递时,必须确认 HAL 返回的 Tag 名称严格遵循 android.<section>.<tagName> 格式。任何拼写错误或命名空间缺失都会导致 Framework 解析失败。

4.2 核心 Tag 分组总览

Camera HAL3 将 Metadata Tag 划分为约 20 个核心分组。以下列出测试验证中最常涉及的 8 个关键分组:

  • android.control:控制参数,包括 AE/AWB/AF 模式、场景模式、效果模式等。
  • android.sensor:传感器属性,如感光度、曝光时间、帧持续时间、温度等。
  • android.lens:镜头参数,包括光圈、焦距、光学防抖(OIS)状态、镜头姿态等。
  • android.flash:闪光灯控制与状态。
  • android.statistics:统计信息,如人脸检测结果、3A 统计数据、镜头阴影校正数据等。
  • android.request:请求相关,如 pipeline 深度、部分结果计数等。
  • android.jpeg:JPEG 编码参数,包括质量、缩略图尺寸、GPS 数据等。
  • android.scaler:图像缩放与裁剪参数,包括可用流配置、裁剪区域等。
测试建议: 在编写测试用例时,建议按分组组织测试脚本。例如,专门编写一个“sensor 分组验证套件”,集中测试所有 android.sensor.* Tag 的传递正确性。

4.3 分组关系与数据流:SVG 架构图

下图展示了核心分组在 Camera HAL3 数据流中的位置关系。从 Request 下发到 Result 返回,每个分组对应不同的处理阶段:

Camera HAL3 Metadata 核心分组与数据流 Camera HAL3 Metadata 核心分组与数据流 Request (android.request.*) android.control android.sensor android.lens android.flash Result (含 statistics.*) 说明 statistics.* 分组通常在 Result 中返回 scaler.* 和 jpeg.* 在后期处理阶段生效
架构解读: 上图展示了从 Request 到 Result 的简化数据流。Control 分组作为“指挥中心”,将参数分发给 Sensor 和 Lens 硬件模块;Flash 分组在曝光前介入;最终 Result 中携带所有分组的输出值,包括 statistics.* 统计信息。

4.4 分组详细说明与测试关注点

以下表格列出了每个核心分组在测试验证中的关键关注点:

分组名称 典型 Tag 示例 测试验证关注点
android.control aeMode, afMode, awbMode, effectMode 模式切换是否生效;3A 锁定/解锁状态传递是否正确
android.sensor sensitivity, exposureTime, frameDuration, timestamp 曝光参数是否与硬件实际配置一致;时间戳单调递增性
android.lens aperture, focalLength, opticalStabilizationMode, poseRotation 光圈/焦距值是否在设备标称范围内;OIS 状态与使能一致性
android.flash flashMode, flashState, flashStrength 闪光灯模式切换是否触发硬件动作;状态机转换是否合规
android.statistics faceDetectMode, faceRectangles, lensShadingMap 人脸检测结果坐标是否与预览图像对齐;统计数据更新频率
android.scaler availableStreamConfigurations, cropRegion 可用流配置是否与硬件能力匹配;裁剪区域边界值处理
android.jpeg quality, thumbnailSize, gpsCoordinates JPEG 质量参数是否影响编码输出;GPS 元数据嵌入正确性
android.request pipelineDepth, partialResultCount Pipeline 深度是否与硬件延迟匹配;部分结果计数是否合规

4.5 分组间的依赖关系:SVG 依赖图

某些分组之间存在强依赖关系。例如,android.control 中的 AE 模式会影响 android.sensor 中的曝光时间。下图展示了这些依赖关系:

Metadata 分组间依赖关系 Metadata 分组间依赖关系(测试重点关注) android.control AE 模式 → 曝光时间 AF 模式 → 焦距 android.sensor android.lens 曝光参数 → 统计数据 镜头状态 → 统计校正 android.statistics android.flash flashMode 控制 测试验证时必须检查依赖分组间的值一致性。例如:control.aeMode = ON 时,sensor.exposureTime 必须为有效值。
常见测试陷阱: 当 android.control.aeMode 设置为 OFF(手动模式)时,HAL 必须忽略 android.sensor.exposureTime 和 android.sensor.sensitivity 的 Request 值,但必须在 Result 中返回实际硬件使用的值。这是分组依赖测试中的高频失败点。

4.6 分组测试清单

在编写测试用例时,建议按以下清单覆盖每个分组:

  1. 存在性验证: 每个分组的关键 Tag 是否在 Result 中返回?
  2. 值范围验证: 返回的值是否在 availableCharacteristics 定义的范围内?
  3. 一致性验证: 依赖分组间的值是否逻辑一致(如 AE 模式与曝光时间)?
  4. 边界验证: 极端值(如最小/最大曝光时间)是否被正确传递?
  5. 状态机验证: 分组内的状态 Tag(如 flashState)是否按预期状态机转换?
效率技巧: 使用 adb shell dumpsys media.camera 可以快速查看当前会话中所有 Metadata 分组的原始值,适合在测试前期进行快速分组覆盖检查。