Convertir des modules HAL

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).