在模拟器中扩展 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 对象数组组成。

枚举对象

名为 VehiclePropertyEnum 对象是一种特殊情况,您可以将其视为根对象。它的内容会添加到车辆属性映射中。其他 Enums(名称不为 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 中的 ValueObjectsVehicleProperty 的示例如下:

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

在上面的示例中,value289408001property_id 是作为 CURRENT_GEARname 提供的。在模拟器中,此属性已硬编码为名称(即 Current Gear)。(由于本页是在移除所有硬编码属性以进行演示后编写的,因此您无法重现这种情况。)

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

在模拟器的 VHAL Properties 标签页中,名称会刷新为预期值 CURRENT_GEAR

data_enum

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

图 2. 值显示为 4。

正如预期的那样,在模拟器的 VHAL Properties 标签页上,名称显示为 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 Properties 标签页中,名称会按预期刷新为 CURRENT_GEAR4 的属性值显示为 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}/(即已构建目标输出的根目录)中。