Anciennes HAL

Un HAL définit une interface standard que les fournisseurs de matériel doivent implémenter, ce qui permet à Android d'être indépendant des implémentations de pilotes de niveau inférieur. L'utilisation d'une HAL vous permet d'implémenter des fonctionnalités sans affecter ni modifier le système de niveau supérieur. Cette page décrit l'ancienne architecture, qui n'est pas n'est plus pris en charge à partir d'Android 8.0. Pour Android 8.0 ou version ultérieure, veuillez consulter les Présentation de HAL

Composants HAL

Figure 1 : Composants HAL

Vous devez implémenter le HAL (et le pilote) correspondant pour le du matériel fourni par votre produit. Les implémentations HAL sont généralement intégrées modules de bibliothèque partagée (fichiers .so), mais comme Android ne l'exige pas une interaction standard entre une implémentation HAL et des pilotes d'appareil, vous pouvez de faire ce qui convient le mieux à votre situation. Toutefois, pour permettre au système Android de interagir correctement avec votre matériel, vous devez respecter les défini dans chaque interface HAL spécifique au matériel.

Pour garantir que les HAL ont une structure prévisible, Les propriétés de l'interface HAL sont définies hardware/libhardware/include/hardware/hardware.h Cette interface permet au système Android de charger les versions correctes de vos modules HAL dans un de manière cohérente. Une interface HAL se compose de deux composants: des modules et des appareils.

Modules HAL

Un module représente votre implémentation HAL empaquetée, qui est stockée sous forme bibliothèque partagée (.so file). La Fichier d'en-tête hardware/libhardware/include/hardware/hardware.h définit un struct (hw_module_t) qui représente un module et contient des métadonnées telles que la version, le nom et l'auteur du module. Android utilise ces métadonnées pour trouver et charger correctement le module HAL.

De plus, la structure hw_module_t contient un pointeur vers un autre struct, hw_module_methods_t, qui contient un pointeur vers une fonction ouverte pour le module. Cette fonction ouverte sert à lancer la communication avec le matériel pour lequel le HAL sert d'abstraction. Chaque HAL spécifique au matériel étend généralement le hw_module_t générique avec des informations supplémentaires concernant ce matériel spécifique. Pour Par exemple, dans le HAL de la caméra, la structure camera_module_t contient Structure hw_module_t avec d'autres fonctions spécifiques à l'appareil photo pointeurs:

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;

Lorsque vous implémentez une HAL et créez le struct du module, vous devez le nommer HAL_MODULE_INFO_SYM Exemple issu du HAL audio de la 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,
    },
};

Appareils HAL

Un appareil extrait le matériel de votre produit. Par exemple, un fichier audio peut contenir un appareil audio principal, un périphérique audio USB ou un périphérique Bluetooth Appareil audio A2DP.

Un appareil est représenté par la structure hw_device_t. Semblable à un , chaque type d'appareil définit une version détaillée hw_device_t, qui contient des pointeurs de fonction pour des fonctionnalités spécifiques du matériel. Par exemple, le type de structure audio_hw_device_t contient des pointeurs de fonction vers les opérations de l'appareil 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;

En plus de ces propriétés standards, chaque HAL spécifique au matériel peut définir ses propres fonctionnalités et exigences. Pour en savoir plus, consultez la documentation de référence sur HAL ainsi que les instructions individuelles de chaque HAL.

Créer des modules HAL

Les implémentations HAL sont intégrées dans des fichiers de modules (.so) et sont de manière dynamique par Android, le cas échéant. Vous pouvez créer vos modules créer des fichiers Android.mk pour chacune de vos implémentations HAL ; et pointant vers vos fichiers sources. En général, vos bibliothèques partagées doivent être nommés dans un format spécifique afin qu’ils puissent être trouvés et chargés correctement. La dénomination varie légèrement d'un module à l'autre, mais suit le schéma général sur: <module_type>.<device_name>.

Ancienne version HAL

Le terme "ancienne HAL" désigne de manière générale toutes les HAL antérieures à Android 8.0 (obsolètes dans Android 8). La La majeure partie des interfaces système Android (caméra, son, capteurs, etc.) est définie sous "hardware/libhardware/include/hardware" et avec une gestion des versions approximative et une ABI à peu près stable. A peu de sous-systèmes (y compris le Wi-Fi, la couche d'interface radio et le Bluetooth) disposent d'autres des interfaces dans "libhardware_legacy" ou entre les différentes parties du codebase. Les anciennes HAL ne sont jamais a fourni des garanties strictes de stabilité.