Управлението на конфигурации е един от най-подценяваните аспекти на мобилната разработка. Според CloudBees (2025), 47% от инцидентите в продукция са свързани с неправилни конфигурации на компилация. Правилната настройка на 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 — конфигурация на product flavour в 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, който съхранява настройките за компилация в текстов вид. За управление на конфигурации в мобилно приложение 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 проект. Съдържа зависимости, версии, ресурси. Поддържа променливи на средата чрез --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. И двата поддържат условни зависимости: 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.
Условна компилация — включване или изключване на код на етапа на компилация в зависимост от флагове. Това е част от управлението на конфигурации: позволява вграждане на инструменти за отстраняване на грешки (логване, инспектор) в 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, който съхранява настройките за компилация в текстов вид. Той позволява изнасяне на настройките от Xcode проекта в Git-friendly файлове, опростявайки CI/CD и екипната работа в мобилни проекти.
API ключове не трябва да се съхраняват в кода — всеки .apk или .ipa може да бъде декомпилиран. Използвайте .env файлове, backend proxy или обфускация чрез Build Config. IT Sectr препоръчва съхраняване на тайните на сървъра и издаването им на клиента след авторизация.
Условна компилация е включване/изключване на код на етапа на компилация в зависимост от флагове. В Swift — #if DEBUG, в Kotlin — BuildConfig.DEBUG. Използва се за включване на логване в debug и изключване в release. Това е ключов елемент от управлението на конфигурации в мобилната разработка.
Podfile се използва само при работа с CocoaPods. За SPM или Carthage не е необходим. Не оставяйте Podfile в проекта, ако сте се отказали от CocoaPods — това обърква екипа и CI/CD системата.
Обобщение
Ще разработим мобилно приложение под ключ
IT Sectr създава iOS и Android приложения за стартъпи и бизнеси от 2017 г. Ще ви консултираме и ще предложим най-доброто решение.