Die Android 8.0-Version verlagert die Handhabung von USB-Befehlen aus init
Skripten in einen nativen USB-Daemon, um eine bessere Konfiguration und Codezuverlässigkeit zu gewährleisten. Für die Konfiguration der Gadget-Funktion werden init
Skripte (Eigenschaftsauslöser) verwendet, um gerätespezifische Gadget-Vorgänge auszuführen.
In früheren Versionen wurden diese gerätespezifischen Konfigurationen durch gerätespezifische init
Skripts (unter Verwendung von Eigenschaftsauslösern) 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 Framework-Code zurückgegeben werden, der den Eigenschaftsauslöser festlegt. Daher gehen Frameworks fälschlicherweise davon aus, dass die Vorgänge erfolgreich waren, obwohl sie stillschweigend fehlgeschlagen sind.
-
init
Skripte verfügen über 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 API-Aufrufen, die über die USB-HAL verfügbar sind, finden Sie in der Paketzusammenfassung android.hardware.usb
.
HAL und Höhen
Die gerätespezifischen init
-Skripte wurden als Ersatz für HAL-Schichten verwendet, um gerätespezifische USB-Vorgänge auszuführen. USB (über ADB) ist eine primäre Schnittstelle zum Debuggen von Systemproblemen. Wenn ein nativer Daemon zur Durchführung der USB-Konfiguration vorhanden ist, entfällt die Abhängigkeit vom Framework-Code, sodass USB auch 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 gleichzeitig als USB-Daemon fungiert.
Die Standard-HAL-Implementierung kümmert sich um alle Geräte vor Android 8.0. Daher würde es für die Geräte vor Android 8.0 keine gerätespezifischen Arbeiten geben. Android 8.0 nutzt die HAL-Schnittstelle, um den Status von USB-Anschlüssen abzufragen und Daten- und Leistungsrollenwechsel durchzuführen.
Implementierung
Auf jedem Gerät, das mit Android 8.0 startet, muss eine neue USB-HAL-Schnittstelle implementiert werden. Die Standardimplementierung sollte für Geräte vor Android 8.0 geeignet sein. Die Standardimplementierung ist ausreichend, wenn das Gerät die Klasse dual_role_usb
verwendet, um den Typ-C-Portstatus 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.