Gestionarea configurațiilor este unul dintre cele mai subestimate aspecte ale dezvoltării mobile. Potrivit CloudBees (2025), 47% din incidentele din producție sunt legate de configurații de build incorecte. Configurarea corectă a Build Variant, Scheme și fișierelor .env este cheia pentru un CI/CD stabil și lansări previzibile.
Puncte cheie
Build Variant — o combinație de Build Type (debug/release/staging) și Product Flavor (free/paid, demo/full). Gradle creează automat un variant pentru fiecare combinație: freeDebug, freeRelease, paidDebug, paidRelease. Fiecare variant poate avea propriul cod, resurse și dependențe — aceasta este baza gestionării configurațiilor în aplicațiile mobile pe Android.
Build Type — setări de build: dacă depanarea este activată, semnarea, optimizarea ProGuard. debug implicit conține debuggable=true, release — minifyEnabled=true.
Product Flavor — varianta aplicației: gratuită (free), plătită (paid), demo. Flavoururile pot avea diferite applicationId, resurse, dependențe SDK.
// build.gradle — configurarea flavoururilor de produs în 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')
}
}
}
Exemplul creează două flavoururi: free și paid. Un applicationId separat este setat pentru free — aceasta permite instalarea ambelor aplicații pe un singur dispozitiv. BuildConfig este generat pentru fiecare variant: BuildConfig.FLAVOR = "free", BuildConfig.BUILD_TYPE = "debug". Utilizați BuildConfig în cod pentru logică condițională.
settings.gradle — fișierul rădăcină Gradle care descrie modulele proiectului.
Gradle KTS — o alternativă la Groovy folosind Kotlin DSL. KTS oferă autocompletare în Android Studio și verificare de tipuri. Recomandat pentru proiecte noi.
Gestionarea configurațiilor în iOS se bazează pe Scheme — o configurație Xcode care definește ce și cum se compilează: Build Configuration (Debug/Release), teste, analiză, arhivare. Scheme-urile pot fi duplicate pentru diferite medii (Development, Staging, Production). Scheme-urile sunt stocate în fișiere .xcscheme în dosarul xcshareddata.
.xcconfig — un fișier de configurare Xcode care stochează setările de build în formă text. Pentru gestionarea configurațiilor aplicațiilor mobile, iOS utilizează .xcconfig: versionare în Git, reutilizare între proiecte, mai puține setări manuale. În .xcconfig se setează SWIFT_ACTIVE_COMPILATION_CONDITIONS, PRODUCT_BUNDLE_IDENTIFIER, CODE_SIGN_IDENTITY.
Info.plist — fișierul de metadate al aplicației. Stochează versiunea, identificatorul, permisiunile. Info.plist poate fi diferit pentru fiecare Scheme — prin Info.plist File în Build Settings.
AndroidManifest.xml — echivalentul pentru Android: stochează permisiuni, componente, metadate.
Scheme — scenariul de build (ce să faci). Build Configuration — setul de setări (cum să faci). Un Scheme utilizează o Build Configuration (Debug sau Release). Pentru CI/CD: configurați acțiunea Archive pe Release și acțiunea Test pe Debug în același Scheme.
pubspec.yaml — fișierul de configurare a proiectului Flutter. Conține dependențe, versiuni, resurse. Suportă variabile de mediu prin --dart-define.
Podfile — managerul de dependențe CocoaPods pentru iOS. Definește versiunile bibliotecilor și platforma.
.env — un fișier cu variabile de mediu pentru toate platformele. Flutter și React Native utilizează o abordare diferită pentru gestionarea configurațiilor: dart-define în Flutter, react-native-config în React Native. Gestionarea configurațiilor în proiecte multi-platformă implică diferite instrumente în funcție de stack.
.env — un fișier text cu perechi cheie=valoare. Nu se comitează în Git (adăugați la .gitignore). Pentru Flutter — flutter_dotenv, pentru iOS — Config.xcconfig cu #include, pentru Android — BuildConfig. Variabile env: API_URL, SENTRY_DSN, APP_SECRET. În gestionarea configurațiilor în dezvoltarea mobilă, .env este standardul de facto pentru stocarea secretelor în afara depozitului.
Podfile descrie dependențele CocoaPods și platforma (platform :ios, '15.0'). pubspec.yaml pentru Flutter — dependencies și dev_dependencies. Ambele suportă dependențe condiționale: pod 'Analytics', :configs => ['Release'] sau flutter pub add --flavor free. La IT Sectr, folosim .env + BuildConfig pentru secrete și Podfile pentru dependențe native în proiecte mobile.
| Parametru | Android | iOS | Flutter |
|---|---|---|---|
| Unitate de configurare | Build Variant | Scheme | Flavor (--flavor) |
| Fișier de build | build.gradle | .xcconfig | pubspec.yaml |
| Cod condițional | BuildConfig | Active Compilation Conditions | dart-define |
| Secrete | BuildConfig/NDK | .xcconfig | .env/dart-define |
| Manager de dependențe | Gradle (Maven) | SPM/CocoaPods | pub (dart) |
Tabelul arată diferențele cheie în gestionarea configurațiilor între platformele mobile. Android oferă mai multă flexibilitate prin Build Variant. iOS este mai simplu, dar mai puțin flexibil. Flutter centralizează configurația în dart-define, dar dependențele native necesită în continuare configurarea Podfile/build.gradle.
Compilare condițională — includerea sau excluderea codului la compilare în funcție de flaguri. Aceasta face parte din gestionarea configurațiilor: permite încorporarea instrumentelor de depanare (logare, inspector) în buildurile debug și eliminarea lor din release. Implementarea diferă între platforme.
#if DEBUG — directivă de preprocesor Swift. Codul din interiorul blocului se compilează doar în configurația Debug. Alte flaguri: #if !RELEASE, #if targetEnvironment(simulator). Active Compilation Conditions în Build Settings — adăugați flaguri personalizate prin -D FLAG_NAME. Gestionarea configurațiilor de build prin condiții de compilare este o practică standard în iOS.
BuildConfig.DEBUG — câmp boolean, true în buildul debug. BuildConfig este generat automat de Gradle. Pentru flaguri personalizate utilizați buildConfigField în build.gradle: buildConfigField "boolean", "REPORT_CRASHES", "true". În cod: if (BuildConfig.REPORT_CRASHES) { ... }.
dart-define — flaguri de compilare Flutter: flutter run --dart-define=ENV=staging. În cod: const env = String.fromEnvironment('ENV', defaultValue: 'production'). Pentru builduri condiționale de aplicații mobile, utilizați pluginul build_runner cu generare de cod.
Întrebări frecvente
Build Variant = Build Type (debug/release) + Product Flavor. Flavor este varianta aplicației (plătită/gratuită, client/server), Build Type sunt setările de build (depanare/optimizare). Combinația flavour + type formează un variant: de exemplu, paidDebug.
.xcconfig este un fișier de configurare Xcode care stochează setările de build în formă text. Permite mutarea setărilor din proiectul Xcode în fișiere compatibile Git, simplificând CI/CD și munca în echipă în proiecte mobile.
Cheile API nu pot fi stocate în cod — orice .apk sau .ipa poate fi decompilat. Utilizați fișiere .env, un proxy backend sau ofuscare prin Build Config. IT Sectr recomandă stocarea secretelor pe server și eliberarea lor clientului după autentificare.
Compilarea condițională constă în includerea/excluderea codului la compilare în funcție de flaguri. În Swift — #if DEBUG, în Kotlin — BuildConfig.DEBUG. Se utilizează pentru a activa logarea în debug și a o dezactiva în release. Acesta este un element cheie al gestionării configurațiilor în dezvoltarea mobilă.
Podfile este utilizat doar când se lucrează cu CocoaPods. Nu este necesar pentru SPM sau Carthage. Nu lăsați Podfile într-un proiect dacă ați renunțat la CocoaPods — confundă echipa și sistemul CI/CD.
Rezumat
Vom dezvolta o aplicație mobilă la cheie
IT Sectr creează aplicații iOS și Android pentru startup-uri și afaceri din 2017. Vă vom consilia și vă vom propune cea mai bună soluție.