我們提供 AIDL VHAL 的參考實作。主要服務執行緒實作於 VehicleService.cpp
。VHAL 介面實作位於 DefaultVehicleHal.cpp
。
參考實作是根據雙層架構。在上層,DefaultVehicleHal
會實作 VHAL AIDL 介面,並提供適用於所有硬體裝置的 VHAL 邏輯。在下層,FakeVehicleHardware
會實作 IVehicleHardware
介面。這個類別會模擬與實際硬體或車輛匯流排互動的 VHAL 邏輯,且適用於特定裝置。供應商也可以選擇採用相同架構、重複使用相同的 DefaultVehicleHal
類別 (將其擴充為覆寫方法),並提供自己的 IVehicleHardware
實作項目。
DefaultVehicleHal
包含下列邏輯,可視為一般邏輯,適用於任何 VHAL 實作。
- 實作
IVehicle
介面。 - 執行基本輸入檢查,包括檢查重複的 ID。
- 為每個繫結器用戶端的每個作業分配用戶端物件 (例如
GetValuesClient
),並將每個物件新增至全域集區。 - 管理非同步回呼邏輯,例如將待處理要求新增至待處理要求集區。收到結果時,系統會解決待處理要求;如果其中一項待處理要求逾時,則會傳回錯誤。
- 序列化及還原
LargeParcelable
(請參閱ParcelableUtils.h
)。 - 管理訂閱項目 (請參閱
SubscriptionManager.h
)。 - 檢查權限。(請參閱
checkReadPermission
和checkWritePermission
函式)。 - 定期呼叫
IVehicleHardware.checkHealth
並傳送心跳信號 (請參閱checkHealth
函式)。
IVehicleHardware
是通用介面,用於表示 VHAL 的硬體專屬實作項目。IVehicleHardware
的參考實作項目為 FakeVehicleHardware
,該項目會使用記憶體內對應來儲存屬性值,且不會與實際車輛匯流排通訊。這項測試旨在模擬器上執行,且沒有硬體專屬依附元件。供應商實作項目不得直接使用,必須加入車輛匯流排專屬邏輯。
從 Android 14 開始,FakeVehicleHardware
會在初始化期間,從裝置的 /vendor/etc/automotive/vhalconfig/
資料夾讀取支援的屬性設定,該資料夾包含 JSON 樣式的設定檔。如需設定檔格式和內容,請參閱參考 VHAL README 檔案。
FakeVehicleHardware
也支援測試的設定檔覆寫。如果設定了系統屬性 persist.vendor.vhal_init_value_override
(必須在建構時或啟動期間極早設定這個屬性,也就是在 VHAL 初始化之前),系統會使用裝置上 /vendor/etc/automotive/vhaloverride/
資料夾中的設定檔,覆寫現有設定。供應商實作項目可以採用類似方法,這樣 VHAL 支援的屬性設定就不會經過硬式編碼,而且可以在啟動時動態決定。VHAL 初始化後,車輛屬性設定清單必須保持靜態。
從 Android 16 開始,GRPCVehicleHardware
會提供另一個參考 IVehicleHardware
實作項目。這項實作假設遠端機器或 VM 上有獨立伺服器,其中包含屬性處理邏輯。在 AAOS 裝置上執行的 VHAL 會做為 Proxy,將要求轉送至遠端伺服器。詳情請參閱 grpc。