我們提供了 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
,它將使用裝置上/vendor/etc/automotive/vhaloverride/
資料夾中的設定檔來覆寫現有配置。供應商實作可以使用類似的方法,以便 VHAL 支援的屬性配置不是硬編碼的,並且可以在啟動時動態決定。設備啟動後,車輛屬性配置必須是靜態的。