Konvertieren von HAL-Modulen

Sie können bereits vorhandene HAL-Module in HIDL-HAL-Module aktualisieren, indem Sie den Header in hardware/libhardware/include/hardware konvertieren.

Mit c2hal

Das c2hal Tool übernimmt den Großteil der Konvertierungsarbeit und reduziert so die Anzahl der erforderlichen manuellen Änderungen. So generieren Sie beispielsweise eine HIDL .hal Datei für die NFC-HAL:

make c2hal
c2hal -r android.hardware:hardware/interfaces -randroid.hidl:system/libhidl/transport -p android.hardware.nfc@1.0 hardware/libhardware/include/hardware/nfc.h

Diese Befehle fügen Dateien in hardware/interfaces/nfc/1.0/ hinzu. Wenn Sie hardware/interfaces/update-makefiles.sh aus dem Verzeichnis $ANDROID_BUILD_TOP ausführen, wird auch das erforderliche Makefile zur HAL hinzugefügt. Von hier aus können Sie manuelle Änderungen vornehmen, um die HAL vollständig zu konvertieren.

c2hal-Aktivitäten

Wenn Sie c2hal ausführen, wird alles in der Header-Datei in .hal Dateien übertragen.

c2hal identifiziert Strukturen, die Funktionszeiger in der bereitgestellten Header-Datei enthalten, und konvertiert jede Struktur in eine separate Schnittstellendatei. Beispielsweise wird alloc_device_t in das IAllocDevice HAL-Modul konvertiert (in der Datei IAllocDevice.hal ).

Alle anderen Datentypen werden in eine Datei types.hal kopiert. Pfund-Definitionen werden in Aufzählungen verschoben und Elemente, die nicht Teil von HIDL sind oder nicht konvertierbar sind (z. B. Deklarationen statischer Funktionen), werden in Kommentare kopiert, die mit dem Text „ NOTE “ gekennzeichnet sind.

Manuelle Tätigkeiten

Das c2hal Tool weiß nicht, was es tun soll, wenn es auf bestimmte Konstrukte stößt. HIDL hat beispielsweise kein Konzept für Rohzeiger; Aus diesem Grund weiß c2hal , wenn es in Header-Dateien auf einen Zeiger trifft, nicht, ob der Zeiger als Array oder als Referenz auf ein anderes Objekt interpretiert werden soll. Void-Zeiger sind ebenfalls ähnlich undurchsichtig.

Felder wie int reserved[7] müssen beim Übergang zu HIDL manuell entfernt werden. Elemente wie der Name des Rückgabewerts sollten in einen aussagekräftigeren Namen geändert werden. Beispielsweise wird der Rückgabeparameter von Methoden wie write in NFC vom automatisch generierten int32_t write_ret in den Status status konvertiert (wobei Status eine neue Aufzählung ist, die mögliche NFC-Status enthält).

Implementierung des HAL

Nachdem Sie .hal Dateien zur Darstellung Ihres HAL erstellt haben, müssen Sie die Makefiles (Make oder Soong) generieren, die die Sprachunterstützung in C++ und Java erstellen (es sei denn, der HAL verwendet eine Funktion, die in Java nicht unterstützt wird). Das Skript ./hardware/interfaces/update-makefiles.sh kann automatisch Makefiles für HALs generieren, die sich im Verzeichnis hardware/interfaces befinden (für HALs an anderen Speicherorten aktualisieren Sie einfach das Skript).

Wenn die Makefiles auf dem neuesten Stand sind, können Sie Header-Dateien generieren und Methoden implementieren. Einzelheiten zur Implementierung der generierten Schnittstelle finden Sie unter HIDL C++ (für C++-Implementierungen) oder HIDL Java (für Java-Implementierungen).