在模擬器中擴展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: {
  "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
          }
      ]
  }
]

在此範例中,提供value 289408001property_id作為CURRENT_GEARname 。在模擬器中,此屬性已被硬編碼為名稱Current Gear 。 (您無法重現此場景,因為此頁面是在出於演示目的刪除所有硬編碼屬性後創建的。)

圖 1.使用名稱和值定義的 VehicleProperty。

在模擬器的VHAL Properties標籤中,名稱將刷新為如預期讀取CURRENT_GEAR

數據枚舉

在上例中,當檔位設定為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 中的定義,駐車檔的值為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_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}/中,即建置的目標輸出的根目錄。