Un HAL definisce un'interfaccia standard da implementare per i fornitori di hardware, che consente ad Android di essere agnostico sulle implementazioni dei driver di livello inferiore. L'utilizzo di un HAL ti consente di implementare funzionalità senza influire o modificare il sistema di livello superiore. Questa pagina descrive l'architettura precedente, che non è più supportata a partire da Android 8.0. Per Android 8.0 e versioni successive, consulta la Panoramica dell'HAL.

Figura 1. Componenti HAL
Devi implementare l'HAL (e il driver) corrispondente per l'hardware specifico fornito dal tuo prodotto. Le implementazioni HAL sono in genere integrate nei moduli delle librerie condivise (file .so
), ma poiché Android non impone un'interazione standard tra un'implementazione HAL e i driver del dispositivo, puoi scegliere la soluzione migliore per la tua situazione. Tuttavia, per consentire al sistema Android di interagire correttamente con l'hardware, devi rispettare il contratto definito in ogni interfaccia HAL specifica per l'hardware.
Per garantire che gli HAL abbiano una struttura prevedibile, ogni interfaccia HAL specifica per l'hardware ha proprietà definite in hardware/libhardware/include/hardware/hardware.h
. Questa interfaccia consente al sistema Android di caricare le versioni corrette dei moduli HAL in modo coerente. Un'interfaccia HAL è costituita da due componenti: moduli e dispositivi.
Moduli HAL
Un modulo rappresenta l'implementazione HAL pacchettizzata, che viene archiviata come libreria condivisa (.so file
). Il file di intestazione hardware/libhardware/include/hardware/hardware.h
definisce una struct (hw_module_t
) che rappresenta un modulo e contiene metadati come la versione, il nome e l'autore del modulo. Android
utilizza questi metadati per trovare e caricare correttamente il modulo HAL.
Inoltre, la struttura hw_module_t
contiene un puntatore a un'altra struttura, hw_module_methods_t
, che contiene un puntatore a una funzione aperta per il modulo. Questa funzione open viene utilizzata per avviare la comunicazione con l'hardware per cui l'HAL funge da astrazione.
Ogni HAL specifico per l'hardware in genere estende la struttura generica hw_module_t
con informazioni aggiuntive per l'hardware specifico. Ad esempio, nell'HAL della fotocamera, la struttura camera_module_t
contiene una struttura hw_module_t
insieme ad altri puntatori di funzione specifici della fotocamera:
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;
Quando implementi un HAL e crei la struttura del modulo, devi assegnargli il nome
HAL_MODULE_INFO_SYM
. Esempio dall'HAL audio di 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, }, };
Dispositivi HAL
Un dispositivo esegue l'astrazione dell'hardware del prodotto. Ad esempio, un modulo audio può contenere un dispositivo audio principale, un dispositivo audio USB o un dispositivo audio Bluetooth A2DP.
Un dispositivo è rappresentato dalla struttura hw_device_t
. Analogamente a un modulo, ogni tipo di dispositivo definisce una versione dettagliata del hw_device_t
generico che contiene puntatori di funzione per funzionalità specifiche dell'hardware. Ad esempio, il tipo di struct audio_hw_device_t
contiene puntatori di funzione alle operazioni del dispositivo audio:
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;
Oltre a queste proprietà standard, ogni interfaccia HAL specifica per l'hardware può definire altre funzionalità e requisiti. Per maggiori dettagli, consulta la documentazione di riferimento dell'HAL e le istruzioni specifiche per ogni HAL.
Crea moduli HAL
Le implementazioni HAL sono integrate nei file dei moduli (.so
) e vengono collegate dinamicamente da Android, se opportuno. Puoi creare i moduli
creando file Android.mk
per ogni implementazione HAL
e indicando i file di origine. In generale, le librerie condivise devono essere rinominate in un formato specifico per poter essere trovate e caricate correttamente. Lo schema di denominazione varia leggermente da un modulo all'altro, ma segue lo schema generale di: <module_type>.<device_name>
.