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