À quelques exceptions près, les packages d'interface HIDL se trouvent dans
hardware/interfaces
ou vendor/
. La
hardware/interfaces
est mappé de niveau supérieur directement à
Espace de noms du package android.hardware
; la version est un sous-répertoire
sous l'espace de noms du package (et non de l'interface).
Le compilateur hidl-gen
compile les fichiers .hal
dans
un ensemble de fichiers .h
et .cpp
. À partir de ces images générées automatiquement,
fichiers auxquels une bibliothèque partagée est créée,
avec laquelle les implémentations client/serveur sont liées.
Le fichier Android.bp
qui crée cette bibliothèque partagée est
généré automatiquement par hardware/interfaces/update-makefiles.sh
script. Chaque fois que vous ajoutez un package à hardware/interfaces
, ou
ajouter/supprimer des fichiers .hal
d'un package existant, vous devez le réexécuter
le script pour s'assurer que la bibliothèque partagée
générée est à jour.
Par exemple, l'exemple de fichier IFoo.hal
doit se trouver dans
hardware/interfaces/samples/1.0
L'exemple
Le fichier IFoo.hal
crée une interface IFoo dans
Package 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); };
Fichiers générés
Les fichiers générés automatiquement dans un package HIDL sont liés dans un seul
bibliothèque ayant le même nom que le package (par exemple,
android.hardware.samples@1.0
). La bibliothèque partagée exporte également
un en-tête unique, IFoo.h
, qui peut être inclus par les clients et
serveurs. Utiliser le compilateur hidl-gen
avec IFoo.hal
du fichier d'interface comme entrée, le mode lié possède le code suivant, généré automatiquement :
:
Figure 1 : Fichiers générés par le compilateur.
IFoo.h
Décrit leIFoo
pur interface dans une classe C++ ; il contient les méthodes et types définis dans le InterfaceIFoo
dans le fichierIFoo.hal
, traduite en C++ si nécessaire. Ne contient pas d'informations sur le Mécanisme RPC (par exemple,HwBinder
) utilisé pour implémenter cette interface. La classe est associée à un espace de noms avec le package et la version (par exemple,::android::hardware::samples::IFoo::V1_0
Les clients et les serveurs incluez l'en-tête suivant: les clients pour appeler les méthodes sur celui-ci et les serveurs pour de la mise en œuvre de ces méthodes.IHwFoo.h
Fichier d'en-tête contenant pour les fonctions qui sérialisent les types de données utilisés dans l'interface. Les développeurs ne doivent jamais inclure son en-tête directement (il ne contient classe).BpHwFoo.h
Une classe qui hérite deIFoo
et décrit le proxyHwBinder
(côté client) ; la mise en œuvre de l'interface. Les développeurs ne doivent jamais se référer à ce cours directement.BnHwFoo.h
Une classe contenant un référence à une implémentation deIFoo
et décrit Implémentation du bouchonHwBinder
(côté serveur) de l'interface. Les développeurs ne doivent jamais se référer directement à ce cours.FooAll.cpp
Une classe contenant les des implémentations pour le proxyHwBinder
et BouchonHwBinder
. Lorsqu'un client appelle une méthode d'interface, le proxy marshale automatiquement les arguments du client et envoie la transaction au pilote du noyau de liaison, qui transmet la transaction au bouchon (qui appelle ensuite l'implémentation réelle du serveur).
Les fichiers sont structurés de la même manière que les fichiers générés par
aidl-cpp
(pour en savoir plus, consultez la section "Mode passthrough" dans les
Présentation de HIDL, La seule
généré automatiquement et indépendant du mécanisme RPC utilisé par HIDL est
IFoo.h
; tous les autres fichiers sont liés au mécanisme RPC HwBinder utilisé
par HIDL. Par conséquent, les implémentations client et serveur ne doivent jamais
font directement référence à tout autre élément autre que IFoo
. Pour atteindre
inclure uniquement IFoo.h
et un lien avec le fichier partagé
bibliothèque.
Lien vers des bibliothèques partagées
Un client ou un serveur qui utilise une interface dans un package doit inclure le paramètre la bibliothèque partagée de ce package dans un (1) des éléments suivants : emplacements:
- Dans Android.mk:
LOCAL_SHARED_LIBRARIES += android.hardware.samples@1.0
- Dans Android.bp:
shared_libs: [ /* ... */ "android.hardware.samples@1.0", ],
Vous devrez peut-être inclure d'autres bibliothèques:
libhidlbase |
Inclut les types de données HIDL standards. À partir d'Android
10, cela contient également tous les symboles précédemment dans
libhidltransport et
libhwbinder
|
---|---|
libhidltransport |
Gère le transport des appels HIDL via différents mécanismes RPC/IPC. Android 10 rend cette bibliothèque obsolète. |
libhwbinder |
Symboles spécifiques à la liaison. Android 10 abandonne cette bibliothèque. |
libfmq |
IPC de la file d'attente de messages rapide. |
Espaces de noms
Fonctions et types HIDL tels que Return<T>
et
Les Void()
sont déclarées dans l'espace de noms ::android::hardware
.
L'espace de noms C++ d'un package est déterminé par le nom et la version du package.
Par exemple, un package mypackage avec la version 1.2 sous
hardware/interfaces
présente les caractéristiques suivantes:
- Espace de noms C++ :
::android::hardware::mypackage::V1_2
- Nom complet de
IMyInterface
, est:::android::hardware::mypackage::V1_2::IMyInterface
. (IMyInterface
est un identifiant qui ne fait pas partie de l'espace de noms.) - les types définis dans le fichier
types.hal
du package ; sont identifiés comme suit:::android::hardware::mypackage::V1_2::MyPackageType