HAL legacy

Un HAL definisce un'interfaccia standard da implementare per i fornitori di hardware, che consente ad Android di essere indipendente riguardo alle implementazioni dei driver di livello inferiore. L'utilizzo di un HAL consente di implementare funzionalità senza influenzare 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 HAL .

Componenti 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 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 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 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 in genere estende la struttura generica hw_module_t con informazioni aggiuntive per quello specifico componente hardware. Ad esempio, nell'HAL della fotocamera, la struttura camera_module_t contiene una struttura hw_module_t insieme ad altri puntatori a funzioni specifiche 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 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 primario, un dispositivo audio USB o un dispositivo audio Bluetooth A2DP.

Un dispositivo è rappresentato dalla struttura hw_device_t . Similmente 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 funzioni 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, ciascuna interfaccia HAL specifica dell'hardware può definire ulteriori funzionalità e requisiti propri. Per i dettagli, consultare la documentazione di riferimento dell'HAL nonché le singole istruzioni per ciascun HAL.

Costruisci moduli HAL

Le implementazioni HAL sono integrate nei file dei 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 puntando ai file di origine. In generale, le librerie condivise devono avere un nome 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> .

HAL precedente

Il termine Legacy HAL si riferisce in generale a tutti gli HAL precedenti ad Android 8.0 (deprecati in Android 8). La maggior parte delle interfacce del sistema Android (fotocamera, audio, sensori, ecc.) sono definite in "hardware/libhardware/include/hardware" e hanno un controllo delle versioni approssimativo e un ABI più o meno stabile. Alcuni sottosistemi (inclusi Wi-Fi, Radio Interface Layer e Bluetooth) hanno altre interfacce non standardizzate in `libhardware_legacy` o intervallate nel codice base. Gli HAL legacy non hanno mai fornito garanzie di stabilità rigide.