Vous pouvez mettre à jour les modules HAL préexistants en modules HIDL HAL en convertissant l'en-tête dans hardware/libhardware/include/hardware
.
Utiliser c2hal
L'outil c2hal
gère la majeure partie du travail de conversion, ce qui réduit le nombre de modifications manuelles requises. Par exemple, pour générer un fichier HIDL .hal
pour le HAL NFC :
make c2hal
c2hal -r android.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport -p android.hardware.nfc@1.0 hardware/libhardware/include/hardware/nfc.h
Ces commandes ajoutent des fichiers dans hardware/interfaces/nfc/1.0/
. L'exécution de hardware/interfaces/update-makefiles.sh
à partir du répertoire $ANDROID_BUILD_TOP
ajoute également le fichier makefile requis au HAL. Vous pouvez ensuite apporter des modifications manuelles pour convertir complètement la HAL.
c2hal activities
Lorsque vous exécutez c2hal
, tout le contenu du fichier d'en-tête est transféré vers les fichiers .hal
.
c2hal
identifie les structs contenant des pointeurs de fonction dans le fichier d'en-tête fourni et convertit chaque struct en fichier d'interface distinct.
Par exemple, alloc_device_t
est converti en module HAL IAllocDevice
(dans le fichier IAllocDevice.hal
).
Tous les autres types de données sont copiés dans un fichier types.hal
.
Les définitions de hachage sont déplacées dans les énumérations, et les éléments qui ne font pas partie de HIDL ou qui ne sont pas convertibles (tels que les déclarations de fonctions statiques) sont copiés dans des commentaires marqués avec le texte "NOTE
".
Activités manuelles
L'outil c2hal
ne sait pas quoi faire lorsqu'il rencontre certains éléments. Par exemple, HIDL n'a pas de concept de pointeurs bruts. Par conséquent, lorsque c2hal
rencontre un pointeur dans les fichiers d'en-tête, il ne sait pas si le pointeur doit être interprété comme un tableau ou comme une référence à un autre objet. Les pointeurs void sont également opaques.
Les champs tels que int reserved[7]
doivent être supprimés manuellement lors de la transition vers HIDL. Les éléments tels que le nom de la valeur renvoyée doivent être remplacés par quelque chose de plus pertinent. Par exemple, le paramètre de retour des méthodes telles que write
dans NFC doit passer de la valeur int32_t write_ret
générée automatiquement à Status status
(où Status
est une nouvelle énumération contenant les états NFC possibles).
Implémenter la HAL
Après avoir créé des fichiers .hal
pour représenter votre HAL, vous devez générer les fichiers make (Make ou Soong) qui créent la prise en charge du langage en C++ et en Java (sauf si la HAL utilise une fonctionnalité non compatible avec Java). Le script ./hardware/interfaces/update-makefiles.sh
peut générer automatiquement des fichiers make pour les HAL situés dans le répertoire hardware/interfaces
(pour les HAL situés ailleurs, il vous suffit de mettre à jour le script).
Une fois les fichiers make à jour, vous êtes prêt à générer des fichiers d'en-tête et à implémenter des méthodes. Pour en savoir plus sur l'implémentation de l'interface générée, consultez HIDL C++ (pour les implémentations C++) ou HIDL Java (pour les implémentations Java).