Android

Настройка product flavors в Android: создание разных версий приложения

Этот гайд покажет, как настроить product flavors в Android Gradle для создания нескольких вариантов приложения из одного проекта, например, demo и full версий.

Обновлено 16 февраля 2026 г.
15-30 мин
Средняя
FixPedia Team
Применимо к:Android Gradle Plugin 4.0+Android Studio 4.0+

Введение

Product flavors в Android позволяют создавать разные варианты приложения из одного проекта, например, бесплатную и платную версии, или версии для разных регионов с уникальными ресурсами, зависимостями и настройками. Это экономит время разработки и упрощает поддержку кодовой базы, так как общий код остаётся в основном исходном наборе, а различия изолируются в папках, специфичных для каждого flavor.

Требования

Перед началом убедитесь, что у вас установлены:

  • Android Studio последней версии (рекомендуется Arctic Fox или новее).
  • Базовое понимание файлов сборки Gradle в Android.
  • Доступ к файлу build.gradle на уровне модуля приложения (обычно app/build.gradle).

Пошаговая инструкция

В этом разделе мы настроим два product flavors: free и paid. Каждый будет иметь уникальный package name суффикс и version name.

Шаг 1: Откройте файл build.gradle модуля приложения

В Android Studio в проекте найдите файл build.gradle (Module: app). Обычно он находится в папке app/ или вашего модуля. Откройте его для редактирования. Убедитесь, что редактируете файл уровня модуля, а не корневой файл проекта.

Шаг 2: Добавьте блок productFlavors в конфигурацию android

Внутри блока android { ... } добавьте следующие строки, если их ещё нет:

android {
    // ... существующие настройки (compileSdk, defaultConfig и т.д.)

    // Указываем измерение (dimension) для flavors. Это обязательно, если используете несколько измерений.
    flavorDimensions "version"

    productFlavors {
        // Определения flavors будут здесь
    }
}

Если у вас уже есть flavorDimensions, используйте существующее или добавьте новое. Измерение позволяет группировать flavors, если их несколько (например, "tier" и "region").

Шаг 3: Определите каждый flavor с уникальными параметрами

Внутри productFlavors { ... } добавьте каждый flavor. Пример для free и paid:

productFlavors {
    free {
        dimension "version"
        applicationIdSuffix ".free"
        versionNameSuffix "-free"
        // Дополнительно: ресурсы или зависимости, специфичные для free
    }
    paid {
        dimension "version"
        applicationIdSuffix ".paid"
        versionNameSuffix "-paid"
    }
}
  • dimension — указывает измерение, к которому относится flavor. Обязательно, если определены flavorDimensions.
  • applicationIdSuffix — добавляет суффикс к package name, чтобы flavors имели уникальные ID (например, com.example.app.free). Без этого flavors с одинаковым applicationId не смогут устанавливаться одновременно.
  • versionNameSuffix — добавляет суффикс к versionName для отличия в Google Play (например, 1.0-free).

Вы можете также задавать другие параметры внутри каждого flavor:

  • minSdkVersion, targetSdkVersion — переопределить версии SDK.
  • resValue "string", "app_name", "MyApp Free" — определить строковый ресурс, доступный через R.string.app_name.
  • buildConfigField "String", "API_URL", '"https://api.free.example.com"' — создать константу в классе BuildConfig для использования в коде.
  • sourceSets — указать кастомные пути к исходным кодам и ресурсам (хотя по умолчанию Gradle ищет в src/free/, src/paid/).

Шаг 4: Синхронизируйте проект с Gradle

После внесения изменений нажмите кнопку Sync Now в верхней части редактора файла (появится после редактирования) или выберите File → Sync Project with Gradle Files. Это применит новые настройки. Если есть синтаксические ошибки, они отобразятся в панели Build. Для диагностики можно выполнить в терминале:

./gradlew --refresh-dependencies

Шаг 5: Соберите APK для выбранного flavor

В Android Studio откройте панель Build Variants (обычно слева, в разделе Tool Windows). Вы увидите комбинации flavors и build types. Например, freeDebug, freeRelease, paidDebug, paidRelease.

Чтобы собрать APK:

  • Выберите нужный build variant (например, freeRelease для релизной сборки бесплатной версии).
  • Перейдите в Build → Build Bundle(s) / APK(s) → Build APK(s).
  • Готовый APK будет создан в папке app/build/outputs/apk/free/release/ (или paid/release/).

Или используйте командную строку (в корне проекта):

# Сборка debug-версии free flavor
./gradlew assembleFreeDebug

# Сборка release-версии paid flavor
./gradlew assemblePaidRelease

Проверка результата

Убедитесь, что flavors работают корректно:

  1. В панели Build Variants переключайтесь между freeDebug и paidDebug. Должны меняться ресурсы, если вы добавили flavor-specific (например, разные иконки в src/free/res/ и src/paid/res/).
  2. Установите оба APK на устройство или эмулятор. Проверьте package name: для free flavor должно быть, например, com.example.app.free, а для paidcom.example.app.paid. Они не должны конфликтовать.
  3. Запустите приложение для каждого flavor и проверьте наличие уникальных ресурсов или поведения, заданных через resValue или buildConfigField. Например, в коде можно использовать BuildConfig.API_URL.

Возможные проблемы

  • Ошибка: "More than one file was found with OS independent path" — возникает при дублировании ресурсов (например, одинаковых имен файлов) между flavors или с основными ресурсами. Убедитесь, что ресурсы для каждого flavor размещены только в своих папках (src/free/res/, src/paid/res/) и нет конфликтов.
  • Конфликт applicationId — если не использовать applicationIdSuffix или задавать одинаковый applicationId для всех flavors, они будут иметь одинаковый package name, что недопустимо для одновременной установки. Всегда добавляйте уникальный суффикс или меняйте applicationId полностью.
  • Отсутствующие зависимости — если flavor требует специфичных библиотек (например, реклама только в free версии), добавьте их в блок dependencies внутри flavor:
    freeImplementation 'com.google.android.gms:play-services-ads:22.0.0'
    
    Используйте конфигурации implementation, api и т.д., как в основном dependencies.
  • Проблемы с синхронизацией Gradle — проверьте синтаксис в build.gradle, особенно скобки и отступы. Если кэш Gradle поврежден, выполните ./gradlew clean или используйте File → Invalidate Caches and Restart в Android Studio.
  • Flavor-specific код не подхватывается — убедитесь, что Java/Kotlin файлы размещены в правильных исходных наборах: src/free/java/ и src/paid/java/. Gradle автоматически включает их при сборке соответствующего flavor. Также проверьте, что sourceSets не переопределены вручную без учёта flavors.
  • Изменения в flavors не применяются — после редактирования build.gradle обязательно синхронизируйте проект. Если проблема остаётся, проверьте, не переопределены ли параметры (например, applicationId) в defaultConfig или других блоках — приоритет имеют flavor-specific настройки.

Часто задаваемые вопросы

Что такое product flavors в Android?
Чем product flavors отличаются от build types?
Можно ли использовать product flavors с библиотечными модулями?
Как product flavors влияют на размер APK?

Полезное

Откройте файл build.gradle модуля приложения
Добавьте блок productFlavors в конфигурацию android
Определите каждый flavor с уникальными параметрами
Синхронизируйте проект с Gradle
Соберите APK для выбранного flavor

Эта статья помогла вам решить проблему?