Google si impegna a promuovere l'equità razziale per le comunità nere. Vedi come.
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'uso 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 HAL sono in genere integrate in moduli di librerie condivise (file .so ), ma poiché Android non impone un'interazione standard tra un'implementazione HAL e driver di dispositivo, puoi fare ciò che è meglio per la tua situazione. Tuttavia, per consentire al sistema Android di interagire correttamente con l'hardware, è necessario rispettare il contratto definito in ciascuna interfaccia HAL specifica dell'hardware.

Per garantire che gli HAL abbiano una struttura prevedibile, ogni interfaccia HAL specifica dell'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 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, 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 hw_module_t generica con informazioni aggiuntive per quel componente hardware specifico. Ad esempio, nella videocamera HAL, 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 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 estrae l'hardware del tuo prodotto. Ad esempio, un modulo audio può contenere un dispositivo audio primario, 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 i puntatori di funzione per funzionalità specifiche dell'hardware. Ad esempio, il tipo di struttura audio_hw_device_t contiene i 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, ciascuna interfaccia HAL specifica dell'hardware può definire più delle proprie caratteristiche e requisiti. Per i dettagli, consultare la documentazione di riferimento HAL e le singole istruzioni per ciascun HAL.

Creazione di moduli HAL

Le implementazioni HAL sono integrate in file di moduli ( .so ) e sono collegate dinamicamente da Android quando appropriato. Puoi creare i tuoi moduli creando file Android.mk per ciascuna delle tue implementazioni HAL e indicando i 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 il modello generale di: <module_type>.<device_name> .