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).