Найти тему

Что такое Flavors и зачем они нужны?

Оглавление

Давайте представим, что к нам приходит менеджер и говорит: хочу два одинаковых приложения. Но вот чтобы в одном была картинка русского котика, а во втором — грузинского. Первое, что приходит в голову — просто создать два приложения, которые будут отличаться только картинкой. Но что делать, если через неделю придёт менеджер и скажет, что хочет ещё десяток приложений с разными котами? Тут дублирование уже не кажется прям хорошим вариантом. На помощь нам придут flavors.

Flavors — это такой инструмент, который позволяет создать разные версии одного приложения, используя общий код. В каждой версии будут свои особенности и настройки.

Как использовать Flavors:

Реализуем приложение с котиками. Тем, кто хочет просто посмотреть код и сразу запустить: https://github.com/Ladgertha/flavorsExample.

Создаём самый обычный проект, активити и прочие настройки. В активити я сделала одну ImageView. И вот картинка должна отличаться.

Моё решение: в каждом flavor сохранить свою картинку с котиком и сделать там GetCatImageInteractor, который будет возвращать нужную картинку.

— Открываем build.gradle нашего проекта и указываем flavorDimensions "cats". Что это вообще такое? Flavor dimensions позволяют указать группы flavors, которые могут работать вместе. Это полезно, когда у нас приложение, в которых мы можем комбинировать разные flavors. Например, более сложная настройка: flavorDimensions "cats", "version", "api".

— Указываем productFlavors. Внутри перечисляем все flavors, которые нам нужны: russian_cats и georgian_cats. Для каждого указываю свою версию, applicationId и dimension свой.

Синхронизируем проект и теперь у нас появились разные виды сборок:

-2

Если бы я использовала flavorDimensions "cats", "version", "api", то тут добавились бы ещё сборки с версиями и апи. Советую самостоятельно добавить, синхронизировать и посмотреть. Получится примерно так:

-3

— Правой кнопкой мышки кликаем на src — new directory — вводим нужный нам flavor. У меня, кстати, по какой-то причине русские котики не находились. Их просто вручную создала.

-4

— Сохраняю картинки и создаю GetCatImageInteractor внутри каждого flavor. Тут нет никакой разницы с тем как мы обычно пишем код. Структура получается такой:

-5

— В общей активити делаем binding.catImage.background = AppCompatResources.getDrawable(this, getCatImageInteractor())

Реализация: https://github.com/Ladgertha/flavorsExample/commit/84b51e018f6cea3c341b20c650b77deb1b7017b2

Плюсы использования:

  1. Гибкость: flavors позволяют создавать разные версии приложения, каждая из которых может иметь свои уникальные функции и настройки.
  2. Эффективность тестирования: можем создать тестовые версии приложения с различными настройками и функциями.
  3. Экономия времени: flavors избавляют от необходимости поддерживать разные кодовые базы для разных версий приложения.

Минусы использования:

  1. Сложность: использование flavors может увеличить сложность проекта, особенно когда их количество становится очень большим. На личном опыте столкнулась, когда есть множество flavors и надо во всех поддерживать актуальный код.
  2. Управление ресурсами: если у вас есть множество flavors, которые имеют разные ресурсы, управление ими может стать сложным.
-6

Дубль статей в телеграмме — https://t.me/android_junior

Мои заметки в телеграмме — https://t.me/android_junior_notes

P.S. сделано с помощью ChatGPT и Midjourney. :)