HAL precedenti

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.

Componenti dell'HAL

Figura 1. Componenti 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>.

HAL precedente

Il termine HAL legacy si riferisce in generale a tutti gli HAL precedenti ad Android 8.0 (ritirati in Android 8). La la maggior parte delle interfacce di sistema Android (fotocamera, audio, sensori e così via) sono definite in "hardware/libhardware/include/hardware" e presentano un controllo delle versioni approssimativo e un'ABI pressoché stabile. R alcuni sottosistemi (tra cui Wi-Fi, Radio Interface Layer e Bluetooth) hanno altri in "libhardware_legacy" o sparpagliate nel codebase. Gli HAL precedenti non sono mai fornivano rigide garanzie di stabilità.