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.
É 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>
.