La version 8.0 d'Android déplace la gestion des commandes USB hors des scripts init
et dans un démon USB natif pour une meilleure configuration et une meilleure fiabilité du code. Pour la configuration de la fonction Gadget, les scripts init
(déclencheurs de propriété) sont utilisés pour effectuer des opérations spécifiques aux gadgets.
Dans les versions précédentes, ces configurations spécifiques à l'appareil étaient obtenues à l'aide de scripts init
spécifiques à l'appareil (à l'aide de déclencheurs de propriété). Passer à une conception de couche d'abstraction matérielle (HAL, Hardware Abstraction Layer) permet d'obtenir une implémentation beaucoup plus propre qui résout les problèmes suivants :
- Des opérations telles que les écritures dans les nœuds sysfs du noyau peuvent échouer sans être propagées au code des frameworks qui définit le déclencheur de propriété. Par conséquent, les frameworks supposent à tort que les opérations ont réussi, même si elles ont échoué en silence.
- Les scripts
init
sont limités en nombre d'opérations pouvant être exécutées.
La version Android 12 ajoute la prise en charge du HAL USB Gadget pour les modèles de contrôle réseau (NCM) et les appels d'API qui renvoient à la fois le numéro de version HAL et la vitesse USB. Pour en savoir plus sur les appels d'API disponibles via l'USB HAL, consultez le résumé du package android.hardware.usb
.
HAL et Treble
Les scripts init
spécifiques à l'appareil ont été utilisés pour remplacer les couches HAL afin d'effectuer des opérations USB spécifiques à l'appareil. L'USB (via ADB) est une interface principale pour le débogage des problèmes système. Le fait de disposer d'un daemon natif pour effectuer la configuration USB élimine la dépendance au code du framework. Ainsi, même si le framework plante, l'USB devrait fonctionner.
Dans le modèle Treble également introduit dans Android 8.0, toutes les HAL sont isolées des services système et doivent s'exécuter dans leurs propres daemons natifs. Cela élimine la nécessité d'avoir un daemon USB exclusif, car la couche HAL fait également office de daemon USB.
L'implémentation HAL par défaut prend en charge tous les appareils antérieurs à Android 8.0. Par conséquent, aucun travail spécifique à l'appareil ne sera nécessaire pour les appareils antérieurs à Android 8.0. Android 8.0 utilise l'interface HAL pour interroger l'état des ports USB et effectuer des échanges de rôle de données et de rôle d'alimentation.
Implémentation
La nouvelle interface USB HAL doit être implémentée sur chaque appareil lancé sous Android 8.0.
L'implémentation par défaut devrait prendre en charge les appareils antérieurs à Android 8.0. L'implémentation par défaut est suffisante si l'appareil utilise la classe dual_role_usb
pour signaler l'état du port USB-C. Des modifications triviales peuvent être nécessaires dans les scripts USB spécifiques à l'appareil pour transférer la propriété des nœuds typc-c au système.