Un HAL definisce un'interfaccia standard che i fornitori di hardware devono implementare, il che consente ad Android di essere indipendente dalle implementazioni di driver di livello inferiore. L'utilizzo di un HAL consente di implementare le funzionalità senza influire o modificare al sistema di livello superiore. In questa pagina viene descritta l'architettura precedente, che non è più supportato a partire da Android 8.0. Per Android 8.0 e versioni successive, consulta le Panoramica dell'HAL.
Devi implementare l'HAL (e il driver) corrispondente per l'ambiente
l'hardware fornito dal tuo prodotto. Le implementazioni HAL sono in genere integrate
Moduli della libreria condivisa (.so
file), ma dato che Android non richiede
un'interazione standard tra un'implementazione HAL e i driver di dispositivo, puoi
fai ciò che è meglio per la tua situazione. Tuttavia, per consentire al sistema Android
interagire correttamente con il tuo hardware, devi rispettare i
contratto definito in ciascuna interfaccia HAL specifica per l'hardware.
Per garantire che gli HAL abbiano una struttura prevedibile, ogni specifica
L'interfaccia HAL 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 un
dei nostri principi. Un'interfaccia dell'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
). La
File di intestazione hardware/libhardware/include/hardware/hardware.h
definisce uno 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, lo struct hw_module_t
contiene un puntatore a
un altro struct, hw_module_methods_t
, che contiene un puntatore a
una funzione aperta per il modulo. Questa funzione aperta viene utilizzata per avviare
comunicazione con l'hardware per cui l'HAL funge da astrazione.
In genere, ogni HAL specifico per l'hardware estende il valore generico hw_module_t
struct con informazioni aggiuntive per quell'hardware specifico. Per
Ad esempio, nella fotocamera HAL, lo struct camera_module_t
contiene un oggetto
struct hw_module_t
insieme ad altre funzioni specifiche della fotocamera
cursori:
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 lo struct del modulo, devi denominarlo
HAL_MODULE_INFO_SYM
. Esempio dall'HAL audio per 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 astrae l'hardware del tuo prodotto. Ad esempio, un file audio può contenere un dispositivo audio principale, un dispositivo audio USB o un Dispositivo audio A2DP.
Un dispositivo è rappresentato dallo struct hw_device_t
. Simile a
modulo, ogni tipo di dispositivo definisce una versione dettagliata
hw_device_t
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 HAL specifico per l'hardware a riga di comando può definire più funzionalità e requisiti. Per maggiori dettagli, consulta la documentazione di riferimento dell'HAL, nonché le singole istruzioni per ogni HAL.
Creare moduli HAL
Le implementazioni HAL sono integrate nei file dei moduli (.so
) e vengono
collegati in modo dinamico da Android quando opportuno. Puoi creare i moduli
creando Android.mk
file per ciascuna delle tue implementazioni HAL
e puntare ai file di origine. In generale, le librerie condivise devono essere
denominati in un formato specifico, in modo che possano essere trovati e caricati correttamente. La denominazione
schema varia leggermente da modulo a modulo, ma segue lo schema generale
di: <module_type>.<device_name>
.