在模拟器中扩展 VHAL 属性描述

Android Automotive OS (AAOS) 包含可在模拟器的 VHAL 窗口中查看的常用 VHAL 属性。因此,您可以查看有关 VHAL 的大量信息,包括名称、描述和值的含义。这些信息是从 VHAL 属性的元数据中提取的,这些元数据硬编码到 QEMU 模拟器中。

当您添加自己专用于您设备的 VHAL 属性时,在 VHAL 窗口中查看 VHAL 元数据需要您修改代码并构建自定义 QEMU 模拟器。为了解决这个问题,您可以采用 JSON 格式编写自己的描述,并将它们添加到您的系统映像中。

概览

本页面详细介绍了如何在 AAOS 模拟器中扩展 VHAL 属性描述。

创建 JSON 元数据以扩展 VHAL 属性

模拟器会在 Android 虚拟设备 (AVD) 路径中查找所有以 -types-meta.json 结尾的其他元数据文件。JSON 文件应包含 Enum 对象数组,如下所示。

Enum 对象

名称为 VehiclePropertyEnum 对象是一种特殊情况,您可以将其视为根。其内容将添加到车辆属性映射中。其他 Enum(名称不是 VehicleProperty)定义了自定义值的名称映射。

Enum: {
  "name" : String,
  "values" : Array of { ValueObject }
}  

ValueObject

ValueObject: {
  "name" : String,
  "value" : Integer,
  "data_enum" : String, VehicleProperty only, optional,
}

对于 VehiclePropertyEnum 名称描述了此属性在模拟器的 VHAL 窗口中的显示方式。该值是由 ValueObject 描述的属性的 property_iddata_enumValueObject 与另一个 Enum 关联。此关联用于将值映射到人类可读的字符串,并且仅适用于 VehiclePropertyEnum 中的 ValueObject。下面显示了 VehicleProperty 的示例

[
  {
      "name": "VehicleProperty",
      "values": [
          {
              "name": "CURRENT_GEAR",
              "value": 289408001
          }
      ]
  }
]

在此示例中,property_idvalue289408001,作为 CURRENT_GEARname 提供。在模拟器中,此属性已硬编码为名称 Current Gear。(您无法重现此场景,因为本页面是在删除所有硬编码属性以进行演示后编写的。)

图 1. 使用名称和值定义的 VehicleProperty。

在模拟器的VHAL 属性标签页中,名称已刷新为读取预期的 CURRENT_GEAR

data_enum

在上面的示例中,当档位设置为 P 时,显示的值为 4

图 2. 值显示为 4。

正如预期的那样,在模拟器的 VHAL 属性标签页中,名称显示为 CURRENT_GEAR。这与现有模拟器形成对比,在现有模拟器中,它显示为 P

enum VehicleGear {
  GEAR_UNKNOWN = 0x0000,
  GEAR_NEUTRAL = 0x0001,
  GEAR_REVERSE = 0x0002,
  GEAR_PARK = 0x0004,
  GEAR_DRIVE = 0x0008,
  GEAR_1 = 0x0010,
  GEAR_2 = 0x0020,
  GEAR_3 = 0x0040,
  GEAR_4 = 0x0080,
  GEAR_5 = 0x0100,
  GEAR_6 = 0x0200,
  GEAR_7 = 0x0400,
  GEAR_8 = 0x0800,
  GEAR_9 = 0x1000,
}

要了解详情,请参阅 AIDL 定义。

正如 AIDL 中定义的那样,Park 档位的值为 4,这意味着您需要将值 4 转换为 P。这时您可以使用 data_enum,它将此属性值映射到另一个 Enum 中的人类可读字符串。模拟器使用此映射来转换属性值。例如

[
    {
        "name": "VehicleProperty",
        "values": [
            {
                "name": "CURRENT_GEAR",
                "value": 289408001,
                "data_enum": "VehicleGear"
            }
        ]
    },
    {
        "name": "VehicleGear",
        "values": [
            {
                "name": "GEAR_UNKNOWN",
                "value": 0
            },
            {
                "name": "GEAR_PARK",
                "value": 4
            }
        ]
    }

]

添加 "data_enum": "VehicleGear",以便模拟器使用名为 VehicleGearEnum 来转换属性值。添加另一个名为 VehicleGearEnum,其值应为 ValueObject 数组,其中属性值(带值)应显示为名称。

图 3. 值显示为 GEAR_PARK。

在模拟器的 VHAL 属性标签页中,名称已刷新为读取预期的 CURRENT_GEAR。属性值 4 显示为 GEAR_PARK

使用 JSON 元数据扩展 VHAL 属性

要使用 JSON 元数据扩展您的 VHAL 属性,请运行此 Python 脚本(包含在 Android 源代码中)以从 AIDL 中的信息生成扩展属性 JSON。

生成的 JSON 包含一些冗余值,例如 change_modeaccessunit。虽然此信息是 VHAL 属性的一部分,但这些 JSON 值不会影响模拟器的 VHAL 属性窗口中显示的内容。

将 JSON 元数据添加到系统映像

请注意,文件名必须以 -types-meta.json 结尾。否则,该文件将被忽略。

添加构建目标

-types-meta.json 文件添加到 PRODUCT_COPY_FILE。例如

PRODUCT_COPY_FILES += \
    device/generic/car/common/vehicle-types-meta.json:vehicle-types-meta.json

此代码将文件复制到 out/target/product/{your_target_path}/,即您构建的目标输出的根目录。