Die Android 8.0-Version verlagert die Handhabung von USB-Befehlen aus init
-Skripten und in einen nativen USB-Daemon für eine bessere Konfiguration und Code-Zuverlässigkeit. Für die Gadget-Funktionskonfiguration werden init
-Skripte (Eigenschaftsauslöser) verwendet, um gerätespezifische Gadget-Operationen auszuführen.
In früheren Versionen wurden diese gerätespezifischen Konfigurationen durch gerätespezifische init
-Skripte (unter Verwendung von Eigenschaftstriggern) erreicht. Der Wechsel zu einem HAL-Design (Hardware Abstraction Layer) führt zu einer viel saubereren Implementierung, die diese Probleme löst:
- Vorgänge wie Schreibvorgänge in die sysfs-Knoten des Kernels könnten fehlschlagen, aber nicht an den Frameworks-Code weitergegeben werden, der den Eigenschaftsauslöser festlegt. Infolgedessen gehen Frameworks fälschlicherweise davon aus, dass die Vorgänge erfolgreich waren, obwohl sie unbemerkt fehlgeschlagen sind.
-
init
Skripte haben eine begrenzte Anzahl von Operationen, die ausgeführt werden können.
Die Android 12-Version fügt USB Gadget HAL-Unterstützung für Network Control Models (NCM) und API-Aufrufe hinzu, die sowohl die HAL-Versionsnummer als auch die USB-Geschwindigkeit zurückgeben. Weitere Informationen zu den über USB HAL verfügbaren API-Aufrufen finden Sie in der android.hardware.usb
.
HAL und Höhen
Die gerätespezifischen init
-Skripte wurden als Ersatz für HAL-Schichten verwendet, um gerätespezifische USB-Operationen auszuführen. USB (über ADB) ist eine primäre Schnittstelle zum Debuggen von Systemproblemen. Ein nativer Daemon zur Durchführung der USB-Konfiguration eliminiert die Abhängigkeit vom Framework-Code, sodass USB selbst dann ausgeführt werden sollte, wenn das Framework abstürzt.
Unter dem ebenfalls in Android 8.0 eingeführten Treble -Modell sind alle HALs von den Systemdiensten isoliert und müssen in ihren eigenen nativen Daemons ausgeführt werden. Dadurch entfällt die Notwendigkeit, einen exklusiven USB-Daemon zu haben, da die HAL-Schicht auch als USB-Daemon fungiert.
Die standardmäßige HAL-Implementierung kümmert sich um alle Geräte vor Android 8.0. Daher gäbe es keine gerätespezifischen Arbeiten für Geräte vor Android 8.0. Android 8.0 verwendet die HAL-Schnittstelle, um den Status von USB-Anschlüssen abzufragen und Datenrollen- und Machtrollentausch durchzuführen.
Implementierung
Die neue USB-HAL-Schnittstelle muss auf jedem Gerät implementiert werden, das auf Android 8.0 gestartet wird. Die Standardimplementierung sollte sich um Geräte vor Android 8.0 kümmern. Die Standardimplementierung ist ausreichend, wenn das Gerät die Klasse dual_role_usb verwendet, um den Typ-C- dual_role_usb
zu melden. In gerätespezifischen USB-Skripten können geringfügige Änderungen erforderlich sein, um den Besitz der typc-c-Knoten auf das System zu übertragen.