Pakiety

.

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:

Pliki
generowane przez kompilator

Rysunek 1. Pliki wygenerowane przez kompilator.

  • IFoo.h Opisuje czystą wartość IFoo interfejsu w klasie C++; obejmuje metody i typy zdefiniowane w Interfejs IFoo w pliku IFoo.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 obiektu IFoo i opisuje serwer proxy HwBinder (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 implementacji IFoo i opisuje Wdrożenie interfejsu po stronie serwera w HwBinder. Deweloperzy nie powinni nigdy bezpośrednio odwoływać się do tych zajęć.
  • FooAll.cpp Klasa, która zawiera parametr dla serwera proxy HwBinder oraz Krótko o HwBinder. 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.

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