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 przejmuje większość pracy związanej z konwersją, zmniejszając 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 folderze hardware/interfaces/nfc/1.0/. Uruchomienie polecenia hardware/interfaces/update-makefiles.sh w katalogu $ANDROID_BUILD_TOP powoduje też dodanie do pliku HAL wymaganego pliku makefile. Tutaj możesz wprowadzić ręczne zmiany, aby w pełni przekonwertować HAL.

Aktywności c2hal

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

c2hal identyfikuje struktury, które zawierają wskaźniki funkcji w dostarczonym pliku nagłówka, i konwertuje każdą strukturę na osobny plik interfejsu. Na przykład alloc_device_t jest konwertowane na moduł HAL IAllocDevice (w pliku IAllocDevice.hal).

Wszystkie inne typy danych są kopiowane do pliku types.hal. Definicje za pomocą znaku funta są przenoszone do wyliczeń, a elementy, które nie są częścią HIDL lub nie da się ich przekonwertować (np. deklaracje funkcji statycznej), są kopiowane do komentarzy oznaczonych tekstem „NOTE”.

Aktywności zapisane ręcznie

Narzędzie c2hal nie wie, co zrobić, gdy napotka określone konstrukcje. Na przykład HIDL nie ma pojęcia o surowych wskaźnikach. Dlatego gdy c2hal napotka wskaźnik w plikach nagłówków, nie wie, czy wskaźnik ma być interpretowany jako tablica, czy jako odwołanie do innego obiektu. Wskaźniki nieważne są również nieprzejrzyste.

Podczas przejścia na HIDL należy ręcznie usunąć pole takie jak int reserved[7]. Elementy takie jak nazwa wartości zwracanej powinny zostać zaktualizowane na bardziej znaczące. Na przykład parametr zwracany metod takich jak write w NFC powinien zostać przekonwertowany z wygenerowanego int32_t write_ret na Status status (gdzie Status to nowa enumeracja zawierająca możliwe stany NFC).

Wdrażanie interfejsu HAL

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

Gdy pliki make są aktualne, możesz wygenerować pliki nagłówków i zaimplementować 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 Java).