Poza kilkoma wyjątkami pakiety interfejsu HIDL znajdują się w
hardware/interfaces
lub katalog vendor/
.
hardware/interfaces
map najwyższego poziomu bezpośrednio do
android.hardware
przestrzeń nazw pakietu; wersja jest podkatalogiem
w przestrzeni nazw pakietu (nie interfejsu).
Kompilator hidl-gen
kompiluje pliki .hal
w
zestaw plików .h
i .cpp
. Z automatycznie wygenerowanych
to biblioteka udostępniona, którą tworzą implementacje klienta/serwera.
Plik Android.bp
, który tworzy tę bibliotekę udostępnianą, to
wygenerowane automatycznie przez: hardware/interfaces/update-makefiles.sh
skrypt. za każdym razem, gdy dodasz nowy pakiet do hardware/interfaces
lub
dodaj/usuń .hal
pliki 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ład
IFoo.hal
tworzy interfejs IFoo w
Pakiet samples:
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 generowane pliki w pakiecie HIDL są połączone w jedną współdzieloną kopię
biblioteka o tej samej nazwie co pakiet (na przykład
android.hardware.samples@1.0
). Biblioteka udostępniona eksportuje też plik
pojedynczy nagłówek IFoo.h
, który może być uwzględniany przez klientów i
serwerów. Używanie kompilatora hidl-gen
z kompilatorem IFoo.hal
jako dane wejściowe, tryb powiązania zawiera
pliki:
Rysunek 1. Pliki wygenerowane przez kompilator.
IFoo.h
Opisuje czystą wartośćIFoo
interfejsu w klasie C++; obejmuje metody i typy zdefiniowane w InterfejsIFoo
w plikuIFoo.hal
przetłumaczony na język C++ w razie potrzeby. Nie zawiera szczegółów związanych z: Mechanizm RPC (np.HwBinder
) używany do implementacji tego interfejsu. Klasa ma przestrzeń nazw z pakietem i wersją. Na przykład:::android::hardware::samples::IFoo::V1_0
Klienty i serwery dołącz ten nagłówek: Klienty wywołujących metody w tym nagłówku oraz serwery na wdrożenie tych metod.IHwFoo.h
Plik nagłówka zawierający deklaracje dla funkcji, które zserializują typy danych używane w interfejsie. Programiści nigdy nie powinni dodawać nagłówka bezpośrednio (nie zawiera on żadnych zajęcia).BpHwFoo.h
Klasa, która dziedziczy z obiektuIFoo
i opisuje serwer proxyHwBinder
(po stronie klienta) implementacji interfejsu. Deweloperzy nigdy nie powinni odwoływać się do tych zajęć bezpośrednio.BnHwFoo.h
Klasa, która zawiera odniesienia do implementacjiIFoo
i opisuje Wdrożenie interfejsu po stronie serwera wHwBinder
. Deweloperzy nie powinni nigdy bezpośrednio odwoływać się do tych zajęć.FooAll.cpp
Klasa, która zawiera parametr dla serwera proxyHwBinder
oraz Krótko oHwBinder
. Gdy klient wywołuje metodę interfejsu, serwer proxy automatycznie gromadzi argumenty klienta i wysyła transakcję sterownika jądra binder, który dostarcza transakcję do atrapy (która wywołuje rzeczywistą implementację serwera).
Struktura plików jest podobna do plików generowanych przez
aidl-cpp
(więcej informacji znajdziesz w sekcji „Tryb przekazywania” w
Omówienie HIDL). Jedyna
automatycznie generowany plik, który jest niezależny od mechanizmu RPC używanego przez HIDL,
IFoo.h
; wszystkie inne pliki są powiązane z używanym mechanizmem RPC HwBinder
przez HIDL. Dlatego implementacje klienta i serwera nigdy nie powinny
odnosi się bezpośrednio do czegoś innego niż IFoo
. Aby osiągnąć
uwzględniaj tylko IFoo.h
i link do wygenerowanego udostępnionego pliku
bibliotece.
Link do bibliotek udostępnionych
Klient lub serwer używający dowolnego interfejsu w pakiecie musi zawierać parametr zasoby wspólne tego pakietu w jednym (1) z tych elementów lokalizacje:
- W aplikacji Android.mk:
LOCAL_SHARED_LIBRARIES += android.hardware.samples@1.0
- W aplikacji Android.bp:
shared_libs: [ /* ... */ "android.hardware.samples@1.0", ],
Możesz potrzebować:
libhidlbase |
Obejmuje standardowe typy danych HIDL. Pierwsze kroki na Androidzie
10, zawiera także wszystkie symbole występujące wcześniej w
libhidltransport i
libhwbinder
|
---|---|
libhidltransport |
Obsługuje transport wywołań HIDL za pomocą różnych mechanizmów RPC/IPC. Android 10 wycofuje tę bibliotekę. |
libhwbinder |
Symbole powiązane z segregatorami. Android 10 spowoduje wycofanie tej biblioteki. |
libfmq |
Szybkie przesyłanie wiadomości IPC. |
Przestrzenie nazw
funkcje i typy HIDL, takie jak Return<T>
czy
Void()
są zadeklarowane w przestrzeni nazw ::android::hardware
.
Przestrzeń nazw pakietu w języku C++ zależy od nazwy i wersji pakietu.
Na przykład pakiet mójpakiet z wersją 1.2 poniżej
hardware/interfaces
ma te cechy:
- Przestrzeń nazw C++ to
::android::hardware::mypackage::V1_2
- Pełna i jednoznaczna nazwa firmy
IMyInterface
: przesyłka to:::android::hardware::mypackage::V1_2::IMyInterface
. (IMyInterface
jest identyfikatorem, a nie częścią przestrzeni nazw). - Typy zdefiniowane w pliku
types.hal
pakietu są określane jako:::android::hardware::mypackage::V1_2::MyPackageType