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 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 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é). Le passage à une couche d'abstraction matérielle (HAL) permet d'obtenir une implémentation beaucoup plus propre qui résout les problèmes suivants:
- Les opérations telles que l'écriture sur les nœuds sysfs du noyau pourraient échouer, mais ne pas être propagées au code du framework 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 d'Android 12 prend en charge HAL le widget USB pour les modèles de contrôle de réseau (NCM, Network Control Models) 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écapitulatif 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. 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, USB devrait être en cours d'exécution.
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'applique à tous les appareils antérieurs à Android 8.0. Par conséquent, il n'y aurait pas de tâche spécifique à chaque appareil pour les appareils antérieurs à Android 8.0. Android 8.0 utilise l'interface HAL pour interroger l'état des ports USB et pour effectuer des changements de rôle de données et de rôle d'alimentation.
Implémentation
La nouvelle interface HAL USB doit être implémentée sur chaque appareil lancé sur 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 nécessaires dans les scripts USB spécifiques à l'appareil pour transférer la propriété des nœuds typc-c au système.