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 Releases wurden diese gerätespezifischen Konfigurationen mithilfe von gerätespezifischen init-Skripts (mithilfe von Property-Triggern) umgesetzt. Der Wechsel zu einem HAL-Design (Hardware Abstraktionsschicht) führt zu einer wesentlich saubereren Implementierung, die folgende 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, obwohl sie stillschweigend fehlgeschlagen sind.
  2. Bei init-Scripts kann nur eine begrenzte Anzahl von Vorgängen ausgeführt werden.

Die Version von Android 12 bietet USB-Gadget-HAL-Unterstützung für Network Control Models (NCM) und API-Aufrufe, die sowohl die HAL-Versionsnummer als auch die USB-Geschwindigkeit zurückgeben. Weitere Informationen zu den API-Aufrufen, die über den USB-HAL verfügbar sind, finden Sie in der Paketzusammenfassung android.hardware.usb.

HAL und Treble

Die gerätespezifischen init-Skripts wurden als Ersatz für HAL-Layers 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 entfällt die Notwendigkeit, einen exklusiven USB-Daemon zu haben, da die HAL-Schicht gleichzeitig 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 vor Android 8.0 geeignet sein. 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.