Uma HAL define uma interface padrão para implementação por fornecedores de hardware, o que permite que o Android seja independente de implementações de driver de nível inferior. O uso de um HAL permite implementar a funcionalidade sem afetar ou modificar o sistema de nível superior. Esta página descreve a arquitetura mais antiga, que não tem mais suporte no Android 8.0. Para o Android 8.0 e versões mais recentes, consulte a Visão geral da HAL.

Figura 1. Componentes do HAL
É necessário implementar o HAL (e o driver) correspondente para o hardware
específico fornecido pelo produto. As implementações do HAL geralmente são integradas a
módulos de biblioteca compartilhada (arquivos .so
), mas, como o Android não exige
uma interação padrão entre uma implementação do HAL e drivers de dispositivo, você pode
fazer o que for melhor para sua situação. No entanto, para permitir que o sistema Android
interaja corretamente com o hardware, você precisa obedecer ao
contrato definido em cada interface HAL específica do hardware.
Para garantir que os HALs tenham uma estrutura previsível, cada interface HAL específica
de hardware tem propriedades definidas em
hardware/libhardware/include/hardware/hardware.h
. Essa interface
permite que o sistema Android carregue versões corretas dos módulos HAL de maneira
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 uma
biblioteca compartilhada (.so file
). O
arquivo de cabeçalho hardware/libhardware/include/hardware/hardware.h
define uma struct (hw_module_t
) que representa um módulo e
contém metadados, como a versão, o nome e o autor do módulo. O Android
usa esses metadados para encontrar e carregar o módulo HAL corretamente.
Além disso, a estrutura hw_module_t
contém um ponteiro para
outra estrutura, hw_module_methods_t
, que contém um ponteiro para
uma função aberta do módulo. Essa função aberta é usada para iniciar
a comunicação com o hardware para o qual o HAL está servindo como uma abstração.
Cada HAL específica do hardware geralmente estende a estrutura hw_module_t
genérica com informações adicionais para esse hardware específico. Por
exemplo, no HAL da câmera, a struct camera_module_t
contém uma
hw_module_t
junto com outros ponteiros de função específicos da
câmera:
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 um HAL e criar a estrutura do módulo, você precisa nomeá-lo
HAL_MODULE_INFO_SYM
. Exemplo do 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 módulo de áudio pode conter um dispositivo de áudio principal, um dispositivo de áudio USB ou um dispositivo de áudio A2DP Bluetooth.
Um dispositivo é representado pelo struct hw_device_t
. Assim como um
módulo, cada tipo de dispositivo define uma versão detalhada do hw_device_t
genérico, 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 de 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 interface HAL específica de hardware pode definir mais recursos e requisitos. Para mais detalhes, consulte a documentação de referência do HAL e as instruções individuais de cada HAL.
Criar módulos HAL
As implementações do HAL são integradas aos arquivos de módulos (.so
) e são
vinculadas dinamicamente pelo Android quando apropriado. É possível criar seus módulos
criando arquivos Android.mk
para cada uma das implementações do HAL
e apontando para os arquivos de origem. Em geral, as bibliotecas compartilhadas precisam ser
nomeadas em um formato específico para que possam ser encontradas e carregadas corretamente. O esquema de
nomeação varia um pouco de módulo para módulo, mas segue o padrão geral
de: <module_type>.<device_name>
.