Google is committed to advancing racial equity for Black communities. See how.
Эта страница переведена с помощью Cloud Translation API.
Switch to English

Устаревшие HAL

HAL определяет стандартный интерфейс для реализации поставщиками оборудования, который позволяет Android не зависеть от реализаций драйверов нижнего уровня. Использование HAL позволяет реализовать функциональность, не затрагивая и не изменяя систему более высокого уровня. На этой странице описывается старая архитектура, которая больше не поддерживается в Android 8.0. Для Android 8.0 и выше см. Типы 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 выступает в качестве абстракции. Каждый аппаратно- hw_module_t HAL обычно расширяет общую структуру hw_module_t дополнительной информацией для этого конкретного аппаратного обеспечения. Например, в HAL camera_module_t структура 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 . Пример из Nexus 9 audio HAL:

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 структуры 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> .