Zapewniamy referencyjną implementację dla AIDL VHAL. Główny wątek usługi jest zaimplementowany w VehicleService.cpp
. Implementacja interfejsu VHAL znajduje się w DefaultVehicleHal.cpp
.
Implementacja referencyjna oparta jest na architekturze dwuwarstwowej. W wyższej warstwie DefaultVehicleHal
implementuje interfejs VHAL AIDL i zapewnia ogólną logikę VHAL dla wszystkich urządzeń sprzętowych. W niższej warstwie FakeVehicleHardware
implementuje interfejs IVehicleHardware
. Ta klasa symuluje logikę VHAL interakcji z rzeczywistym sprzętem lub magistralą pojazdu i jest specyficzna dla urządzenia. Opcjonalnie dostawcy mogą dostosować tę samą architekturę, ponownie wykorzystać tę samą klasę DefaultVehicleHal
(rozszerzając ją w celu nadpisania metody) i zapewnić własną implementację IVehicleHardware
.
DefaultVehicleHal
zawiera następującą logikę, która jest uważana za ogólną i może mieć zastosowanie do dowolnej implementacji VHAL.
- Implementuje interfejs
IVehicle
. - Wykonuje podstawowe kontrole danych wejściowych, w tym sprawdzanie duplikatów identyfikatorów.
- Przydziela obiekty klienta (na przykład
GetValuesClient
) dla każdej operacji dla każdego klienta powiązania i dodaje je do puli globalnej. - Zarządza logiką asynchronicznych wywołań zwrotnych, na przykład dodawaniem oczekujących żądań do puli oczekujących żądań. Rozwiązuje oczekujące żądania po otrzymaniu wyników lub zwraca błąd, gdy upłynie limit czasu jednego z oczekujących żądań.
- Serializuje i deserializuje
LargeParcelable
(patrzParcelableUtils.h
). - Zarządza subskrypcją (patrz
SubscriptionManager.h
). - Sprawdza uprawnienia. (Zobacz funkcje
checkReadPermission
icheckWritePermission
). - Okresowo wywołuje IVehicleHardware.checkHealth i wysyła sygnały pulsu (patrz funkcja
checkHealth
).
IVehicleHardware
to ogólny interfejs używany do reprezentowania specyficznej dla sprzętu implementacji VHAL. Implementacją referencyjną dla IVehicleHardware
jest FakeVehicleHardware
, która wykorzystuje mapę w pamięci do przechowywania wartości właściwości i nie komunikuje się z rzeczywistą magistralą pojazdu. Jest przeznaczony do działania na emulatorze i nie ma żadnych zależności specyficznych dla sprzętu. Wdrożenia dostawcy nie mogą używać go w niezmienionej postaci i muszą dodać logikę specyficzną dla autobusu pojazdu.
W systemie Android 14 FakeVehicleHardware
odczytuje obsługiwaną konfigurację właściwości w czasie wykonywania podczas inicjalizacji z folderu /vendor/etc/automotive/vhalconfig/
urządzenia, który zawiera plik konfiguracyjny w stylu JSON. Zobacz referencyjny plik README VHAL , aby zapoznać się z formatem pliku konfiguracyjnego i zawartością pliku konfiguracyjnego.
FakeVehicleHardware
obsługuje również zastąpienie pliku konfiguracyjnego na potrzeby testów. Jeśli ustawiona jest właściwość systemowa persist.vendor.vhal_init_value_override
, używa pliku konfiguracyjnego z folderu /vendor/etc/automotive/vhaloverride/
na urządzeniu w celu zastąpienia istniejącej konfiguracji. Implementacja dostawcy może zastosować podobne podejście, dzięki czemu konfiguracja właściwości obsługiwana przez VHAL nie będzie zakodowana na stałe i będzie można o niej dynamicznie decydować w momencie rozpoczęcia. Po uruchomieniu urządzenia konfiguracja właściwości pojazdu musi być statyczna.