Możesz zaktualizować istniejące moduły HAL do modułów HIDL HAL, konwertując nagłówek do hardware/libhardware/include/hardware
.
Używając c2hal
Narzędzie c2hal
obsługuje większość prac związanych z konwersją, zmniejszając liczbę wymaganych ręcznych zmian. Na przykład, aby wygenerować plik HIDL .hal
dla NFC HAL:
make c2hal
c2hal -r android.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport -p android.hardware.nfc@1.0 hardware/libhardware/include/hardware/nfc.h
Te polecenia dodają pliki do hardware/interfaces/nfc/1.0/
. Uruchomienie hardware/interfaces/update-makefiles.sh
z katalogu $ANDROID_BUILD_TOP również doda wymagany plik makefile do warstwy HAL. Stąd możesz wprowadzić ręczne zmiany, aby w pełni przekonwertować warstwę HAL.
działania c2hal
Kiedy uruchomisz c2hal
, cała zawartość pliku nagłówkowego zostanie przeniesiona do plików .hal
.
c2hal
identyfikuje struktury zawierające wskaźniki funkcji w dostarczonym pliku nagłówkowym i konwertuje każdą strukturę do osobnego pliku interfejsu. Na przykład alloc_device_t
jest konwertowane do modułu IAllocDevice
HAL (w pliku IAllocDevice.hal
).
Wszystkie pozostałe typy danych są kopiowane do pliku types.hal
. Definicje funtów są przenoszone do wyliczeń, a elementy nie będące częścią HIDL lub nie dające się konwertować (takie jak deklaracje funkcji statycznych) są kopiowane do komentarzy oznaczonych tekstem „ NOTE
”.
Czynności manualne
Narzędzie c2hal
nie wie, co zrobić, gdy napotka pewne konstrukcje. Na przykład w języku HIDL nie ma pojęcia surowych wskaźników; z tego powodu, gdy c2hal
napotyka wskaźnik w plikach nagłówkowych, nie wie, czy wskaźnik powinien być interpretowany jako tablica, czy jako odniesienie do innego obiektu. Wskaźniki pustki są również podobnie nieprzezroczyste.
Pole takie jak int reserved[7]
musi zostać ręcznie usunięte podczas przejścia do HIDL. Elementy takie jak nazwa zwracanej wartości powinny zostać zaktualizowane do czegoś bardziej znaczącego; na przykład konwersja zwracanego parametru metod takich jak write
w NFC z automatycznie wygenerowanego int32_t write_ret
na Status status
(gdzie Status
to nowe wyliczenie zawierające możliwe statusy NFC).
Implementacja HAL-a
Po utworzeniu plików .hal
reprezentujących warstwę HAL, należy wygenerować pliki makefile (Make lub Soong), które utworzą obsługę języków w C++ i Javie (chyba że warstwa HAL korzysta z funkcji nieobsługiwanej w Javie). Skrypt ./hardware/interfaces/update-makefiles.sh
może automatycznie generować pliki makefile dla warstw HAL znajdujących się w katalogu hardware/interfaces
(w przypadku warstw HAL znajdujących się w innych lokalizacjach wystarczy zaktualizować skrypt).
Kiedy pliki makefile będą aktualne, możesz wygenerować pliki nagłówkowe i zaimplementować metody. Aby uzyskać szczegółowe informacje na temat implementacji wygenerowanego interfejsu, zobacz HIDL C++ (dla implementacji C++) lub HIDL Java (dla implementacji Java).