Eine HAL definiert eine Standardschnittstelle, die Hardwareanbieter implementieren müssen, wodurch Android unabhängig von Treiberimplementierungen auf niedrigerer Ebene sein kann. Durch die Verwendung einer HAL können Sie Funktionen implementieren, ohne das übergeordnete System zu beeinflussen oder zu modifizieren. Diese Seite beschreibt die ältere Architektur, die ab 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 spezifische Hardware implementieren, die Ihr Produkt bereitstellt. HAL-Implementierungen sind normalerweise in gemeinsam genutzte Bibliotheksmodule ( .so
Dateien) integriert, aber da Android keine Standardinteraktion zwischen einer HAL-Implementierung und Gerätetreibern vorschreibt, können Sie das tun, was für Ihre Situation am besten ist. Damit das Android-System jedoch korrekt mit Ihrer Hardware interagieren kann, müssen Sie sich an den Vertrag halten, der in jeder hardwarespezifischen HAL-Schnittstelle definiert ist.
Um sicherzustellen, dass HALs eine vorhersagbare Struktur haben, hat jede hardwarespezifische HAL-Schnittstelle Eigenschaften, die in hardware/libhardware/include/hardware/hardware.h
definiert sind. Diese Schnittstelle ermöglicht es dem Android-System, korrekte Versionen Ihrer HAL-Module auf konsistente Weise zu laden. Eine HAL-Schnittstelle besteht aus zwei Komponenten: Modulen und Geräten.
HAL-Module
Ein Modul stellt Ihre gepackte HAL-Implementierung dar, die als gemeinsam genutzte Bibliothek ( .so file
) gespeichert ist. Die Headerdatei hardware/libhardware/include/hardware/hardware.h
definiert eine Struktur ( hw_module_t
), die 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 die Struktur hw_module_t
einen Zeiger auf eine andere Struktur, hw_module_methods_t
, die einen Zeiger auf eine offene Funktion für das Modul enthält. Diese offene Funktion wird verwendet, um eine Kommunikation mit der Hardware zu initiieren, für die die HAL als Abstraktion dient. Jede hardwarespezifische HAL erweitert normalerweise die generische hw_module_t
Struktur mit zusätzlichen Informationen für dieses spezifische Hardwarestück. Beispielsweise enthält in der Kamera-HAL die Struktur camera_module_t
eine Struktur hw_module_t
zusammen mit anderen kameraspezifischen Funktionszeigern:
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 des 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. Beispielsweise kann ein Audiomodul 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
, das Funktionszeiger für bestimmte Merkmale der Hardware enthält. Beispielsweise enthält der Strukturtyp audio_hw_device_t
Funktionszeiger auf Audiogeräteoperationen:
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 Merkmale und Anforderungen definieren. Einzelheiten finden Sie in der HAL-Referenzdokumentation sowie in den einzelnen Anweisungen für jede HAL.
Aufbau von HAL-Modulen
HAL-Implementierungen sind in Moduldateien ( .so
) integriert und werden gegebenenfalls von Android dynamisch verknüpft. Sie können Ihre Module erstellen, indem Sie Android.mk
Dateien für jede Ihrer HAL-Implementierungen erstellen und auf Ihre Quelldateien verweisen. Im Allgemeinen müssen Ihre gemeinsam genutzten Bibliotheken in einem bestimmten Format benannt werden, damit sie ordnungsgemäß gefunden und geladen werden können. Das Benennungsschema variiert leicht von Modul zu Modul, folgt aber dem allgemeinen Muster von: <module_type>.<device_name>
.