Vous pouvez mettre à jour des modules HAL préexistants en modules HAL HIDL 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 .hal
HIDL 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 de compilation requis au HAL. Vous pouvez ensuite effectuer des modifications manuelles pour convertir complètement le HAL.
c2hal activities
Lorsque vous exécutez c2hal
, tout le contenu du fichier d'en-tête est transféré vers des fichiers .hal
.
c2hal
identifie les structures qui contiennent des pointeurs de fonction dans le fichier d'en-tête fourni et convertit chaque structure 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 pound sont déplacées vers des énumérations, et les éléments qui ne font pas partie de HIDL ou qui ne sont pas convertibles (comme les déclarations de fonctions statiques) sont copiés dans des commentaires marqués du texte "NOTE
".
Activités manuelles
L'outil c2hal
ne sait pas quoi faire lorsqu'il rencontre certains éléments de construction. Par exemple, HIDL ne comporte pas de concept de pointeurs bruts. Par conséquent, lorsque c2hal
rencontre un pointeur dans des 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 de type "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 significatif. Par exemple, convertissez le paramètre de retour de méthodes telles que write
dans NFC de int32_t write_ret
généré automatiquement en Status status
(où Status
est une nouvelle énumération contenant les états NFC possibles).
Implémenter le HAL
Une fois que vous avez créé des fichiers .hal
pour représenter votre HAL, vous devez générer les fichiers de compilation (Make ou Soong) qui créent la prise en charge de la langue en C++ et en Java (sauf si le HAL utilise une fonctionnalité non prise en charge en Java). Le script ./hardware/interfaces/update-makefiles.sh
peut générer automatiquement des fichiers de compilation 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).
Lorsque les fichiers de compilation sont à 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).