Konwersja modułów HAL

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).