In Android 8.0 wird die Verarbeitung von USB-Befehlen aus init
-Scripts in einen nativen USB-Daemon verschoben, um die Konfiguration und Codezuverlässigkeit zu verbessern. Für die Konfiguration der Gadget-Funktion werden init
-Scripts (Property-Trigger) verwendet, um gerätespezifische Gadget-Vorgänge auszuführen.
In früheren Versionen wurden diese gerätespezifischen Konfigurationen über gerätespezifische init
-Scripts (mithilfe von Property-Triggern) erreicht. Die Umstellung auf ein 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önnen fehlschlagen, aber nicht an den Framework-Code zurückgegeben werden, der den Attributtrigger festlegt. Daher gehen Frameworks fälschlicherweise davon aus, dass die Vorgänge erfolgreich waren, auch wenn sie stillschweigend fehlgeschlagen sind.
- Für
init
-Scripts kann nur eine begrenzte Anzahl von Vorgängen ausgeführt werden.
Mit Android 12 wird die HAL-Unterstützung für USB-Gadgets für NCMs (Network Control Models) und API-Aufrufe hinzugefügt, die sowohl die HAL-Versionsnummer als auch die USB-Geschwindigkeit zurückgeben. Weitere Informationen zu den über die USB HAL verfügbaren API-Aufrufen finden Sie in der android.hardware.usb
-Paketübersicht.
HAL und Treble
Die gerätespezifischen init
-Scripts wurden als Ersatz für HAL-Ebenen verwendet, um gerätespezifische USB-Vorgänge auszuführen. USB (über ADB) ist eine primäre Schnittstelle zur Behebung von Systemproblemen. Ein nativer Daemon zur Ausführung der USB-Konfiguration eliminiert die Abhängigkeit vom Framework-Code. Selbst wenn das Framework abstürzt, sollte USB also weiterhin ausgeführt werden.
Beim Treble-Modell, das ebenfalls in Android 8.0 eingeführt wurde, sind alle HALs von Systemdiensten isoliert und müssen in eigenen nativen Daemons ausgeführt werden. Dadurch ist kein exklusiver USB-Daemon mehr erforderlich, da die HAL-Ebene auch als USB-Daemon fungiert.
Die Standard-HAL-Implementierung ist für alle Geräte mit einer älteren Android-Version als 8.0 zuständig. Daher sind für Geräte mit einer älteren Android-Version keine gerätespezifischen Änderungen erforderlich. Android 8.0 verwendet die HAL-Schnittstelle, um den Status von USB-Ports abzufragen und die Daten- und Stromversorgungsrollen zu wechseln.
Implementierung
Die neue USB HAL-Schnittstelle muss auf jedem Gerät implementiert werden, das mit Android 8.0 auf den Markt kommt.
Die Standardimplementierung sollte für Geräte mit einer älteren Android-Version als 8.0 sorgen. Die Standardimplementierung ist ausreichend, wenn das Gerät die dual_role_usb
-Klasse verwendet, um den Status des Typ-C-Ports zu melden. In gerätespezifischen USB-Scripts sind möglicherweise geringfügige Änderungen erforderlich, um die Inhaberschaft der Typ-C-Knoten an das System zu übertragen.