Google is committed to advancing racial equity for Black communities. See how.
Questa pagina è stata tradotta dall'API Cloud Translation.
Switch to English

HAL legacy

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

Figura 1. Componenti HAL

È necessario implementare l'HAL (e il driver) corrispondente per l'hardware specifico fornito dal prodotto. Le implementazioni di HAL sono in genere integrate in moduli di libreria condivisa (file .so ), ma poiché Android non impone un'interazione standard tra un'implementazione HAL e i driver di dispositivo, puoi fare ciò che è meglio per la tua situazione. Tuttavia, per consentire al sistema Android di interagire correttamente con il tuo hardware, devi rispettare il contratto definito in ciascuna 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 è composta da due componenti: moduli e dispositivi.

Moduli HAL

Un modulo rappresenta l'implementazione HAL in pacchetto, che viene archiviata come libreria condivisa ( .so file ). Il file header hardware/libhardware/include/hardware/hardware.h definisce una struttura ( 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 aperta viene utilizzata per avviare la comunicazione con l'hardware per il quale l'HAL funge da astrazione. Ogni HAL specifico dell'hardware di solito estende la struttura generica hw_module_t con informazioni aggiuntive per quella specifica parte di hardware. Ad esempio, camera_module_t della fotocamera, la struttura camera_module_t contiene una struttura hw_module_t insieme ad altri puntatori a funzioni 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 si implementa un HAL e si crea la struttura del modulo, è necessario denominarlo HAL_MODULE_INFO_SYM . Esempio dall'HAL audio del 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 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 . Simile a un modulo, ogni tipo di dispositivo definisce una versione dettagliata del generico hw_device_t che contiene puntatori a funzioni per caratteristiche specifiche dell'hardware. Ad esempio, il tipo di struttura audio_hw_device_t contiene puntatori a funzione per le 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 più caratteristiche e requisiti propri. Per i dettagli, vedere la documentazione di riferimento di HAL e le istruzioni individuali per ogni HAL.

Creazione di moduli HAL

Le implementazioni di HAL sono incorporate nei file dei moduli ( .so ) e sono collegate dinamicamente da Android quando appropriato. Puoi costruire i tuoi moduli creando file Android.mk per ciascuna delle tue implementazioni HAL e puntando ai tuoi file sorgente. In generale, le librerie condivise devono essere denominate in un formato specifico in modo che possano essere trovate e caricate correttamente. Lo schema di denominazione varia leggermente da modulo a modulo, ma segue lo schema generale di: <module_type>.<device_name> .