Работал ли с расширениями

Ответ

Да, работал с Android App Extensions. Они позволяют расширять функционал приложения без изменения основного APK. Основные типы:

  1. Instant Apps - для быстрого запуска без установки
  2. Wear OS - расширения для часов
  3. Auto - для автомобильных систем
  4. 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 я, конечно, слышал. Это ж когда твоё основное приложение — как базовая квартира, а эти расширения — типа балкон пристроить или лоджию остеклить, не трогая капитальные стены. В общем, хитрая жопа, но иногда охуенно удобная.

Вот смотри, какие они бывают, эти мартышлюшки:

  1. Instant Apps — это вообще магия какая-то. Пользователь ссылку ткнул, а ему уже кусок приложения в браузере работает, даже не качал ничего. Ёперный театр, да? Но там, конечно, свои заморочки — размер, как собака, ограничивают.
  2. Wear OS — чтоб на часы свои штуки запилить. Ну, если ты не полупидор, а хочешь полный фарш.
  3. Auto — для тачек. Чтобы в дороге не отвлекался, а то ещё в столб въедешь, пока кнопки ищешь.
  4. 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 это всё поддерживает. Можно выкладывать модули отдельно, они будут докачиваться по мере надобности. В общем, инструмент мощный, но и подозрение ебать чувствую к нему — легко накосячить, если не продумать логику загрузки и обработки ошибок. Сначала на бумажке распиши, что и как должно работать, а потом уже кодь.