← Назад к вопросам

Что такое flavor?

1.0 Junior🔥 221 комментариев
#Android компоненты

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое Flavor (Вариант сборки/Продуктовый вариант) в Android?

В контексте Android-разработки flavor (часто называемый product flavor) — это мощный механизм системы сборки Gradle, позволяющий создавать разные версии одного и того же приложения из единой кодовой базы. Это не просто конфигурация, а фундаментальная концепция для управления вариативностью приложения.

Основная цель и аналогия

Представьте, что ваше приложение — это автомобиль на заводе. Базовая платформа (кодовая база) одна, но вы можете выпускать разные модификации: с бензиновым или дизельным двигателем (разная логика), в разных комплектациях "Стандарт" и "Люкс" (разные ресурсы), под разные бренды (разные иконки и названия). Flavor — это и есть конвейерная линия для сборки каждой такой модификации. Официальный термин — Product Flavor.

Ключевые аспекты Product Flavor

Каждый flavor позволяет определить уникальный набор значений для следующих категорий, переопределяющих значения по умолчанию из основного исходного набора (src/main):

  1. Код (Java/Kotlin): Разная бизнес-логика, реализации интерфейсов, классы-заглушки для тестов или продакшена.
  2. Ресурсы (Resources):
    *   `strings.xml`, `colors.xml` — разные названия приложения, темы, тексты.
    *   `drawable/`, `mipmap/` — разные иконки, логотипы, изображения.
    *   `layout/` — разные макеты для определенных версий.
  1. Манифест (AndroidManifest.xml): Разные значения, такие как android:label, android:icon, разрешения, мета-данные (например, разные API-ключи).
  2. Конфигурации сборки: Разные значения в buildConfigField и resValue, которые инжектируются во время компиляции.

Практическое применение: Типичные сценарии

  • Бесплатная (Free) и Платная (Paid) версии: Убираем рекламу и включаем премиум-функции в платном варианте.
  • Версии для разных брендов/клиентов (White-label): Одно приложение под разными именами и цветами для нескольких заказчиков.
  • Разные бэкенды: dev, staging, production версии, указывающие на разные серверы API.
  • Demo/Full версии: Ограничение функционала в демо-режиме.

Техническая реализация в build.gradle (Kotlin DSL)

Flavors объявляются в блоке android {} файла build.gradle.kts уровня модуля.

android {
    ...
    buildTypes {
        release { ... }
        debug { ... }
    }

    flavorDimensions += "version"
    productFlavors {
        create("demo") {
            dimension = "version"
            applicationIdSuffix = ".demo"
            versionNameSuffix = "-demo"
            buildConfigField("String", "API_URL", "\"https://api.demo.com\"")
            resValue("string", "app_name", "My App Demo")
        }
        create("full") {
            dimension = "version"
            applicationIdSuffix = ".full"
            versionNameSuffix = "-full"
            buildConfigField("String", "API_URL", "\"https://api.production.com\"")
            resValue("string", "app_name", "My App")
        }
    }
}

Структура исходных папок

Gradle создает варианты исходных наборов, объединяя buildType + flavor. Приоритет имеет специализированный источник. Например, для сборки fullDebug система будет искать код и ресурсы в порядке приоритета:

  1. src/fullDebug/ (flavor + build type)
  2. src/debug/ (build type)
  3. src/full/ (flavor)
  4. src/main/ (основной источник)

Папка для flavor (src/full/) создается разработчиком и повторяет структуру src/main/. В нее помещаются только те файлы, которые отличаются от основной версии.

app/
├── src/
│   ├── main/           # Общий код, ресурсы, манифест
│   ├── demo/          # Файлы, специфичные для демо-версии
│   │   ├── java/
│   │   ├── res/
│   │   └── AndroidManifest.xml
│   └── full/          # Файлы, специфичные для полной версии
│       └── res/
└── build.gradle.kts

Flavor Dimensions (Измерения вариантов)

Для создания более сложных комбинаций (например, "бесплатная версия для региона А" и "платная версия для региона Б") используются flavorDimensions. Это позволяет группировать flavors по независимым характеристикам.

android {
    flavorDimensions += listOf("tier", "region")
    productFlavors {
        create("free") {
            dimension = "tier"
            applicationIdSuffix = ".free"
        }
        create("paid") {
            dimension = "tier"
            applicationIdSuffix = ".paid"
        }
        create("europe") {
            dimension = "region"
            resValue("string", "server", "eu.myapp.com")
        }
        create("asia") {
            dimension = "region"
            resValue("string", "server", "as.myapp.com")
        }
    }
}

Gradle сгенерирует варианты сборки: freeEuropeDebug, freeAsiaRelease, paidEuropeDebug, paidAsiaRelease и т.д. — всего 2 (tier) * 2 (region) * 2 (build type) = 8 вариантов.

Сборка и установка

После настройки в Android Studio появятся соответствующие задачи сборки в меню "Build Variants" и панели Gradle. Можно собрать APK/AAB для конкретного варианта через CLI:

./gradlew assembleFreeEuropeRelease

Итог: Flavor — это невероятно гибкий инструмент, который превращает поддержку множества версий приложения из хаотичного копирования кода в управляемый, автоматизированный и безопасный процесс. Это обязательный навык для профессионального Android-разработчика, работающего над коммерческими проектами любой сложности.