HAL heredadas

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.

Componentes de la HAL

Figura 1: Componentes de la 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>.

HAL heredada

El término HAL heredado hace referencia, en términos generales, a todas las HAL anteriores a Android 8.0 (obsoletas en Android 8). El la mayoría de las interfaces del sistema Android (cámara, audio, sensores, etc.) se definen en `hardware/libhardware/include/hardware` y tienen un control de versiones aproximado y una ABI relativamente estable. R pocos subsistemas (incluidos Wi-Fi, Capa de interfaz de radio y Bluetooth) tienen otros sistemas interfaces en `libhardware_legacy` o que se intercalan en toda la base de código. Las HAL heredadas nunca y nos proporcionó garantías de estabilidad estrictas.