Ответ
Да, работал с Android App Extensions. Они позволяют расширять функционал приложения без изменения основного APK. Основные типы:
- Instant Apps - для быстрого запуска без установки
- Wear OS - расширения для часов
- Auto - для автомобильных систем
- TV - для Android TV
Пример создания модуля динамического feature-модуля:
// build.gradle (:feature)
plugins {
id 'com.android.dynamic-feature'
}
dependencies {
implementation project(':app')
}
Ключевые моменты:
- Разделение на base и feature модули
- Динамическая загрузка через SplitInstallManager
- Ограничения по размеру (15MB для instant apps)
- Поддержка в Google Play
Важно правильно обрабатывать случаи, когда расширение не установлено.
Ответ 18+ 🔞
А, ну про эти ваши App Extensions я, конечно, слышал. Это ж когда твоё основное приложение — как базовая квартира, а эти расширения — типа балкон пристроить или лоджию остеклить, не трогая капитальные стены. В общем, хитрая жопа, но иногда охуенно удобная.
Вот смотри, какие они бывают, эти мартышлюшки:
- Instant Apps — это вообще магия какая-то. Пользователь ссылку ткнул, а ему уже кусок приложения в браузере работает, даже не качал ничего. Ёперный театр, да? Но там, конечно, свои заморочки — размер, как собака, ограничивают.
- Wear OS — чтоб на часы свои штуки запилить. Ну, если ты не полупидор, а хочешь полный фарш.
- Auto — для тачек. Чтобы в дороге не отвлекался, а то ещё в столб въедешь, пока кнопки ищешь.
- TV — для этих ваших умных ящиков. Интерфейс, понятное дело, другой — там с пульта управлять надо, а не пальцем тыкать.
А вот как эту хрень в коде организовывают. Создаёшь отдельный модуль, dynamic feature называется. Конфиг у него в build.gradle выглядит примерно так:
// build.gradle (:feature)
plugins {
id 'com.android.dynamic-feature'
}
dependencies {
implementation project(':app')
}
Видишь? Не 'com.android.application', а именно 'com.android.dynamic-feature'. И он зависит от основного модуля ':app'. Всё, логика твоего расширения — туда.
Но главная фишка — это как это добро потом в рантайме подгружать. Тут в дело вступает SplitInstallManager. Это такой менеджер, который говорит: «Э, сабака сука, пользователь нажал кнопку „Посмотреть в AR“, а у нас этого модуля нет! Надо скачать!». И он начинает этот процесс организовывать.
И вот тут, чувак, терпения ноль ебать. Надо всё грамотно обрабатывать. Пока модуль качается — показывать прогресс. Если скачался — уведомить юзера. Если ошибка — извиниться и предложить повторить. А самое главное — доверия ебать ноль к тому, что модуль уже установлен. Всегда проверяй SplitInstallManager.getInstalledModules(), прежде чем пытаться туда перейти или класс оттуда использовать. Иначе получишь ClassNotFoundException на ровном месте, и пользователь просто сам от себя охуеет, не понимая, что происходит.
Про размеры не забудь, особенно для Instant Apps. Там лимит — овердохуища в 15 мегабайт на всё про всё. Так что если твоё расширение — это какой-нибудь симулятор полёта на реактивном ранце с фотореалистичной графикой, то будет вам хиросима. Придётся оптимизировать, сжимать, выкидывать лишнее.
Ну и да, Google Play это всё поддерживает. Можно выкладывать модули отдельно, они будут докачиваться по мере надобности. В общем, инструмент мощный, но и подозрение ебать чувствую к нему — легко накосячить, если не продумать логику загрузки и обработки ошибок. Сначала на бумажке распиши, что и как должно работать, а потом уже кодь.