La gestione delle configurazioni è uno degli aspetti più sottovalutati dello sviluppo mobile. Secondo CloudBees (2025), il 47% degli incidenti in produzione è correlato a configurazioni di build errate. La corretta configurazione di Build Variant, Scheme e file .env è la chiave per un CI/CD stabile e rilasci prevedibili.
Punti chiave
Build Variant — una combinazione di Build Type (debug/release/staging) e Product Flavor (free/paid, demo/full). Gradle crea automaticamente un variant per ogni combinazione: freeDebug, freeRelease, paidDebug, paidRelease. Ogni variant può avere il proprio codice, risorse e dipendenze — questa è la base della gestione delle configurazioni nelle app mobili su Android.
Build Type — impostazioni di build: se il debug è abilitato, firma, ottimizzazione ProGuard. debug per impostazione predefinita contiene debuggable=true, release — minifyEnabled=true.
Product Flavor — variante dell'app: gratuita (free), a pagamento (paid), demo. I flavor possono avere diversi applicationId, risorse e dipendenze SDK.
// build.gradle — configurazione dei flavor di prodotto in 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')
}
}
}
L'esempio crea due flavor: free e paid. Un applicationId separato è impostato per free — questo consente di installare entrambe le app su un unico dispositivo. BuildConfig viene generato per ogni variant: BuildConfig.FLAVOR = "free", BuildConfig.BUILD_TYPE = "debug". Utilizza BuildConfig nel codice per la logica condizionale.
settings.gradle — il file Gradle radice che descrive i moduli del progetto.
Gradle KTS — un'alternativa a Groovy che utilizza Kotlin DSL. KTS fornisce il completamento automatico in Android Studio e il controllo dei tipi. Consigliato per nuovi progetti.
La gestione delle configurazioni in iOS si basa su Scheme — una configurazione Xcode che definisce cosa e come compilare: Build Configuration (Debug/Release), test, analisi, archiviazione. Gli scheme possono essere duplicati per diversi ambienti (Development, Staging, Production). Gli scheme sono memorizzati in file .xcscheme nella cartella xcshareddata.
.xcconfig — un file di configurazione Xcode che memorizza le impostazioni di build in formato testuale. Per la gestione delle configurazioni delle app mobili, iOS utilizza .xcconfig: versionamento in Git, riutilizzo tra progetti, meno impostazioni manuali. In .xcconfig vengono impostati SWIFT_ACTIVE_COMPILATION_CONDITIONS, PRODUCT_BUNDLE_IDENTIFIER, CODE_SIGN_IDENTITY.
Info.plist — il file dei metadati dell'app. Memorizza la versione, l'identificatore, i permessi. Info.plist può essere diverso per ogni Scheme — tramite Info.plist File in Build Settings.
AndroidManifest.xml — l'equivalente Android: memorizza permessi, componenti, metadati.
Scheme — lo scenario di build (cosa fare). Build Configuration — l'insieme di impostazioni (come fare). Un Scheme utilizza una Build Configuration (Debug o Release). Per CI/CD: configura l'azione Archive su Release e l'azione Test su Debug in un unico Scheme.
pubspec.yaml — il file di configurazione del progetto Flutter. Contiene dipendenze, versioni, risorse. Supporta le variabili d'ambiente tramite --dart-define.
Podfile — il gestore di dipendenze CocoaPods per iOS. Definisce le versioni delle librerie e la piattaforma.
.env — un file con variabili d'ambiente per tutte le piattaforme. Flutter e React Native utilizzano un approccio diverso per la gestione delle configurazioni: dart-define in Flutter, react-native-config in React Native. La gestione delle configurazioni nei progetti cross-platform coinvolge diversi strumenti a seconda dello stack.
.env — un file di testo con coppie chiave=valore. Non viene committato in Git (aggiungi a .gitignore). Per Flutter — flutter_dotenv, per iOS — Config.xcconfig con #include, per Android — BuildConfig. Variabili env: API_URL, SENTRY_DSN, APP_SECRET. Nella gestione delle configurazioni nello sviluppo mobile, .env è lo standard de facto per memorizzare i segreti fuori dal repository.
Podfile descrive le dipendenze CocoaPods e la piattaforma (platform :ios, '15.0'). pubspec.yaml per Flutter — dependencies e dev_dependencies. Entrambi supportano dipendenze condizionali: pod 'Analytics', :configs => ['Release'] o flutter pub add --flavor free. In IT Sectr, utilizziamo .env + BuildConfig per i segreti e Podfile per le dipendenze native nei progetti mobili.
| Parametro | Android | iOS | Flutter |
|---|---|---|---|
| Unità di configurazione | Build Variant | Scheme | Flavor (--flavor) |
| File di build | build.gradle | .xcconfig | pubspec.yaml |
| Codice condizionale | BuildConfig | Active Compilation Conditions | dart-define |
| Segreti | BuildConfig/NDK | .xcconfig | .env/dart-define |
| Gestore dipendenze | Gradle (Maven) | SPM/CocoaPods | pub (dart) |
La tabella mostra le principali differenze nella gestione delle configurazioni tra le piattaforme mobili. Android offre maggiore flessibilità attraverso Build Variant. iOS è più semplice ma meno flessibile. Flutter centralizza la configurazione in dart-define, ma le dipendenze native richiedono comunque la configurazione di Podfile/build.gradle.
Compilazione condizionale — inclusione o esclusione di codice in fase di compilazione in base a flag. Questo fa parte della gestione delle configurazioni: permette di incorporare strumenti di debug (logging, ispettore) nelle build debug e rimuoverli dalla release. L'implementazione differisce tra le piattaforme.
#if DEBUG — direttiva del preprocessore Swift. Il codice all'interno del blocco viene compilato solo nella configurazione Debug. Altri flag: #if !RELEASE, #if targetEnvironment(simulator). Active Compilation Conditions in Build Settings — aggiungi i tuoi flag personalizzati tramite -D FLAG_NAME. La gestione delle configurazioni di build tramite condizioni di compilazione è una pratica standard in iOS.
BuildConfig.DEBUG — campo booleano, true nella build debug. BuildConfig viene generato automaticamente da Gradle. Per flag personalizzati utilizza buildConfigField in build.gradle: buildConfigField "boolean", "REPORT_CRASHES", "true". Nel codice: if (BuildConfig.REPORT_CRASHES) { ... }.
dart-define — flag di compilazione Flutter: flutter run --dart-define=ENV=staging. Nel codice: const env = String.fromEnvironment('ENV', defaultValue: 'production'). Per build condizionali di app mobili, utilizza il plugin build_runner con generazione di codice.
Domande frequenti
Build Variant = Build Type (debug/release) + Product Flavor. Flavor è la variante dell'app (a pagamento/gratuita, client/server), Build Type sono le impostazioni di build (debug/ottimizzazione). La combinazione flavour + type forma un variant: per esempio, paidDebug.
.xcconfig è un file di configurazione Xcode che memorizza le impostazioni di build in formato testuale. Permette di spostare le impostazioni dal progetto Xcode a file compatibili con Git, semplificando il CI/CD e il lavoro di squadra nei progetti mobili.
Le chiavi API non devono essere memorizzate nel codice — qualsiasi .apk o .ipa può essere decompilato. Utilizza file .env, un proxy backend o offuscamento tramite Build Config. IT Sectr raccomanda di memorizzare i segreti sul server e rilasciarli al client dopo l'autenticazione.
La compilazione condizionale consiste nell'includere/escludere codice in fase di compilazione in base a flag. In Swift — #if DEBUG, in Kotlin — BuildConfig.DEBUG. Utilizzata per abilitare il logging in debug e disabilitarlo in release. Questo è un elemento chiave della gestione delle configurazioni nello sviluppo mobile.
Podfile viene utilizzato solo quando si lavora con CocoaPods. Non è necessario per SPM o Carthage. Non lasciare Podfile in un progetto se hai abbandonato CocoaPods — confonde il team e il sistema CI/CD.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.