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 返回,每个分组对应不同的处理阶段:
架构解读: 上图展示了从 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 中的曝光时间。下图展示了这些依赖关系:
常见测试陷阱: 当
android.control.aeMode 设置为 OFF(手动模式)时,HAL 必须忽略 android.sensor.exposureTime 和 android.sensor.sensitivity 的 Request 值,但必须在 Result 中返回实际硬件使用的值。这是分组依赖测试中的高频失败点。
4.6 分组测试清单
在编写测试用例时,建议按以下清单覆盖每个分组:
- 存在性验证: 每个分组的关键 Tag 是否在 Result 中返回?
- 值范围验证: 返回的值是否在
availableCharacteristics定义的范围内? - 一致性验证: 依赖分组间的值是否逻辑一致(如 AE 模式与曝光时间)?
- 边界验证: 极端值(如最小/最大曝光时间)是否被正确传递?
- 状态机验证: 分组内的状态 Tag(如
flashState)是否按预期状态机转换?
效率技巧: 使用
adb shell dumpsys media.camera 可以快速查看当前会话中所有 Metadata 分组的原始值,适合在测试前期进行快速分组覆盖检查。