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
对象数组组成。
枚举对象
名为 VehicleProperty
的 Enum
对象是一种特殊情况,您可以将其视为根对象。它的内容会添加到车辆属性映射中。其他 Enums
(名称不为 VehicleProperty
)定义自定义值名称的映射。
Enum: { "name" : String, "values" : Array of { ValueObject } }
ValueObject
ValueObject: { "name" : String, "value" : Integer, "data_enum" : String, VehicleProperty only, optional, }
对于 VehicleProperty
,Enum
名称描述了此属性在模拟器 VHAL 窗口中的显示方式。该值是 ValueObject
所描述属性的 property_id
。data_enum
将 ValueObject
与另一个 Enum
关联。此关联用于将值映射到人类可读的字符串,并且只存在于 VehicleProperty
的 Enum
中的 ValueObjects
。VehicleProperty
的示例如下:
[ { "name": "VehicleProperty", "values": [ { "name": "CURRENT_GEAR", "value": 289408001 } ] } ]
在上面的示例中,value
为 289408001 的 property_id
是作为 CURRENT_GEAR
的 name
提供的。在模拟器中,此属性已硬编码为名称(即 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"
,以便模拟器使用名为 VehicleGear
的 Enum
转换属性值。添加另一个名为 VehicleGear
的 Enum
,其值是一个 ValueObject
数组,其中的属性值(带值)应显示为名称。
图 3. 值显示为 GEAR_PARK。
在模拟器的 VHAL Properties 标签页中,名称会按预期刷新为 CURRENT_GEAR
。4
的属性值显示为 GEAR_PARK
。
使用 JSON 元数据以扩展 VHAL 属性
如需使用 JSON 元数据扩展 VHAL 属性,请运行此 Python 脚本(包含在 Android 源代码中),根据 AIDL 中的信息生成扩展属性 JSON。
生成的 JSON 包含一些冗余值,例如 change_mode
、access
和 unit
。虽然该信息是 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}/
(即已构建目标输出的根目录)中。