Управління конфігураціями — один із найнедооціненіших аспектів мобільної розробки. За даними 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.