Mit Android 8.0 wird die Verarbeitung von USB-Befehlen aus init
-Skripts in einen nativen USB-Daemon verschoben, um die Konfiguration und Codezuverlässigkeit zu verbessern. Für die Konfiguration der Gadget-Funktion werden init
-Skripts (Property-Trigger) verwendet, um gerätespezifische Gadget-Vorgänge auszuführen.
In früheren Versionen wurden diese gerätespezifischen Konfigurationen durch gerätespezifische init
-Scripts (mit Attributtriggern) 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 Kernel-Sysfs-Knoten können fehlschlagen, werden aber nicht an den Framework-Code zurückgegeben, der den Eigenschaftstrigger festlegt. Daher gehen die Frameworks fälschlicherweise davon aus, dass die Vorgänge erfolgreich waren, obwohl sie im Hintergrund fehlgeschlagen sind.
- Für
init
-Skripts gilt eine Beschränkung für die Anzahl der Vorgänge, die ausgeführt werden können.
Mit Android 12 wird die Unterstützung von USB Gadget HAL für Network Control Models (NCM) 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 Paketzusammenfassung für android.hardware.usb
.
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 zum Beheben von Systemproblemen. Durch einen nativen Daemon für die USB-Konfiguration wird die Abhängigkeit vom Framework-Code beseitigt. Selbst wenn das Framework abstürzt, sollte USB weiterhin ausgeführt werden.
Im 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 entfällt die Notwendigkeit eines exklusiven USB-Daemons, da die HAL-Ebene auch als USB-Daemon fungiert.
Die Standard-HAL-Implementierung kümmert sich um alle Geräte mit einer älteren Android-Version als Android 8.0. Daher sind keine gerätespezifischen Arbeiten für Geräte vor Android 8.0 erforderlich. Unter Android 8.0 wird die HAL-Schnittstelle verwendet, um den Status von USB-Anschlüssen abzufragen und Daten- und Stromversorgungsrollen zu tauschen.
Implementierung
Auf jedem Gerät, das mit Android 8.0 auf den Markt kommt, muss eine neue USB HAL-Schnittstelle implementiert werden.
Die Standardimplementierung sollte Geräte mit einer älteren Android-Version als Android 8.0 berücksichtigen. Die Standardimplementierung reicht aus, wenn das Gerät die Klasse dual_role_usb
verwendet, um den Status des Typ-C-Anschlusses zu melden. Möglicherweise sind geringfügige Änderungen an gerätespezifischen USB-Scripts erforderlich, um die Eigentümerschaft der Typ-C-Knoten an das System zu übertragen.