Давайте представим, что к нам приходит менеджер и говорит: хочу два одинаковых приложения. Но вот чтобы в одном была картинка русского котика, а во втором — грузинского. Первое, что приходит в голову — просто создать два приложения, которые будут отличаться только картинкой. Но что делать, если через неделю придёт менеджер и скажет, что хочет ещё десяток приложений с разными котами? Тут дублирование уже не кажется прям хорошим вариантом. На помощь нам придут 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 свой.
Синхронизируем проект и теперь у нас появились разные виды сборок:
Если бы я использовала flavorDimensions "cats", "version", "api", то тут добавились бы ещё сборки с версиями и апи. Советую самостоятельно добавить, синхронизировать и посмотреть. Получится примерно так:
— Правой кнопкой мышки кликаем на src — new directory — вводим нужный нам flavor. У меня, кстати, по какой-то причине русские котики не находились. Их просто вручную создала.
— Сохраняю картинки и создаю GetCatImageInteractor внутри каждого flavor. Тут нет никакой разницы с тем как мы обычно пишем код. Структура получается такой:
— В общей активити делаем binding.catImage.background = AppCompatResources.getDrawable(this, getCatImageInteractor())
Реализация: https://github.com/Ladgertha/flavorsExample/commit/84b51e018f6cea3c341b20c650b77deb1b7017b2
Плюсы использования:
- Гибкость: flavors позволяют создавать разные версии приложения, каждая из которых может иметь свои уникальные функции и настройки.
- Эффективность тестирования: можем создать тестовые версии приложения с различными настройками и функциями.
- Экономия времени: flavors избавляют от необходимости поддерживать разные кодовые базы для разных версий приложения.
Минусы использования:
- Сложность: использование flavors может увеличить сложность проекта, особенно когда их количество становится очень большим. На личном опыте столкнулась, когда есть множество flavors и надо во всех поддерживать актуальный код.
- Управление ресурсами: если у вас есть множество flavors, которые имеют разные ресурсы, управление ими может стать сложным.
Дубль статей в телеграмме — https://t.me/android_junior
Мои заметки в телеграмме — https://t.me/android_junior_notes
P.S. сделано с помощью ChatGPT и Midjourney. :)