Zarządzanie konfiguracją to jeden z najbardziej niedocenianych aspektów rozwoju mobilnego. Według CloudBees (2025), 47% incydentów w produkcji jest związanych z nieprawidłowymi konfiguracjami kompilacji. Prawidłowe skonfigurowanie Build Variant, Scheme i plików .env to klucz do stabilnego CI/CD i przewidywalnych wydań.
Najważniejsze punkty
Build Variant — kombinacja Build Type (debug/release/staging) i Product Flavor (free/paid, demo/full). Gradle automatycznie tworzy variant dla każdej kombinacji: freeDebug, freeRelease, paidDebug, paidRelease. Każdy variant może mieć własny kod, zasoby i zależności — to podstawa zarządzania konfiguracją w aplikacjach mobilnych na Android.
Build Type — ustawienia kompilacji: czy debugowanie jest włączone, podpisywanie, optymalizacja ProGuard. debug domyślnie zawiera debuggable=true, release — minifyEnabled=true.
Product Flavor — wariant aplikacji: darmowa (free), płatna (paid), demo. Flavory mogą mieć różne applicationId, zasoby, zależności SDK.
// build.gradle — konfiguracja flavorów produktu w 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')
}
}
}
Przykład tworzy dwa flavory: free i paid. Dla free ustawiono osobny applicationId — pozwala to zainstalować obie aplikacje na jednym urządzeniu. BuildConfig jest generowany dla każdego variant: BuildConfig.FLAVOR = "free", BuildConfig.BUILD_TYPE = "debug". Użyj BuildConfig w kodzie do logiki warunkowej.
settings.gradle — główny plik Gradle opisujący moduły projektu.
Gradle KTS — alternatywa dla Groovy używająca Kotlin DSL. KTS zapewnia autouzupełnianie w Android Studio i sprawdzanie typów. Zalecany dla nowych projektów.
Zarządzanie konfiguracją w iOS opiera się na Scheme — konfiguracji Xcode, która określa, co i jak kompilować: Build Configuration (Debug/Release), testy, analiza, archiwizacja. Scheme można duplikować dla różnych środowisk (Development, Staging, Production). Scheme są przechowywane w plikach .xcscheme w folderze xcshareddata.
.xcconfig — plik konfiguracyjny Xcode przechowujący ustawienia kompilacji w formie tekstowej. Do zarządzania konfiguracją aplikacji mobilnych iOS używa .xcconfig: versionowanie w Git, ponowne użycie między projektami, mniej ręcznych ustawień. W .xcconfig ustawiane są SWIFT_ACTIVE_COMPILATION_CONDITIONS, PRODUCT_BUNDLE_IDENTIFIER, CODE_SIGN_IDENTITY.
Info.plist — plik metadanych aplikacji. Przechowuje wersję, identyfikator, uprawnienia. Info.plist może być różny dla każdego Scheme — przez Info.plist File w Build Settings.
AndroidManifest.xml — odpowiednik w Android: przechowuje uprawnienia, komponenty, metadane.
Scheme — scenariusz kompilacji (co robić). Build Configuration — zestaw ustawień (jak robić). Jeden Scheme używa jednej Build Configuration (Debug lub Release). Dla CI/CD: skonfiguruj akcję Archive na Release i akcję Test na Debug w jednym Scheme.
pubspec.yaml — plik konfiguracyjny projektu Flutter. Zawiera zależności, wersje, zasoby. Obsługuje zmienne środowiskowe przez --dart-define.
Podfile — menedżer zależności CocoaPods dla iOS. Określa wersje bibliotek i platformę.
.env — plik ze zmiennymi środowiskowymi dla wszystkich platform. Flutter i React Native używają innego podejścia do zarządzania konfiguracją: dart-define w Flutter, react-native-config w React Native. Zarządzanie konfiguracją w projektach wieloplatformowych obejmuje różne narzędzia w zależności od stosu technologicznego.
.env — plik tekstowy z parami klucz=wartość. Nie commitowany do Git (dodaj do .gitignore). Dla Flutter — flutter_dotenv, dla iOS — Config.xcconfig z #include, dla Android — BuildConfig. Zmienne env: API_URL, SENTRY_DSN, APP_SECRET. W zarządzaniu konfiguracją w rozwoju mobilnym .env jest de facto standardem przechowywania sekretów poza repozytorium.
Podfile opisuje zależności CocoaPods i platformę (platform :ios, '15.0'). pubspec.yaml dla Flutter — dependencies i dev_dependencies. Oba obsługują zależności warunkowe: pod 'Analytics', :configs => ['Release'] lub flutter pub add --flavor free. W IT Sectr używamy .env + BuildConfig dla sekretów i Podfile dla natywnych zależności w projektach mobilnych.
| Parametr | Android | iOS | Flutter |
|---|---|---|---|
| Jednostka konfiguracji | Build Variant | Scheme | Flavor (--flavor) |
| Plik kompilacji | build.gradle | .xcconfig | pubspec.yaml |
| Kod warunkowy | BuildConfig | Active Compilation Conditions | dart-define |
| Sekrety | BuildConfig/NDK | .xcconfig | .env/dart-define |
| Menedżer zależności | Gradle (Maven) | SPM/CocoaPods | pub (dart) |
Tabela pokazuje kluczowe różnice w zarządzaniu konfiguracją między platformami mobilnymi. Android oferuje większą elastyczność przez Build Variant. iOS jest prostszy, ale mniej elastyczny. Flutter centralizuje konfigurację w dart-define, ale natywne zależności nadal wymagają konfiguracji Podfile/build.gradle.
Kompilacja warunkowa — włączanie lub wyłączanie kodu na etapie kompilacji w zależności od flag. To część zarządzania konfiguracją: pozwala osadzać narzędzia debugowania (logowanie, inspektor) w kompilacjach debug i usuwać je z release. Implementacja różni się między platformami.
#if DEBUG — dyrektywa preprocesora Swift. Kod wewnątrz bloku kompiluje się tylko w konfiguracji Debug. Inne flagi: #if !RELEASE, #if targetEnvironment(simulator). Active Compilation Conditions w Build Settings — dodawaj własne flagi przez -D FLAG_NAME. Zarządzanie konfiguracją kompilacji przez warunki kompilacji to standardowa praktyka w iOS.
BuildConfig.DEBUG — pole logiczne, true w kompilacji debug. BuildConfig jest generowany automatycznie przez Gradle. Dla własnych flag użyj buildConfigField w build.gradle: buildConfigField "boolean", "REPORT_CRASHES", "true". W kodzie: if (BuildConfig.REPORT_CRASHES) { ... }.
dart-define — flagi kompilacji Flutter: flutter run --dart-define=ENV=staging. W kodzie: const env = String.fromEnvironment('ENV', defaultValue: 'production'). Do warunkowych kompilacji aplikacji mobilnych użyj wtyczki build_runner z generowaniem kodu.
Często zadawane pytania
Build Variant = Build Type (debug/release) + Product Flavor. Flavor to wariant aplikacji (płatna/darmowa, klient/serwer), Build Type to ustawienia kompilacji (debugowanie/optymalizacja). Kombinacja flavour + type tworzy variant: na przykład paidDebug.
.xcconfig to plik konfiguracyjny Xcode przechowujący ustawienia kompilacji w formie tekstowej. Pozwala przenieść ustawienia z projektu Xcode do plików przyjaznych Git, upraszczając CI/CD i pracę zespołową w projektach mobilnych.
Klucze API nie mogą być przechowywane w kodzie — każdy .apk lub .ipa można zdekompilować. Użyj plików .env, proxy backendowego lub zaciemniania przez Build Config. IT Sectr zaleca przechowywanie sekretów na serwerze i wydawanie ich klientowi po uwierzytelnieniu.
Kompilacja warunkowa to włączanie/wyłączanie kodu na etapie kompilacji w zależności od flag. W Swift — #if DEBUG, w Kotlin — BuildConfig.DEBUG. Używana do włączania logowania w debug i wyłączania w release. To kluczowy element zarządzania konfiguracją w rozwoju mobilnym.
Podfile jest używany tylko podczas pracy z CocoaPods. Nie jest potrzebny dla SPM lub Carthage. Nie zostawiaj Podfile w projekcie, jeśli zrezygnowałeś z CocoaPods — dezorientuje to zespół i system CI/CD.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.