USB HAL implementieren

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:

  1. 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.
  2. 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.