La version Android 8.0 transfère la gestion des commandes USB des scripts init
vers un démon USB natif pour une meilleure configuration et une 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 de gadget spécifiques à l'appareil.
Dans les versions précédentes, ces configurations spécifiques à l'appareil étaient obtenues via des scripts init
spécifiques à l'appareil (à l'aide de déclencheurs de propriété). Passer à une conception de couche d'abstraction matérielle (HAL) permet d'obtenir une implémentation beaucoup plus claire qui résout ces problèmes:
- Les opérations telles que les écritures dans les nœuds sysfs du noyau peuvent échouer, mais ne pas être propagées vers le 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 mode silencieux.
- Le nombre d'opérations pouvant être exécutées dans les scripts
init
est limité.
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 du HAL et la vitesse USB. Pour en savoir plus sur les appels d'API disponibles via le HAL USB, consultez le résumé du package android.hardware.usb
.
HAL et Treble
Les scripts init
spécifiques à l'appareil étaient utilisés à la place des couches HAL pour effectuer des opérations USB spécifiques à l'appareil. L'USB (via ADB) est une interface principale pour déboguer les problèmes système. La présence d'un démon natif pour effectuer la configuration USB élimine la dépendance au code du framework. Par conséquent, même si le framework plante, l'USB doit s'exécuter.
Sous le modèle Treble également introduit dans Android 8.0, tous les HAL sont isolés des services système et doivent s'exécuter dans leurs propres daemons natifs. Cela évite d'avoir à disposer d'un daemon USB exclusif, car la couche HAL sert également de daemon USB.
L'implémentation HAL par défaut s'occupe de tous les appareils antérieurs à Android 8.0. Par conséquent, aucune tâche spécifique à l'appareil ne sera effectuée 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ôles de données et de rôles d'alimentation.
Implémentation
La nouvelle interface HAL USB 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 de type C. Des modifications mineures peuvent être requises dans les scripts USB spécifiques à l'appareil pour transférer la propriété des nœuds typc-c vers le système.