Conversion des modules HAL

Vous pouvez mettre à jour les modules HAL préexistants vers les modules HIDL HAL en convertissant l'en-tête dans hardware/libhardware/include/hardware .

Utiliser c2hal

L'outil c2hal gère la plupart du travail de conversion, réduisant ainsi le nombre de modifications manuelles requises. Par exemple, pour générer un fichier HIDL .hal pour le NFC HAL :

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 hardware/interfaces/update-makefiles.sh à partir du répertoire $ANDROID_BUILD_TOP ajoutera également le makefile requis au HAL. À partir de là, vous pouvez apporter des modifications manuelles pour convertir entièrement le HAL.

activités c2hal

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 un fichier d'interface distinct. Par exemple, alloc_device_t est converti en module IAllocDevice HAL (dans le fichier IAllocDevice.hal ).

Tous les autres types de données sont copiés dans un fichier types.hal . Les définitions dièse sont déplacées dans les énumérations, et les éléments ne faisant pas partie de HIDL ou non convertibles (tels que les déclarations de fonctions statiques) sont copiés dans les commentaires marqués du texte " NOTE ".

Activités manuelles

L'outil c2hal ne sait pas quoi faire lorsqu'il rencontre certaines constructions. Par exemple, HIDL n’a aucun concept de pointeurs bruts ; pour cette raison, 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 vides sont également tout aussi opaques.

Un champ tel que int reserved[7] doit être supprimé manuellement lors de la transition vers HIDL. Les éléments tels que le nom de la valeur de retour doivent être mis à jour vers quelque chose de plus significatif ; par exemple, convertir le paramètre de retour de méthodes telles que write in NFC à partir du int32_t write_ret généré automatiquement en Status status (où Status est une nouvelle énumération contenant les statuts NFC possibles).

Implémentation du HAL

Après avoir créé des fichiers .hal pour représenter votre HAL, vous devez générer les makefiles (Make ou Soong) qui créent la prise en charge du langage en C++ et Java (sauf si HAL utilise une fonctionnalité non prise en charge en Java). Le script ./hardware/interfaces/update-makefiles.sh peut générer automatiquement des makefiles pour les HAL situés dans le répertoire hardware/interfaces (pour les HAL situés dans d'autres emplacements, mettez simplement à jour le script).

Lorsque les makefiles sont à jour, vous êtes prêt à générer des fichiers d'en-tête et à implémenter des méthodes. Pour plus de détails 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).