Konwertowanie modułów HAL

Możesz zaktualizować istniejące moduły HAL do modułów HIDL HAL, konwertując nagłówek w hardware/libhardware/include/hardware.

Używanie c2hal

Narzędzie c2hal wykonuje większość pracy związanej z konwersją, co zmniejsza liczbę wymaganych zmian ręcznych. Aby na przykład wygenerować plik HIDL .hal dla interfejsu HAL NFC:

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 w hardware/interfaces/nfc/1.0/. Uruchomienie polecenia hardware/interfaces/update-makefiles.sh w katalogu $ANDROID_BUILD_TOP dodaje też do HAL-u wymagany plik makefile. W tym miejscu możesz ręcznie wprowadzić zmiany, aby w pełni przekonwertować HAL.

c2hal activities

Gdy uruchomisz c2hal, wszystko z pliku nagłówkowego zostanie przeniesione do plików .hal.

c2hal identyfikuje struktury zawierające wskaźniki funkcji w podanym pliku nagłówkowym i przekształca każdą strukturę w osobny plik interfejsu. Na przykład alloc_device_t jest konwertowany na moduł HAL IAllocDevice (w pliku IAllocDevice.hal).

Wszystkie inne typy danych są kopiowane do pliku types.hal. Dyrektywy #define są przenoszone do wyliczeń, a elementy, które nie są częścią HIDL lub nie można ich przekonwertować (np. deklaracje funkcji statycznych), są kopiowane do komentarzy oznaczonych tekstem „NOTE”.

Aktywności zapisane ręcznie

Narzędzie c2hal nie wie, co zrobić, gdy napotka pewne konstrukcje. Na przykład HIDL nie ma pojęcia o surowych wskaźnikach. Z tego powodu, gdy c2hal napotyka wskaźnik w plikach nagłówkowych, nie wie, czy należy go interpretować jako tablicę czy jako odwołanie do innego obiektu. Podobnie nieprzezroczyste są wskaźniki typu void.

Pola takie jak int reserved[7] muszą zostać ręcznie usunięte podczas przejścia na HIDL. Elementy takie jak nazwa wartości zwracanej powinny zostać zmienione na bardziej znaczące. Na przykład parametr zwracany metod takich jak write w NFC powinien zostać zmieniony z autogenerowanego int32_t write_ret na Status status (gdzie Status to nowe wyliczenie zawierające możliwe stany NFC).

Wdrażanie interfejsu HAL

Po utworzeniu .hal plików reprezentujących HAL musisz wygenerować pliki makefile (Make lub Soong), które tworzą obsługę języków C++ i Java (chyba że HAL korzysta z funkcji nieobsługiwanej w Java). Skrypt ./hardware/interfaces/update-makefiles.sh może automatycznie generować pliki makefile dla HAL-i znajdujących się w katalogu hardware/interfaces (w przypadku HAL-i w innych lokalizacjach wystarczy zaktualizować skrypt).

Gdy pliki makefile będą aktualne, możesz wygenerować pliki nagłówkowe i zastosować metody. Szczegółowe informacje o implementowaniu wygenerowanego interfejsu znajdziesz w artykule HIDL C++ (w przypadku implementacji w C++) lub HIDL Java (w przypadku implementacji w Javie).