Google стремится продвигать расовую справедливость для черных сообществ. Смотри как.
Эта страница была переведа с помощью Cloud Translation API.
Switch to English

Legacy HALs

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 содержит функциональные указатели на операции аудиоустройства:

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