エミュレータでの VHAL プロパティの説明を拡張する

Android Automotive OS(AAOS)には、エミュレータの VHAL ウィンドウで表示できる一般的な VHAL プロパティが含まれています。そのため、名前、説明、値の意味など、VHAL に関する情報を豊富に表示できます。情報は、QEMU エミュレータにハードコードされている VHAL プロパティのメタデータから抽出されます。

デバイス専用に独自の VHAL プロパティを追加する場合、VHAL ウィンドウで VHAL メタデータを表示するには、コードを修正し、カスタマイズした QEMU エミュレータをビルドする必要があります。これを回避するには、独自の説明を JSON 形式で記述し、システム イメージに追加します。

概要

このページでは、AAOS エミュレータで VHAL プロパティの説明を拡張する方法について詳しく説明します。

JSON メタデータを作成し VHAL プロパティを拡張する

エミュレータは、Android Virtual Device(AVD)のパス内にある末尾が -types-meta.json のすべてのファイルで追加のメタデータを探します。JSON ファイルは、以下のように Enum オブジェクトの配列で構成されていることが想定されます。

列挙型オブジェクト

VehicleProperty という名前の Enum オブジェクトは、ルートとみなすことができる特殊なケースです。その内容は、車両プロパティ マップに追加されます。他の EnumsVehicleProperty 以外の名前を持つ)は、カスタム値の名前のマップを定義します。

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 と関連付けます。この関連付けは、人が読める文字列に値をマッピングするために使用され、VehiclePropertyEnum 内の ValueObjects に対してのみ存在します。VehicleProperty の例を次に示します。

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

この例では、289408001 という value を持つ property_idCURRENT_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 で定義されているように、パーキングギアの値は 4 です。つまり、値 4P に変換する必要があります。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_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}/ にファイルを複製します。