參考實作

我們提供 AIDL VHAL 的參考實作。主要服務執行緒實作於 VehicleService.cpp。VHAL 介面實作位於 DefaultVehicleHal.cpp

參考實作是根據雙層架構。在上層,DefaultVehicleHal 會實作 VHAL AIDL 介面,並提供適用於所有硬體裝置的 VHAL 邏輯。在下層,FakeVehicleHardware 會實作 IVehicleHardware 介面。這個類別會模擬與實際硬體或車輛匯流排互動的 VHAL 邏輯,且適用於特定裝置。供應商也可以選擇採用相同架構、重複使用相同的 DefaultVehicleHal 類別 (將其擴充為覆寫方法),並提供自己的 IVehicleHardware 實作項目。

VHAL 參考實作
圖 1. VHAL 參考實作

DefaultVehicleHal 包含下列邏輯,可視為一般邏輯,適用於任何 VHAL 實作。

  • 實作 IVehicle 介面。
  • 執行基本輸入檢查,包括檢查重複的 ID。
  • 為每個繫結器用戶端的每個作業分配用戶端物件 (例如 GetValuesClient),並將每個物件新增至全域集區。
  • 管理非同步回呼邏輯,例如將待處理要求新增至待處理要求集區。收到結果時,系統會解決待處理要求;如果其中一項待處理要求逾時,則會傳回錯誤。
  • 序列化及還原 LargeParcelable (請參閱 ParcelableUtils.h)。
  • 管理訂閱項目 (請參閱SubscriptionManager.h)。
  • 檢查權限。(請參閱 checkReadPermissioncheckWritePermission 函式)。
  • 定期呼叫 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