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:
Figura 1. File generati dal compilatore.
IFoo.h
. Descrive l'interfacciaIFoo
pura in una classe C++. Contiene i metodi e i tipi definiti nell'interfacciaIFoo
nel 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 daIFoo
e 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'implementazioneIFoo
e descrive l'implementazioneHwBinder
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 proxyHwBinder
sia 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: [ /* ... */ "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