HALs legadas

Uma HAL define uma interface padrão para os fornecedores de hardware implementarem, o que permite que o Android seja independente em relação a implementações de drivers de nível inferior. O uso de uma HAL permite implementar funcionalidades sem afetar ou modificar no sistema de nível superior. Esta página descreve a arquitetura mais antiga, que não é com suporte a partir do Android 8.0. Para o Android 8.0 e versões mais recentes, consulte a Visão geral do HAL.

Componentes HAL

Figura 1. Componentes HAL

É necessário implementar a HAL (e driver) correspondente para a hardware fornecido pelo seu produto. As implementações de HAL geralmente são integradas módulos de biblioteca compartilhada (arquivos .so), mas como o Android não exige uma interação padrão entre uma implementação de HAL e drivers de dispositivo, é possível faça o que for melhor para sua situação. No entanto, para permitir que o sistema Android interagir corretamente com o hardware, é necessário respeitar os definido em cada interface HAL específica de hardware.

Para garantir que as HALs tenham uma estrutura previsível, cada hardware específico A interface HAL tem propriedades definidas hardware/libhardware/include/hardware/hardware.h: Esta interface permite que o sistema Android carregue as versões corretas dos módulos HAL em uma consistente. Uma interface HAL consiste em dois componentes: módulos e dispositivos.

Módulos HAL

Um módulo representa a implementação de HAL empacotada, que é armazenada como um biblioteca compartilhada (.so file). A Arquivo principal hardware/libhardware/include/hardware/hardware.h define um struct (hw_module_t) que representa um módulo e contém metadados, como versão, nome e autor do módulo. Android usa esses metadados para encontrar e carregar o módulo HAL corretamente.

Além disso, o struct hw_module_t contém um ponteiro para outro struct, hw_module_methods_t, que contém um ponteiro para uma função aberta para o módulo. Essa função aberta é usada para iniciar comunicação com o hardware para o qual a HAL está servindo como uma abstração. Cada HAL específica de hardware geralmente estende o hw_module_t genérico. struct com informações adicionais para esse hardware específico. Para Por exemplo, na HAL da câmera, o struct camera_module_t contém uma struct hw_module_t com outra função específica da câmera ponteiros:

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;

Ao implementar uma HAL e criar o struct do módulo, é necessário nomeá-la HAL_MODULE_INFO_SYM: Exemplo da HAL de áudio do 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,
    },
};

Dispositivos HAL

Um dispositivo abstrai o hardware do seu produto. Por exemplo, um áudio módulo pode conter um dispositivo de áudio principal, um dispositivo de áudio USB ou um dispositivo Dispositivo de áudio A2DP.

Um dispositivo é representado pela estrutura hw_device_t. Semelhante a um cada tipo de dispositivo define uma versão detalhada do modelo hw_device_t que contém ponteiros de função para recursos específicos do hardware. Por exemplo, o tipo de struct audio_hw_device_t. contém ponteiros de função para operações do dispositivo de áudio:

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;

Além dessas propriedades padrão, cada HAL específica de hardware interface pode definir mais recursos e requisitos próprios. Para mais detalhes, consulte a documentação de referência da HAL, instruções individuais para cada HAL.

Criar módulos HAL

As implementações de HAL são integradas em arquivos de módulos (.so) e são vinculados dinamicamente pelo Android, quando apropriado. É possível criar seus módulos criando arquivos Android.mk para cada implementação da HAL. e apontando para seus arquivos de origem. Em geral, as bibliotecas compartilhadas precisam ser nomeados em um formato específico para que possam ser encontrados e carregados corretamente. A nomenclatura varia um pouco de módulo para módulo, mas segue o padrão geral de: <module_type>.<device_name>.

HAL legada

O termo HAL legada se refere amplamente a todas as HALs anteriores ao Android 8.0 (descontinuadas no Android 8). A a maior parte das interfaces do sistema Android (câmera, áudio, sensores etc.) está definida em "hardware/libhardware/include/hardware" e tenham controle de versões aproximado e uma ABI praticamente estável. Um alguns subsistemas (incluindo Wi-Fi, camada de interface de rádio e Bluetooth) têm outros em "libhardware_legacy" ou intercalados em toda a base de código. As HALs legadas nunca ofereceu garantias de estabilidade.