Управління конфігураціями в мобільній розробці: що це, які варіанти та як налаштувати

Автор: IT Sectr Опубліковано: 2026-05-30 Час читання: 8 хв

Управління конфігураціями — один із найнедооціненіших аспектів мобільної розробки. За даними CloudBees (2025), 47% інцидентів у production пов'язані з неправильними конфігураціями збірки. Правильне налаштування Build Variant, Scheme та .env файлів — запорука стабільного CI/CD та передбачуваного релізу.

Головне

  • Управління конфігураціями в мобільних застосунках будується на Build Variant (Android), Scheme (iOS) та .env (кроссплатформа) — 47% production-інцидентів пов'язані з неправильними налаштуваннями.
  • iOS використовує Scheme + .xcconfig. Scheme керує збіркою, тестуванням та архівацією. .xcconfig виносить build settings у файли.
  • Кроссплатформенні інструменти — pubspec.yaml (Flutter), Podfile (CocoaPods), .env (змінні оточення) — централізують конфігурацію.
  • Conditional Compilation — включення/виключення коду на етапі компіляції. #if DEBUG, BuildConfig.DEBUG — для налагодження без зміни поведінки релізу.
  • API-ключі та секрети не можна зберігати в коді. Використовуйте .env, Build Config або proxy-сервер. Декомпіляція .apk/.ipa — тривіальна.

Управління конфігураціями в Android: Build Variant та build.gradle

Build Variant — комбінація Build Type (debug/release/staging) та Product Flavor (free/paid, demo/full). Gradle автоматично створює variant для кожного поєднання: freeDebug, freeRelease, paidDebug, paidRelease. Кожен variant може мати свій код, ресурси та залежності — це основа управління конфігураціями в мобільних застосунках на Android.

Build Variant vs Product Flavor

Build Type — налаштування збірки: чи включено налагодження, підписання, оптимізація ProGuard. debug за замовчуванням містить debuggable=true, release — minifyEnabled=true.

Product Flavor — варіант застосунку: безкоштовний (free), платний (paid), демо (demo). Flavour можуть мати різні applicationId, ресурси, SDK-залежності.

groovy
// 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 KTS

settings.gradle — кореневий файл Gradle, який описує модулі проєкту.

Gradle KTS — альтернатива Groovy на Kotlin DSL. KTS дає автодоповнення в Android Studio та перевірку типів. Рекомендується для нових проєктів.

Управління конфігураціями в iOS: Scheme та .xcconfig

Управління конфігураціями в iOS будується на Scheme — конфігурації Xcode, яка визначає, що і як збирається: Build Configuration (Debug/Release), тести, аналіз, архівацію. Scheme можна дублювати для різних середовищ (Development, Staging, Production). Scheme зберігається в .xcscheme файлі в папці xcshareddata.

.xcconfig файли

.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 vs Build Configuration

Scheme — це сценарій збірки (що робити). Build Configuration — набір налаштувань (як робити). Один Scheme використовує одну Build Configuration (Debug або Release). Для CI-CD: налаштуйте Archive-дію на Release і Test-дію на Debug в одному Scheme.

Управління конфігураціями в Flutter та React Native: pubspec.yaml, Podfile, .env

pubspec.yaml — файл конфігурації Flutter-проєкту. Містить залежності, версії, ресурси. Підтримує environment змінні через --dart-define.

Podfile — менеджер залежностей CocoaPods для iOS. Визначає версії бібліотек та платформу.

.env — файл зі змінними оточення для всіх платформ. Flutter та React Native використовують інший підхід до управління конфігураціями: dart-define у Flutter, react-native-config у React Native. Управлінням конфігураціями в кроссплатформених проєктах займаються різні інструменти залежно від стеку.

.env та Environment Variables

.env — текстовий файл з парами ключ=значення. Не комітиться в Git (додайте в .gitignore). Для Flutter — flutter_dotenv, для iOS — Config.xcconfig з включенням через #include, для Android — BuildConfig. env-змінні: API_URL, SENTRY_DSN, APP_SECRET. В управлінні конфігураціями в мобільній розробці .env — стандарт де-факто для зберігання секретів поза репозиторієм.

Podfile та pubspec.yaml

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 VariantSchemeFlavor (--flavor)
Файл збіркиbuild.gradle.xcconfigpubspec.yaml
Умовний кодBuildConfigActive Compilation Conditionsdart-define
СекретиBuildConfig/NDK.xcconfig.env/dart-define
Менеджер залежностейGradle (Maven)SPM/CocoaPodspub (dart)

