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