Spedizioni

Con poche eccezioni, i pacchetti di interfaccia HIDL si trovano nella directory hardware/interfaces o vendor/. Il livello superiore hardware/interfaces viene mappato direttamente allo spazio dei nomi del pacchetto android.hardware; la versione è una sottodirectory dello spazio dei nomi del pacchetto (non dell'interfaccia).

Il compilatore hidl-gen compila i file .hal in un insieme di file .h e .cpp. Da questi file generati automaticamente viene creata una libreria condivisa a cui fanno riferimento le implementazioni client/server. Il file Android.bp che genera questa libreria condivisa viene generato automaticamente dallo script hardware/interfaces/update-makefiles.sh. Ogni volta che aggiungi un nuovo pacchetto a hardware/interfaces o aggiungi/rimuovi file .hal a/da un pacchetto esistente, devi eseguire nuovamente lo script per assicurarti che la libreria condivisa generata sia aggiornata.

Ad esempio, il file di esempio IFoo.hal deve trovarsi in hardware/interfaces/samples/1.0. Il file di esempioIFoo.hal crea un'interfaccia IFoo nel pacchetto 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);
};

File generati

I file generati automaticamente in un pacchetto HIDL vengono collegati a un'unica libreria condivisa con lo stesso nome del pacchetto (ad esempio android.hardware.samples@1.0). La libreria condivisa esporta anche un singolo header, IFoo.h, che può essere incluso da client e server. Se utilizzi il compilatore hidl-gen con il file di interfaccia IFoo.hal come input, la modalità con binder contiene i seguenti file generati automaticamente:

File
generati dal compilatore

Figura 1. File generati dal compilatore.

  • IFoo.h. Descrive l'interfaccia IFoo pura in una classe C++. Contiene i metodi e i tipi definiti nell'interfaccia IFoo nel file IFoo.hal, tradotti in tipi C++ se necessario. Non contiene dettagli relativi al meccanismo RPC (ad es. HwBinder) utilizzato per implementare questa interfaccia. La classe è nello spazio dei nomi con il pacchetto e la versione, ad esempio ::android::hardware::samples::IFoo::V1_0. Sia i client sia i server includono questo header: i client per chiamare i metodi e i server per implementarli.
  • IHwFoo.h. File di intestazione contenente dichiarazioni per le funzioni che eseguono la serializzazione dei tipi di dati utilizzati nell'interfaccia. Gli sviluppatori non devono mai includere direttamente l'intestazione (non contiene classi).
  • BpHwFoo.h. Una classe che eredita da IFoo e descrive l'implementazione del proxy HwBinder (lato client) dell'interfaccia. Gli sviluppatori non devono mai fare riferimento direttamente a questa classe.
  • BnHwFoo.h. Una classe che contiene un riferimento a un'implementazione IFoo e descrive l'implementazione HwBinder stub (lato server) dell'interfaccia. Gli sviluppatori non devono mai fare riferimento direttamente a questa classe.
  • FooAll.cpp. Una classe che contiene le implementazioni sia per il proxy HwBinder sia per lo stub HwBinder. Quando un client chiama un metodo dell'interfaccia, il proxy li ordina automaticamente e invia la transazione al driver del kernel del binder, che la invia allo stub sull'altro lato (che poi chiama l'implementazione effettiva del server).

I file sono strutturati in modo simile a quelli generati da aidl-cpp (per maggiori dettagli, consulta "Modalità passthrough" nella Panoramica di HIDL). L'unico file generato automaticamente indipendente dal meccanismo RPC utilizzato da HIDL è IFoo.h; tutti gli altri file sono legati al meccanismo RPC HwBinder utilizzato da HIDL. Pertanto, le implementazioni client e server non devono mai fare riferimento direttamente a qualcosa di diverso da IFoo. Per farlo, includi solo IFoo.h e fai il link alla libreria condivisa generata.

Un client o un server che utilizza qualsiasi interfaccia in un pacchetto deve includere la libreria condivisa del pacchetto in una (1) delle seguenti posizioni:

  • In Android.mk:
    LOCAL_SHARED_LIBRARIES += android.hardware.samples@1.0
  • In Android.bp:
    shared_libs: [
        /* ... */
        "android.hardware.samples@1.0",
    ],

Librerie aggiuntive che potresti dover includere:

libhidlbase Sono inclusi i tipi di dati HIDL standard. A partire da Android 10, contiene anche tutti i simboli precedentemente presenti in libhidltransport e libhwbinder.
libhidltransport Gestisce il trasporto delle chiamate HIDL tramite diversi meccanismi RPC/IPC. Android 10 ritira questa libreria.
libhwbinder Simboli specifici del rilegatore. Android 10 ritira questa libreria.
libfmq IPC con coda di messaggi rapida.

Spazi dei nomi

Funzioni e tipi HIDL come Return<T> e Void() sono dichiarati nello spazio dei nomi ::android::hardware. Lo spazio dei nomi C++ di un pacchetto è determinato dal nome e dalla versione del pacchetto. Ad esempio, un pacchetto mypackage con la versione 1.2 in hardware/interfaces ha le seguenti qualità:

  • Il spazio dei nomi C++ è ::android::hardware::mypackage::V1_2
  • Il nome completo di IMyInterface nel pacchetto è: ::android::hardware::mypackage::V1_2::IMyInterface. (IMyInterface è un identificatore e non fa parte dello spazio dei nomi).
  • I tipi definiti nel file types.hal del pacchetto vengono identificati come: ::android::hardware::mypackage::V1_2::MyPackageType