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 [email protected]). 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:

Figura 1. File generati dal compilatore.
IFoo.h. Descrive l'interfacciaIFoopura in una classe C++. Contiene i metodi e i tipi definiti nell'interfacciaIFoonel fileIFoo.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 daIFooe descrive l'implementazione del proxyHwBinder(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'implementazioneIFooe descrive l'implementazioneHwBinderstub (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 proxyHwBindersia per lo stubHwBinder. 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.
Eseguire il collegamento alle librerie condivise
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: [ /* ... */ "[email protected]", ],
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
IMyInterfacenel pacchetto è:::android::hardware::mypackage::V1_2::IMyInterface. (IMyInterfaceè un identificatore e non fa parte dello spazio dei nomi). - I tipi definiti nel file
types.haldel pacchetto vengono identificati come:::android::hardware::mypackage::V1_2::MyPackageType