Pakiety

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:

Pliki wygenerowane przez kompilator

Rysunek 1. Pliki wygenerowane przez kompilator
  • IFoo.h . Opisuje czysty interfejs IFoo w klasie C++; zawiera metody i typy zdefiniowane w interfejsie IFoo w pliku IFoo.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 z IFoo i opisuje implementację interfejsu proxy HwBinder (po stronie klienta). Programiści nigdy nie powinni odwoływać się bezpośrednio do tej klasy.
  • BnHwFoo.h . Klasa przechowująca odwołanie do implementacji IFoo i opisująca implementację interfejsu HwBinder (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 proxy HwBinder , jak i kodu pośredniczącego HwBinder . 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ą.

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