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 } ] } ]
在這個範例中,property_id
的 value
為 289408001,並提供給 CURRENT_GEAR
做為 name
。在模擬器中,這個屬性已硬式編碼為名稱「Current Gear」。(您無法重現這個情境,因為這個頁面是在移除所有硬式編碼屬性後編寫,僅供示範)。
圖 1. 使用名稱和值定義的 VehicleProperty。
在模擬器的「VHAL 屬性」分頁中,名稱會重新整理,以便讀取 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}/
,也就是建構目標輸出的根目錄。