Skip to content

Параграф 5: Динамически доступные HAL

INFO

HAL (сокращение от Hardware Abstraction Layer) - программная прослойка, реализующая для системы абстрактный обобщёный интерфейс, позволяющий ей общаться с драйвером устройства, не углубляясь в особенности его реализации.

Также называется слоем аппаратных абстракций и иногда, ошибочно, драйвером.

Обычные, реализованные в виде HIDL-сервисов абстракции Android запускает во время загрузки системы, регистрирует их и общается с ними через Binder IPC (hwbinder). Такие HAL остаются запущены на протяжении всего времени работы системы, даже когда необходимости в них нет.

Динамически доступные HAL регистрируются в hwservicemanager как lazy ("ленивые") сервисы и запускаются системой только когда у них появляются клиенты - приложения или службы, использующие аппаратный компонент, реализуемый таким HAL.

К примеру, WiFi и Bluetooth HAL могут загружаться, когда пользователь включает соответствующую функцию в меню телефона, а при выключении они будут выгружаться, освобождая ресурсы системы. Camera HAL может загружаться, когда пользователь открывает приложение Камера и завершать свою работу после его закрытия.

Такая возможность особенно выгодна для Android Go, где ресурсы максимально ограничены.

Ниже приведён основной перечень HAL, которые можно легко превратить в динамические.

Соответствующие не-lazy записи должны быть заменены в device.mk:

makefile
PRODUCT_PACKAGES += \
    android.hardware.wifi@1.0-service-lazy \
    android.hardware.cas@1.2-service-lazy \
    android.hardware.drm@1.0-service-lazy \
    android.hardware.drm@1.3-service-lazy.clearkey

ВАЖНО:

Версия HAL (после символа @) приведена для примера, её следует оставить неизменной.

Камера

Чтобы превратить этот HAL в динамический, требуются следующие изменения в device.mk:

makefile
PRODUCT_PACKAGES += android.hardware.camera.provider@2.4-service-lazy
PRODUCT_PROPERTY_OVERRIDES += ro.camera.enableLazyHal=true

Устаревшие HAL (Camera HAL1) в динамическом режиме могут работать некорректно в режиме фонарика (плитка в быстрых настройках).

Прочие компоненты

  1. В прошивках некоторых Android Go устройств (например, Nokia 1 Plus) можно найти динамический Widevine DRM HAL (android.hardware.drm@1.3-service-lazy.widevine).

  2. Для Qualcomm-устройств с беспроводным модулем prima (msm8916/8917/8937, Snapdragon 410, 420, 425, 435, 439, QM215) есть блобы Qti Bluetooth HAL (android.hardware.bluetooth@1.0-service-qti-lazy), которые можно найти в прошивках для Nokia 1.3.

При добавлении этого компонента нужно добавить в device.mk следующее:

makefile
PRODUCT_PROPERTY_OVERRIDES += ro.vendor.bluetooth.lazyhal=true