Una HAL define una interfaz estándar que deben implementar los proveedores de hardware lo que permite que Android sea independiente de las implementaciones de controladores de nivel inferior. Usar una HAL te permite implementar funcionalidades sin afectar ni modificar el sistema de nivel superior. En esta página, se describe la arquitectura anterior, que no es compatible a partir de Android 8.0. Para Android 8.0 y versiones posteriores, consulta la Descripción general de HAL.
Debes implementar el HAL (y el controlador) correspondientes para el
y el hardware que proporciona tu producto. Por lo general, las implementaciones de HAL están integradas
módulos de bibliotecas compartidas (archivos .so
), pero, como Android no exige
una interacción estándar entre la implementación de HAL y los controladores de dispositivos, puedes
hacer lo mejor para tu situación. Sin embargo, para permitir que el sistema Android
interactuar correctamente con tu hardware, debes cumplir con las
definido en cada interfaz de HAL específica de hardware.
Para garantizar que las HALs tengan una estructura predecible, cada HAL específica
HAL tiene propiedades definidas en
hardware/libhardware/include/hardware/hardware.h
Esta interfaz
permite que el sistema Android cargue las versiones correctas de los módulos HAL de una
de forma coherente. Una interfaz de HAL consta de dos componentes: módulos y dispositivos.
Módulos de HAL
Un módulo representa tu implementación de HAL empaquetada, que se almacena como un
biblioteca compartida (.so file
). El
Archivo de encabezado hardware/libhardware/include/hardware/hardware.h
define un struct (hw_module_t
) que representa un módulo y
contiene metadatos como la versión, el nombre y el autor del módulo. En Android
usa estos metadatos para encontrar y cargar correctamente el módulo HAL.
Además, el struct hw_module_t
contiene un puntero para
otra struct, hw_module_methods_t
, que contiene un puntero para
una función abierta para el módulo. Esta función abierta se usa para iniciar
la comunicación con el hardware para el cual la HAL está funcionando como una abstracción.
Por lo general, cada HAL específica de hardware extiende el hw_module_t
genérico
struct con información adicional para esa pieza específica de hardware. Para
Por ejemplo, en la HAL de la cámara, el struct camera_module_t
contiene un
El struct hw_module_t
junto con otra función específica de la cámara
punteros:
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;
Cuando implementas una HAL y creas el struct del módulo, debes asignarle un nombre
HAL_MODULE_INFO_SYM
Ejemplo de la HAL de audio de 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
Un dispositivo abstrae el hardware de tu producto. Por ejemplo, un archivo puede contener un dispositivo de audio principal, un dispositivo de audio USB o un Dispositivo de audio A2DP
Un dispositivo se representa mediante la struct hw_device_t
. Similar a un
cada tipo de dispositivo define una versión detallada del elemento genérico
hw_device_t
, que contiene punteros de función para funciones específicas
del hardware. Por ejemplo, el tipo de struct audio_hw_device_t
Contiene punteros de función para operaciones del dispositivo de 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;
Además de estas propiedades estándar, cada HAL específica de hardware de Google puede definir más de sus propias funciones y requisitos. Para obtener más información, consulta la documentación de referencia de HAL las instrucciones individuales para cada HAL.
Cómo compilar módulos de HAL
Las implementaciones de HAL se compilan en archivos de módulos (.so
) y se
que Android vincula de forma dinámica cuando corresponda. Puedes compilar tus módulos
Crear archivos Android.mk
para cada una de tus implementaciones de HAL
y que apunte a tus archivos fuente. En general, tus bibliotecas compartidas deben estar
nombrados en un formato específico para que se puedan encontrar y cargar correctamente. Los nombres
varía levemente de un módulo a otro, pero sigue el patrón general
de: <module_type>.<device_name>
.