Convertir des modules HAL

Vous pouvez convertir des modules HAL préexistants en modules HIDL HAL en convertissant le en-tête dans hardware/libhardware/include/hardware.

Utiliser c2hal

La c2hal gère la majeure partie du travail de conversion, ce qui réduit le nombre d'opérations des modifications. Par exemple, pour générer un fichier .hal HIDL pour le protocole 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/. En cours d'exécution hardware/interfaces/update-makefiles.sh dans $ANDROID_BUILD_TOP ajoute également le fichier makefile requis au HAL. Vous pouvez alors effectuer des modifications manuelles pour convertir complètement le HAL.

Activités c2hal

Lorsque vous exécutez c2hal, tout le contenu du fichier d'en-tête est transféré. à .hal fichiers.

c2hal identifie les structs contenant des pointeurs de fonction dans fichier d'en-tête fourni et convertit chaque struct en un fichier d'interface distinct. Par exemple, alloc_device_t est converti au format 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 en livre sont déplacées dans des énumérations, et les éléments qui ne font pas ou non partie de HIDL les éléments convertibles (comme les déclarations de fonction statique) sont copiés dans les commentaires. comportant le texte "NOTE".

Activités manuelles

L'outil c2hal ne sait pas quoi faire lorsqu'il rencontre certaines constructions. Par exemple, HIDL n'a pas de concept de pointeur bruts. pour la raison suivante : Ainsi, lorsque c2hal rencontre un pointeur dans les fichiers d'en-tête, il ne savoir 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.

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

Implémenter le HAL

Après avoir créé des fichiers .hal pour représenter votre HAL, vous générer les fichiers makefile (Make ou Soong) qui créent la prise en charge de la langue C++ et Java (sauf si le HAL utilise une fonctionnalité non compatible avec Java). La Le script ./hardware/interfaces/update-makefiles.sh peut automatiquement générer des fichiers makefile pour les HAL situés dans le hardware/interfaces (pour les HAL situés dans d'autres emplacements, il vous suffit de mettre à jour le script).

Lorsque les fichiers makefile sont à jour, vous êtes prêt à générer des fichiers d'en-tête et mettre en œuvre des méthodes. Pour savoir comment implémenter l'interface générée, consultez HIDL C++ (pour C++ implémentations) ou HIDL Java (pour les implémentations Java).