Z nielicznymi wyjątkami pakiety interfejsu HIDL znajdują się w katalogu hardware/interfaces
lub w katalogu vendor/
. hardware/interfaces
najwyższego poziomu są mapowane bezpośrednio do przestrzeni nazw pakietu android.hardware
; wersja jest podkatalogiem w przestrzeni nazw pakietu (nie interfejsu).
Kompilator hidl-gen
kompiluje pliki .hal
w zestaw plików .h
i .cpp
. Z tych automatycznie wygenerowanych plików budowana jest biblioteka współdzielona, z którą łączą się implementacje klient/serwer. Plik Android.bp
, który tworzy tę bibliotekę współdzieloną, jest automatycznie generowany przez skrypt hardware/interfaces/update-makefiles.sh
. Za każdym razem, gdy dodajesz nowy pakiet do hardware/interfaces
lub dodajesz/usuwasz pliki .hal
do/z istniejącego pakietu, musisz ponownie uruchomić skrypt, aby upewnić się, że wygenerowana biblioteka współdzielona jest aktualna.
Na przykład przykładowy plik IFoo.hal
powinien znajdować się w hardware/interfaces/samples/1.0
. Przykładowy plik IFoo.hal
tworzy interfejs IFoo w pakiecie próbek :
package android.hardware.samples@1.0; interface IFoo { struct Foo { int64_t someValue; handle myHandle; }; someMethod() generates (vec<uint32_t>); anotherMethod(Foo foo) generates (int32_t ret); };
Wygenerowane pliki
Automatycznie wygenerowane pliki w pakiecie HIDL są łączone w jedną bibliotekę współdzieloną o tej samej nazwie co pakiet (na przykład android.hardware.samples@1.0
). Biblioteka współdzielona eksportuje również pojedynczy nagłówek IFoo.h
, który mogą być dołączane przez klientów i serwery. Używając kompilatora hidl-gen
z plikiem interfejsu IFoo.hal
jako danymi wejściowymi, w trybie segregacji automatycznie generowane są następujące pliki:
-
IFoo.h
. Opisuje czysty interfejsIFoo
w klasie C++; zawiera metody i typy zdefiniowane w interfejsieIFoo
w plikuIFoo.hal
, w razie potrzeby przetłumaczone na typy C++. Nie zawiera szczegółów związanych z mechanizmem RPC (np.HwBinder
) używanym do implementacji tego interfejsu. Klasa ma przestrzeń nazw zawierającą pakiet i wersję, np::android::hardware::samples::IFoo::V1_0
. Zarówno klienci, jak i serwery zawierają ten nagłówek: Klienci do wywoływania na nim metod i serwery do implementowania tych metod. -
IHwFoo.h
. Plik nagłówkowy zawierający deklaracje funkcji serializujących typy danych używane w interfejsie. Programiści nigdy nie powinni bezpośrednio dołączać jego nagłówka (nie zawiera on żadnych klas). -
BpHwFoo.h
. Klasa, która dziedziczy zIFoo
i opisuje implementację interfejsu proxyHwBinder
(po stronie klienta). Programiści nigdy nie powinni odwoływać się bezpośrednio do tej klasy. -
BnHwFoo.h
. Klasa przechowująca odwołanie do implementacjiIFoo
i opisująca implementację interfejsuHwBinder
(po stronie serwera). Programiści nigdy nie powinni odwoływać się bezpośrednio do tej klasy. -
FooAll.cpp
. Klasa zawierająca implementacje zarówno serwera proxyHwBinder
, jak i kodu pośredniczącegoHwBinder
. Kiedy klient wywołuje metodę interfejsu, serwer proxy automatycznie zbiera argumenty od klienta i wysyła transakcję do sterownika jądra bindera, który dostarcza transakcję do kodu pośredniczącego po drugiej stronie (który następnie wywołuje rzeczywistą implementację serwera).
Pliki mają podobną strukturę do plików generowanych przez aidl-cpp
(więcej szczegółów znajdziesz w „Trybie przekazywania” w Przeglądzie HIDL ). Jedynym automatycznie wygenerowanym plikiem niezależnym od mechanizmu RPC używanego przez HIDL jest IFoo.h
; wszystkie inne pliki są powiązane z mechanizmem HwBinder RPC używanym przez HIDL. Dlatego implementacje klienta i serwera nigdy nie powinny bezpośrednio odnosić się do niczego innego niż IFoo
. Aby to osiągnąć, dołącz tylko IFoo.h
i połącz go z wygenerowaną biblioteką współdzieloną.
Łączenie z bibliotekami współdzielonymi
Klient lub serwer korzystający z dowolnego interfejsu w pakiecie musi zawierać bibliotekę współdzieloną tego pakietu w jednej (1) z następujących lokalizacji:
- W Android.mk :
LOCAL_SHARED_LIBRARIES += android.hardware.samples@1.0
- W Android.bp :
shared_libs: [ /* ... */ "android.hardware.samples@1.0", ],
Dodatkowe biblioteki, które mogą być konieczne, obejmują:
libhidlbase | Zawiera standardowe typy danych HIDL. Począwszy od Androida 10, zawiera to również wszystkie symbole znajdujące się wcześniej w libhidltransport i libhwbinder . |
---|---|
libhidltransport | Obsługuje transport wywołań HIDL za pośrednictwem różnych mechanizmów RPC/IPC. Android 10 wycofuje tę bibliotekę. |
libhwbinder | Symbole specyficzne dla segregatorów. Android 10 wycofuje tę bibliotekę. |
libfmq | Szybka kolejka wiadomości IPC. |
Przestrzenie nazw
Funkcje i typy HIDL, takie jak Return<T>
i Void()
są deklarowane w przestrzeni nazw ::android::hardware
. Przestrzeń nazw C++ pakietu jest określana na podstawie nazwy i wersji pakietu. Na przykład pakiet mypackage w wersji 1.2 w obszarze hardware/interfaces
ma następujące cechy:
- Przestrzeń nazw C++ to
::android::hardware::mypackage::V1_2
- Pełna nazwa
IMyInterface
w tym pakiecie to:::android::hardware::mypackage::V1_2::IMyInterface
. (IMyInterface
jest identyfikatorem, a nie częścią przestrzeni nazw). - Typy zdefiniowane w pliku
types.hal
pakietu są identyfikowane jako:::android::hardware::mypackage::V1_2::MyPackageType