HAL legacy

Un HAL definisce un'interfaccia standard per i fornitori di hardware da implementare, che consente ad Android di essere indipendente dalle implementazioni dei 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 a partire da Android 8.0. Per Android 8.0 e versioni successive, vedere Tipi 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 condivisi (file .so ), ma poiché Android non richiede 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 è costituita da due componenti: moduli e dispositivi.

Moduli HAL

Un modulo rappresenta la tua 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 di solito estende la struttura hw_module_t generica con informazioni aggiuntive per quel particolare componente hardware. Ad esempio, nell'HAL della videocamera, la struttura camera_module_t contiene una struttura hw_module_t insieme ad altri puntatori di funzione specifici della videocamera:

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 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 di funzione per caratteristiche specifiche dell'hardware. Ad esempio, il tipo 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 interfaccia HAL specifica per l'hardware può definire più caratteristiche e requisiti propri. Per i dettagli, vedere la documentazione di riferimento HAL e le singole istruzioni per ciascun HAL.

Costruire moduli HAL

Le implementazioni 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 tue 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> .

HAL precedente

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