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
.
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
(patrzParcelableUtils.h
). - Zarządza subskrypcją (patrz
SubscriptionManager.h
). - Sprawdzanie uprawnień. (zobacz funkcje
checkReadPermission
icheckWritePermission
). - 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.