Eine HAL definiert eine Standardschnittstelle, die von Hardwareanbietern implementiert werden kann. Dadurch ist Android unabhängig von Treiberimplementierungen auf niedrigerer Ebene. Mit einer HAL können Sie Funktionen implementieren, ohne das System der höheren Ebene zu beeinflussen oder zu ändern. Auf dieser Seite wird die ältere Architektur beschrieben, die seit Android 8.0 nicht mehr unterstützt wird. Informationen zu Android 8.0 und höher finden Sie in der HAL-Übersicht.

Abbildung 1: HAL-Komponenten
Sie müssen die entsprechende HAL (und den entsprechenden Treiber) für die jeweilige Hardware implementieren, die Ihr Produkt bietet. HAL-Implementierungen sind in der Regel in Modulen für freigegebene Bibliotheken (.so
-Dateien) eingebunden. Da Android jedoch keine standardmäßige Interaktion zwischen einer HAL-Implementierung und Gerätetreibern vorschreibt, können Sie das tun, was für Ihre Situation am besten geeignet ist. Damit das Android-System jedoch richtig mit Ihrer Hardware interagieren kann, müssen Sie den in jeder hardwarespezifischen HAL-Schnittstelle definierten Vertrag einhalten.
Um sicherzustellen, dass HALs eine vorhersehbare Struktur haben, hat jede hardwarespezifische HAL-Schnittstelle Eigenschaften, die in hardware/libhardware/include/hardware/hardware.h
definiert sind. Über diese Schnittstelle kann das Android-System die richtigen Versionen Ihrer HAL-Module auf konsistente Weise laden. Eine HAL-Schnittstelle besteht aus zwei Komponenten: Modulen und Geräten.
HAL-Module
Ein Modul stellt Ihre verpackte HAL-Implementierung dar, die als freigegebene Bibliothek (.so file
) gespeichert wird. Die hardware/libhardware/include/hardware/hardware.h
-Headerdatei definiert ein hw_module_t
-Objekt, das ein Modul darstellt und Metadaten wie Version, Name und Autor des Moduls enthält. Android verwendet diese Metadaten, um das HAL-Modul korrekt zu finden und zu laden.
Außerdem enthält das hw_module_t
-Objekt einen Verweis auf ein anderes Objekt, hw_module_methods_t
, das einen Verweis auf eine offene Funktion für das Modul enthält. Mit dieser Open-Funktion wird die Kommunikation mit der Hardware gestartet, für die die HAL als Abstraktion dient.
Jede hardwarespezifische HAL erweitert in der Regel die generische hw_module_t
-Struktur um zusätzliche Informationen für die jeweilige Hardware. In der Kamera-HAL enthält das camera_module_t
-Objekt beispielsweise ein hw_module_t
-Objekt sowie andere kameraspezifische Funktionszeigers:
typedef struct camera_module { hw_module_t common; int (*get_number_of_cameras)(void); int (*get_camera_info)(int camera_id, struct camera_info *info); } camera_module_t;
Wenn Sie eine HAL implementieren und die Modulstruktur erstellen, müssen Sie sie HAL_MODULE_INFO_SYM
nennen. Beispiel aus der Audio-HAL von Nexus 9:
struct audio_module HAL_MODULE_INFO_SYM = { .common = { .tag = HARDWARE_MODULE_TAG, .module_api_version = AUDIO_MODULE_API_VERSION_0_1, .hal_api_version = HARDWARE_HAL_API_VERSION, .id = AUDIO_HARDWARE_MODULE_ID, .name = "NVIDIA Tegra Audio HAL", .author = "The Android Open Source Project", .methods = &hal_module_methods, }, };
HAL-Geräte
Ein Gerät abstrahiert die Hardware Ihres Produkts. Ein Audiomodul kann beispielsweise ein primäres Audiogerät, ein USB-Audiogerät oder ein Bluetooth-A2DP-Audiogerät enthalten.
Ein Gerät wird durch die Struktur hw_device_t
dargestellt. Ähnlich wie bei einem Modul definiert jeder Gerätetyp eine detaillierte Version des generischen hw_device_t
, die Funktionszeigers für bestimmte Funktionen der Hardware enthält. Der Strukturtyp audio_hw_device_t
enthält beispielsweise Funktionszeigers auf Audiogerätevorgänge:
struct audio_hw_device { struct hw_device_t common; /** * used by audio flinger to enumerate what devices are supported by * each audio_hw_device implementation. * * Return value is a bitmask of 1 or more values of audio_devices_t */ uint32_t (*get_supported_devices)(const struct audio_hw_device *dev); ... }; typedef struct audio_hw_device audio_hw_device_t;
Zusätzlich zu diesen Standardeigenschaften kann jede hardwarespezifische HAL-Schnittstelle weitere eigene Funktionen und Anforderungen definieren. Weitere Informationen finden Sie in der HAL-Referenzdokumentation sowie in den einzelnen Anleitungen für jede HAL.
HAL-Module erstellen
HAL-Implementierungen sind in Moduldateien (.so
) eingebunden und werden von Android bei Bedarf dynamisch verknüpft. Sie können Ihre Module erstellen, indem Sie für jede HAL-Implementierung eine Android.mk
-Datei erstellen und auf Ihre Quelldateien verweisen. Im Allgemeinen müssen Ihre freigegebenen Bibliotheken in einem bestimmten Format benannt werden, damit sie gefunden und richtig geladen werden können. Das Benennungsschema variiert leicht von Modul zu Modul, folgt aber dem allgemeinen Muster: <module_type>.<device_name>
.