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> .