Управление конфигурациями — один из самых недооценённых аспектов мобильной разработки. По данным CloudBees (2025), 47% инцидентов в production связаны с неправильными конфигурациями сборки. Правильная настройка Build Variant, Scheme и .env файлов — залог стабильного CI/CD и предсказуемого релиза.
Главное
Build Variant — комбинация Build Type (debug/release/staging) и Product Flavor (free/paid, demo/full). Gradle автоматически создаёт variant для каждого сочетания: freeDebug, freeRelease, paidDebug, paidRelease. Каждый variant может иметь свой код, ресурсы и зависимости — это основа управления конфигурациями в мобильных приложениях на Android.
Build Type — настройки сборки: включена ли отладка, подписывание, оптимизация ProGuard. debug по умолчанию содержит debuggable=true, release — minifyEnabled=true.
Product Flavor — вариант приложения: бесплатное (free), платное (paid), демо (demo). Flavour могут иметь разные applicationId, ресурсы, SDK-зависимости.
// build.gradle — настройка продукт-флейворов Android
android {
productFlavors {
free {
applicationId "com.example.app.free"
versionName "1.0-free"
}
paid {
applicationId "com.example.app.paid"
versionName "1.0-paid"
}
}
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt')
}
}
}
В примере созданы два flavour: free и paid. Для free установлен отдельный applicationId — это позволяет установить оба приложения на одно устройство. BuildConfig генерируется для каждого variant: BuildConfig.FLAVOR = "free", BuildConfig.BUILD_TYPE = "debug". Используйте BuildConfig в коде для условной логики.
settings.gradle — корневой файл Gradle, который описывает модули проекта.
Gradle KTS — альтернатива Groovy на Kotlin DSL. KTS даёт автодополнение в Android Studio и проверку типов. Рекомендуется для новых проектов.
Управление конфигурациями в iOS строится на Scheme — конфигурации Xcode, которая определяет, что и как собирается: Build Configuration (Debug/Release), тесты, анализ, архивацию. Scheme можно дублировать для разных окружений (Development, Staging, Production). Scheme хранится в .xcscheme файле в папке xcshareddata.
.xcconfig — файл конфигурации Xcode, который хранит build settings в текстовом виде. Для управления конфигурациями в мобильном приложении iOS использует .xcconfig: версионирование в Git, переиспользование между проектами, меньше ручных настроек. В .xcconfig задаются SWIFT_ACTIVE_COMPILATION_CONDITIONS, PRODUCT_BUNDLE_IDENTIFIER, CODE_SIGN_IDENTITY.
Info.plist — файл метаданных приложения. В нём хранятся версия, идентификатор, права доступа. Info.plist может быть разным для каждого Scheme — через Info.plist File в Build Settings.
AndroidManifest.xml — аналог для Android: хранит разрешения, компоненты, мета-данные.
Scheme — это сценарий сборки (что делать). Build Configuration — набор настроек (как делать). Один Scheme использует одну Build Configuration (Debug или Release). Для CI-CD: настройте Archive-действие на Release и Test-действие на Debug в одном Scheme.
pubspec.yaml — файл конфигурации Flutter-проекта. Содержит зависимости, версии, ресурсы. Поддерживает environment переменные через --dart-define.
Podfile — менеджер зависимостей CocoaPods для iOS. Определяет версии библиотек и платформу.
.env — файл с переменными окружения для всех платформ. Flutter и React Native используют иной подход к управлению конфигурациями: dart-define во Flutter, react-native-config в React Native. Управлением конфигурациями в кроссплатформенных проектах занимаются разные инструменты в зависимости от стека.
.env — текстовый файл с парами ключ=значение. Не коммитится в Git (добавьте в .gitignore). Для Flutter — flutter_dotenv, для iOS — Config.xcconfig с включением через #include, для Android — BuildConfig. env-переменные: API_URL, SENTRY_DSN, APP_SECRET. В управлении конфигурациями в мобильной разработке .env — стандарт де-факто для хранения секретов вне репозитория.
Podfile описывает зависимости CocoaPods и платформу (platform :ios, '15.0'). pubspec.yaml для Flutter — dependencies и dev_dependencies. Оба поддерживают conditional dependencies: pod 'Analytics', :configs => ['Release'] или flutter pub add --flavor free. В IT Sectr мы используем .env + BuildConfig для секретов и Podfile для нативных зависимостей в мобильных проектах.
| Параметр | Android | iOS | Flutter |
|---|---|---|---|
| Единица конфигурации | Build Variant | Scheme | Flavor (--flavor) |
| Файл сборки | build.gradle | .xcconfig | pubspec.yaml |
| Условный код | BuildConfig | Active Compilation Conditions | dart-define |
| Секреты | BuildConfig/NDK | .xcconfig | .env/dart-define |
| Менеджер зависимостей | Gradle (Maven) | SPM/CocoaPods | pub (dart) |
Таблица показывает ключевые отличия в управлении конфигурациями между мобильными платформами. Android даёт больше гибкости через Build Variant. iOS — проще, но менее гибок. Flutter централизует конфигурацию в dart-define, но для нативных зависимостей всё равно нужно настраивать Podfile/build.gradle.
Conditional Compilation — включение или исключение кода на этапе компиляции в зависимости от флагов. Это часть управления конфигурациями: она позволяет встраивать отладочные инструменты (логирование, инспектор) в debug-сборку и вырезать их из release. Реализация отличается на разных платформах.
#if DEBUG — директива препроцессора Swift. Код внутри блока компилируется только в Debug-конфигурации. Другие флаги: #if !RELEASE, #if targetEnvironment(simulator). Active Compilation Conditions в Build Settings — добавляйте свои флаги через -D FLAG_NAME. Управлении конфигурациями сборки через условия компиляции — стандартная практика в iOS.
BuildConfig.DEBUG — булевое поле, true в debug-сборке. BuildConfig генерируется Gradle автоматически. Для кастомных флагов используйте buildConfigField в build.gradle: buildConfigField "boolean", "REPORT_CRASHES", "true". В коде: if (BuildConfig.REPORT_CRASHES) { ... }.
dart-define — флаги компиляции Flutter: flutter run --dart-define=ENV=staging. В коде: const env = String.fromEnvironment('ENV', defaultValue: 'production'). Для условной сборки мобильных приложений используйте плагин build_runner с генерацией кода.
Часто задаваемые вопросы
Build Variant = Build Type (debug/release) + Product Flavor. Flavor — это вариант приложения (платный/бесплатный, клиентский/серверный), Build Type — настройки сборки (отладка/оптимизация). Комбинация flavour + type образует variant: например, paidDebug.
.xcconfig — это файл конфигурации Xcode, который хранит build settings в текстовом виде. Он позволяет вынести настройки из Xcode проекта в Git-friendly файлы, упрощая CI/CD и командную работу в мобильных проектах.
API-ключи нельзя хранить в коде — любой .apk или .ipa можно декомпилировать. Используйте .env файлы, backend proxy или обфускацию через Build Config. IT Sectr рекомендует хранить секреты на сервере и выдавать их клиенту после авторизации.
Conditional Compilation — это включение/исключение кода на этапе компиляции в зависимости от флагов. В Swift — #if DEBUG, в Kotlin — BuildConfig.DEBUG. Используется для включения логирования в debug и отключения в release. Это ключевой элемент управления конфигурациями в мобильной разработке.
Podfile используется только при работе с CocoaPods. Для SPM или Carthage он не нужен. Не оставляйте Podfile в проекте, если вы отказались от CocoaPods — это запутывает команду и CI/CD систему.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.