Ein HAL definiert eine Standardschnittstelle, die Hardwarehersteller implementieren können, Dadurch ist Android unabhängig von untergeordneten Treiberimplementierungen. Mit einem HAL können Sie Funktionen implementieren, ohne dies zu beeinflussen oder zu verändern. übergeordnetes System. Auf dieser Seite wird die ältere Architektur beschrieben, die keine ab Android 8.0 nicht mehr unterstützt. Wenn Sie Android 8.0 und höher verwenden, lesen Sie bitte die HAL-Übersicht
Sie müssen den entsprechenden HAL (und den Treiber) für die spezifische
Hardware Ihres Produkts. HAL-Implementierungen sind in der Regel in
der gemeinsam genutzten Bibliothek (.so
Dateien), aber da Android
Standardinteraktion zwischen einer HAL-Implementierung und Gerätetreibern
das Beste für Ihre Situation zu tun. Damit das Android-System jedoch
mit Ihrer Hardware ordnungsgemäß interagieren können, müssen Sie die
in jeder hardwarespezifischen HAL-Schnittstelle definiert wird.
Um sicherzustellen, dass HALs eine vorhersehbare Struktur haben, ist jedes hardwarespezifische
Für die HAL-Schnittstelle sind Eigenschaften definiert in
hardware/libhardware/include/hardware/hardware.h
Diese Schnittstelle
kann das Android-System die richtigen Versionen Ihrer HAL-Module
auf einheitliche Weise. Eine HAL-Schnittstelle besteht aus zwei Komponenten: Module und Geräte.
HAL-Module
Ein Modul stellt Ihre gepackte HAL-Implementierung dar, die als
gemeinsam genutzte Bibliothek (.so file
). Die
hardware/libhardware/include/hardware/hardware.h
-Headerdatei
definiert eine Struktur (hw_module_t
), die ein Modul darstellt
enthält Metadaten wie die Version, den Namen und den Autor des Moduls. Android-Geräte
verwendet diese Metadaten, um das HAL-Modul korrekt zu finden und zu laden.
Darüber hinaus enthält die Struktur hw_module_t
einen Zeiger auf
eine weitere Struktur, hw_module_methods_t
, die einen Zeiger auf
eine offene Funktion für das Modul. Diese Funktion wird verwendet, um
Kommunikation mit der Hardware, für die der HAL als Abstraktion dient.
Jede hardwarespezifische HAL erweitert in der Regel den generischen hw_module_t
.
mit zusätzlichen Informationen
für diese spezielle Hardware erstellen. Für
Beispiel: In der Kamera-HAL enthält die camera_module_t
-Struktur einen
hw_module_t
-Struktur zusammen mit anderen kameraspezifischen Funktionen
Hinweise:
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 einen HAL implementieren und die Modulstruktur erstellen, müssen Sie ihr einen Namen geben
HAL_MODULE_INFO_SYM
Beispiel vom Nexus 9-Audio-HAL:
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. Beispiel: Eine Audiodatei kann ein primäres Audiogerät, ein USB-Audiogerät oder ein Bluetooth- A2DP-Audiogerät.
Ein Gerät wird durch die Struktur hw_device_t
dargestellt. Ähnlich wie ein
enthält, definiert jeder Gerätetyp eine detaillierte Version des generischen
hw_device_t
, die Funktionszeiger für bestimmte Funktionen enthält
der Hardware. Ein Beispiel: Der Strukturtyp audio_hw_device_t
enthält Funktionszeiger für 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 jeder hardwarespezifische HAL eigene Funktionen und Anforderungen definieren kann. Weitere Informationen finden Sie in der HAL-Referenzdokumentation sowie in der Anleitung für jeden HAL.
HAL-Module erstellen
HAL-Implementierungen sind in Moduldateien (.so
) integriert und werden
gegebenenfalls dynamisch von Android verknüpft. Sie können Ihre Module erstellen, indem Sie
Erstellen von Android.mk
-Dateien für jede Ihrer HAL-Implementierungen
und auf Ihre Quelldateien verweisen. Im Allgemeinen müssen Ihre gemeinsam genutzten Bibliotheken
in einem bestimmten Format benannt sind,
damit sie gefunden und richtig geladen werden können. Die Benennung
-Schema variiert geringfügig von Modul zu Modul, folgt jedoch dem allgemeinen Muster
von: <module_type>.<device_name>
.