Параграф 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:
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:
PRODUCT_PACKAGES += android.hardware.camera.provider@2.4-service-lazy
PRODUCT_PROPERTY_OVERRIDES += ro.camera.enableLazyHal=true
Устаревшие HAL (Camera HAL1) в динамическом режиме могут работать некорректно в режиме фонарика (плитка в быстрых настройках).
Прочие компоненты
В прошивках некоторых Android Go устройств (например, Nokia 1 Plus) можно найти динамический Widevine DRM HAL (android.hardware.drm@1.3-service-lazy.widevine).
Для 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 следующее:
PRODUCT_PROPERTY_OVERRIDES += ro.vendor.bluetooth.lazyhal=true