HAL heredadas

Una HAL define una interfaz estándar para que la implementen los proveedores de hardware, lo que permite que Android sea independiente de las implementaciones de controladores de nivel inferior. El uso de una HAL le permite implementar la funcionalidad sin afectar o modificar el sistema de nivel superior. Esta página describe la arquitectura anterior, que ya no es compatible a partir de Android 8.0. Para Android 8.0 y superior, consulte Tipos de HAL .

Componentes HAL

Figura 1. Componentes HAL

Debe implementar la HAL (y el controlador) correspondiente para el hardware específico que proporciona su producto. Las implementaciones de HAL generalmente se integran en módulos de biblioteca compartida (archivos .so ), pero como Android no exige una interacción estándar entre una implementación de HAL y los controladores de dispositivos, puede hacer lo que sea mejor para su situación. Sin embargo, para permitir que el sistema Android interactúe correctamente con su hardware, debe cumplir con el contrato definido en cada interfaz HAL específica del hardware.

Para garantizar que las HAL tengan una estructura predecible, cada interfaz HAL específica de hardware tiene propiedades definidas en hardware/libhardware/include/hardware/hardware.h . Esta interfaz permite que el sistema Android cargue las versiones correctas de sus módulos HAL de manera consistente. Una interfaz HAL consta de dos componentes: módulos y dispositivos.

Módulos HAL

Un módulo representa su implementación HAL empaquetada, que se almacena como una biblioteca compartida ( .so file ). El archivo de encabezado hardware/libhardware/include/hardware/hardware.h define una estructura ( hw_module_t ) que representa un módulo y contiene metadatos como la versión, el nombre y el autor del módulo. Android usa estos metadatos para encontrar y cargar el módulo HAL correctamente.

Además, la estructura hw_module_t contiene un puntero a otra estructura, hw_module_methods_t , que contiene un puntero a una función abierta para el módulo. Esta función abierta se utiliza para iniciar la comunicación con el hardware para el que HAL sirve como abstracción. Cada HAL específica de hardware generalmente extiende la estructura genérica hw_module_t con información adicional para esa pieza específica de hardware. Por ejemplo, en la cámara HAL, la estructura camera_module_t contiene una estructura hw_module_t junto con otros indicadores de función específicos de la cámara:

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 implementa una HAL y crea la estructura del módulo, debe nombrarla 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 su producto. Por ejemplo, un módulo de audio puede contener un dispositivo de audio principal, un dispositivo de audio USB o un dispositivo de audio Bluetooth A2DP.

Un dispositivo está representado por la estructura hw_device_t . De forma similar a un módulo, cada tipo de dispositivo define una versión detallada del hw_device_t genérico que contiene punteros de función para características específicas del hardware. Por ejemplo, el tipo de estructura audio_hw_device_t contiene punteros de función para operaciones de dispositivos 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 interfaz HAL específica de hardware puede definir más características y requisitos propios. Para obtener más información, consulte la documentación de referencia de HAL , así como las instrucciones individuales para cada HAL.

Construcción de módulos HAL

Las implementaciones de HAL están integradas en archivos de módulos ( .so ) y Android las vincula dinámicamente cuando corresponde. Puede compilar sus módulos creando archivos Android.mk para cada una de sus implementaciones de HAL y apuntando a sus archivos de origen. En general, sus bibliotecas compartidas deben tener un nombre en un formato específico para que se puedan encontrar y cargar correctamente. El esquema de nombres varía ligeramente de un módulo a otro, pero sigue el patrón general de: <module_type>.<device_name> .