Устаревшие HAL

HAL определяет стандартный интерфейс для реализации поставщиками оборудования, что позволяет Android не зависеть от реализации драйверов более низкого уровня. Использование HAL позволяет реализовать функциональность, не затрагивая и не изменяя систему более высокого уровня. На этой странице описывается старая архитектура, которая больше не поддерживается в Android 8.0. Для Android 8.0 и выше см. Типы HAL .

HAL-компоненты

Рисунок 1. Компоненты HAL

Вы должны реализовать соответствующий HAL (и драйвер) для конкретного оборудования, предоставляемого вашим продуктом. Реализации HAL обычно встроены в разделяемые библиотечные модули (файлы .so ), но поскольку Android не требует стандартного взаимодействия между реализацией HAL и драйверами устройств, вы можете сделать то, что лучше всего подходит для вашей ситуации. Однако, чтобы система Android могла правильно взаимодействовать с вашим оборудованием, вы должны соблюдать контракт, определенный в каждом интерфейсе HAL для конкретного оборудования.

Чтобы гарантировать предсказуемую структуру HAL, каждый аппаратно-зависимый интерфейс HAL имеет свойства, определенные в hardware/libhardware/include/hardware/hardware.h . Этот интерфейс позволяет системе Android последовательно загружать правильные версии ваших модулей HAL. Интерфейс HAL состоит из двух компонентов: модулей и устройств.

HAL-модули

Модуль представляет вашу упакованную реализацию HAL, которая хранится в виде разделяемой библиотеки ( .so file ). Заголовочный файл hardware/libhardware/include/hardware/hardware.h определяет структуру ( hw_module_t ), которая представляет модуль и содержит метаданные, такие как версия, имя и автор модуля. Android использует эти метаданные для правильного поиска и загрузки модуля HAL.

Кроме того, структура hw_module_t содержит указатель на другую структуру, hw_module_methods_t , которая содержит указатель на открытую функцию для модуля. Эта открытая функция используется для инициирования связи с оборудованием, для которого HAL служит абстракцией. Каждый аппаратно-зависимый HAL обычно расширяет общую структуру hw_module_t дополнительной информацией для этого конкретного оборудования. Например, в HAL камеры структура camera_module_t содержит структуру hw_module_t вместе с другими указателями функций, специфичными для камеры:

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;

Когда вы реализуете HAL и создаете структуру модуля, вы должны назвать ее HAL_MODULE_INFO_SYM . Пример из аудио HAL 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,
    },
};

HAL-устройства

Устройство абстрагирует аппаратное обеспечение вашего продукта. Например, аудиомодуль может содержать основное аудиоустройство, аудиоустройство USB или аудиоустройство Bluetooth A2DP.

Устройство представлено структурой hw_device_t . Подобно модулю, каждый тип устройства определяет подробную версию общего hw_device_t , которая содержит указатели функций для определенных функций оборудования. Например, тип структуры audio_hw_device_t содержит указатели функций на операции с аудиоустройствами:

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;

В дополнение к этим стандартным свойствам каждый аппаратно-зависимый интерфейс HAL может определять дополнительные собственные функции и требования. Дополнительные сведения см. в справочной документации по HAL , а также в отдельных инструкциях для каждого HAL.

Создание модулей HAL

Реализации HAL встроены в файлы модулей ( .so ) и при необходимости динамически связываются Android. Вы можете создавать свои модули, создавая файлы Android.mk для каждой из ваших реализаций HAL и указывая на свои исходные файлы. Как правило, ваши общие библиотеки должны быть названы в определенном формате, чтобы их можно было найти и правильно загрузить. Схема именования немного отличается от модуля к модулю, но следует общему шаблону: <module_type>.<device_name> .