HAL heredadas

Un HAL define una interfaz estándar para que la implementen los proveedores de hardware, lo que permite a Android ser independiente de las implementaciones de controladores de nivel inferior. El uso de un HAL le permite implementar funciones sin afectar ni 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 versiones posteriores, consulte la descripción general de HAL .

Componentes HAL

Figura 1. Componentes HAL

Debe implementar el HAL (y el controlador) correspondiente para el hardware específico que proporciona su producto. Las implementaciones de HAL generalmente están integradas 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 los HAL tengan una estructura predecible, cada interfaz HAL específica del hardware tiene propiedades definidas en hardware/libhardware/include/hardware/hardware.h . Esta interfaz permite que el sistema Android cargue 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 buscar 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 cual HAL sirve como abstracción. Cada HAL específico de hardware generalmente extiende la estructura genérica hw_module_t con información adicional para esa pieza de hardware específica. Por ejemplo, en la cámara HAL, la estructura camera_module_t contiene una estructura hw_module_t junto con otros punteros 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 implementas un HAL y creas la estructura del módulo, debes nombrarlo HAL_MODULE_INFO_SYM . Ejemplo del HAL de audio del 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 manera 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 a 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 del 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 de cada HAL.

Construir módulos HAL

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

HAL heredado

El término HAL heredado se refiere en términos generales a todos los HAL anteriores a Android 8.0 (obsoletos en Android 8). La mayor parte de las interfaces del sistema Android (cámara, audio, sensores, etc.) se definen en `hardware/libhardware/include/hardware` y tienen versiones aproximadas y una ABI aproximadamente estable. Algunos subsistemas (incluidos Wi-Fi, capa de interfaz de radio y Bluetooth) tienen otras interfaces no estandarizadas en `libhardware_legacy` o intercaladas en todo el código base. Los HAL heredados nunca ofrecieron garantías estrictas de estabilidad.