Таблиця показує ключові відмінності в управлінні конфігураціями між мобільними платформами. Android дає більше гнучкості через Build Variant. iOS — простіший, але менш гнучкий. Flutter централізує конфігурацію в dart-define, але для нативних залежностей все одно потрібно налаштовувати Podfile/build.gradle.

Conditional Compilation в управлінні конфігураціями

Conditional Compilation — включення або виключення коду на етапі компіляції залежно від прапорців. Це частина управління конфігураціями: вона дозволяє вбудовувати налагоджувальні інструменти (логування, інспектор) у debug-збірку та вирізати їх з release. Реалізація відрізняється на різних платформах.

Conditional Compilation в Swift

#if DEBUG — директива препроцесора Swift. Код всередині блоку компілюється тільки в Debug-конфігурації. Інші прапорці: #if !RELEASE, #if targetEnvironment(simulator). Active Compilation Conditions в Build Settings — додавайте свої прапорці через -D FLAG_NAME. Управління конфігураціями збірки через умови компіляції — стандартна практика в iOS.

Conditional Compilation в Kotlin

BuildConfig.DEBUG — булеве поле, true в debug-збірці. BuildConfig генерується Gradle автоматично. Для кастомних прапорців використовуйте buildConfigField в build.gradle: buildConfigField "boolean", "REPORT_CRASHES", "true". У коді: if (BuildConfig.REPORT_CRASHES) { ... }.

Conditional Compilation в Flutter

dart-define — прапорці компіляції Flutter: flutter run --dart-define=ENV=staging. У коді: const env = String.fromEnvironment('ENV', defaultValue: 'production'). Для умовної збірки мобільних застосунків використовуйте плагін build_runner з генерацією коду.

Часто задавані питання

Чим Build Variant відрізняється від Product Flavor в Android?

Build Variant = Build Type (debug/release) + Product Flavor. Flavor — це варіант застосунку (платний/безкоштовний, клієнтський/серверний), Build Type — налаштування збірки (налагодження/оптимізація). Комбінація flavour + type утворює variant: наприклад, paidDebug.

Що таке .xcconfig і навіщо він потрібен в iOS?

.xcconfig — це файл конфігурації Xcode, який зберігає build settings у текстовому вигляді. Він дозволяє винести налаштування з Xcode проєкту в Git-friendly файли, спрощуючи CI/CD та командну роботу в мобільних проєктах.

Як безпечно зберігати API-ключі в мобільному застосунку?

API-ключі не можна зберігати в коді — будь-який .apk або .ipa можна декомпілювати. Використовуйте .env файли, backend proxy або обфускацію через Build Config. IT Sectr рекомендує зберігати секрети на сервері та видавати їх клієнту після авторизації.

Що таке Conditional Compilation і коли її використовувати?

Conditional Compilation — це включення/виключення коду на етапі компіляції залежно від прапорців. В Swift — #if DEBUG, в Kotlin — BuildConfig.DEBUG. Використовується для включення логування в debug та відключення в release. Це ключовий елемент управління конфігураціями в мобільній розробці.

Чи потрібен Podfile в проєкті без CocoaPods?

Podfile використовується тільки при роботі з CocoaPods. Для SPM або Carthage він не потрібен. Не залишайте Podfile в проєкті, якщо ви відмовилися від CocoaPods — це заплутує команду та CI/CD систему.

Підсумки

  • Управління конфігураціями в мобільних застосунках — основа стабільного CI/CD. Android використовує Build Variant, iOS — Scheme, Flutter — dart-define.
  • Android: Build Variant = Build Type × Product Flavor. BuildConfig генерується для кожного variant.
  • iOS: Scheme + .xcconfig керують конфігурацією. Info.plist — метадані застосунку.
  • Flutter: dart-define для змінних збірки. pubspec.yaml для залежностей.
  • Conditional Compilation (#if DEBUG, BuildConfig.DEBUG) — частина управління конфігураціями, стандартний спосіб відключення debug-коду в release.
  • .env — безпечне зберігання секретів поза репозиторієм. Не комітьте .env в Git.
  • Управлінню конфігураціями в мобільних проєктах потрібно приділяти увагу з першого коміту — правильне налаштування збірок економить години налагодження на кожному релізі.

Ми розробимо мобільний застосунок під ключ

IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.

Обговорити проект