Implementacja referencyjna

Udostępniamy implementację referencyjną dla VHAL AIDL. Główny wątek usługi jest implementowany w pliku VehicleService.cpp. Implementacja interfejsu VHAL znajduje się pod adresem DefaultVehicleHal.cpp.

Implementacja referencyjna opiera się na architekturze dwuwarstwowej. Na warstwie wyższej DefaultVehicleHal, implementuje interfejs VHAL AIDL i zapewnia logikę VHAL ogólną dla wszystkich urządzeń. W dolnej warstwie (FakeVehicleHardware) implementowany jest interfejs IVehicleHardware. Ta klasa symuluje logikę VHAL do interakcji z rzeczywistym sprzętem lub magistralą pojazdu i jest specyficzna dla urządzenia. Opcjonalnie dostawcy mogą dostosować tę samą architekturę, ponownie użyć tej samej klasy DefaultVehicleHal (rozszerzając ją, aby zastąpić metodę) i zastosować własną implementację IVehicleHardware.

Implementacja referencyjna VHAL
Rysunek 1. Referencyjna implementacja VHAL

DefaultVehicleHal zawiera tę logikę, która jest uważana za ogólną i może być stosowana w przypadku każdej implementacji VHAL.

  • Implementuje interfejs IVehicle.
  • Wykonuje podstawowe kontrole danych wejściowych, w tym sprawdzanie duplikatów identyfikatorów.
  • Przydziela obiekty klientów (na przykład GetValuesClient) do każdej operacji do każdego klienta wiązania i dodaje każdy z nich do puli globalnej.
  • Zarządza logiką wywołań asynchronicznych, np. dodawaniem oczekujących żądań do puli oczekujących żądań. Rozwiązuje oczekujące żądania po otrzymaniu wyników lub zwraca błąd, gdy czas oczekiwania na jedno z oczekujących żądań przekroczy limit.
  • Serializuje i deserializuje LargeParcelable (patrz ParcelableUtils.h).
  • Zarządza subskrypcją (patrz SubscriptionManager.h).
  • Sprawdzanie uprawnień. (zobacz funkcje checkReadPermissioncheckWritePermission).
  • Okresowo wywołuje IVehicleHardware.checkHealth i wysyła sygnały tętna (patrz funkcja checkHealth).

IVehicleHardware to ogólny interfejs reprezentujący implementację VHAL na potrzeby konkretnego sprzętu. Implementacja referencyjna dla IVehicleHardware to FakeVehicleHardware, która używa mapy w pamięci do przechowywania wartości właściwości i nie komunikuje się z rzeczywistym autobusem pojazdu. Jest przeznaczony do działania na emulatorze i nie ma żadnych zależności od sprzętu. Implementacje dostawców nie mogą używać tego interfejsu w postaci domyślnej. Muszą dodać logikę specyficzną dla magistrali danych pojazdu.

W Androidzie 14 usługa 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 konfiguracji w formacie JSON. Aby poznać format i zawartość pliku konfiguracji, zapoznaj się z przykładowym plikiem README VHAL.

FakeVehicleHardware obsługuje też zastępowanie pliku konfiguracji na potrzeby testowania. Jeśli właściwość systemowa persist.vendor.vhal_init_value_override jest ustawiona, usługa używa pliku konfiguracji z folderu /vendor/etc/automotive/vhaloverride/ na urządzeniu, aby zastąpić dotychczasową konfigurację. Implementacja dostawcy może używać podobnego podejścia, aby konfiguracja obsługiwanej właściwości VHAL nie była zakodowana na stałe, a można było ją ustalić dynamicznie w momencie uruchomienia. Konfiguracja właściwości pojazdu musi być statyczna po uruchomieniu urządzenia.