O gerenciamento de configurações é um dos aspectos mais subestimados do desenvolvimento móvel. De acordo com a CloudBees (2025), 47% dos incidentes em produção estão relacionados a configurações de build incorretas. A configuração adequada de Build Variant, Scheme e arquivos .env é a chave para um CI/CD estável e lançamentos previsíveis.
Principais pontos
Build Variant — uma combinação de Build Type (debug/release/staging) e Product Flavor (free/paid, demo/full). O Gradle cria automaticamente um variant para cada combinação: freeDebug, freeRelease, paidDebug, paidRelease. Cada variant pode ter seu próprio código, recursos e dependências — esta é a base do gerenciamento de configurações em aplicativos móveis no Android.
Build Type — configurações de build: se a depuração está habilitada, assinatura, otimização ProGuard. debug por padrão contém debuggable=true, release — minifyEnabled=true.
Product Flavor — variante do aplicativo: gratuito (free), pago (paid), demo. Os flavors podem ter diferentes applicationId, recursos e dependências de SDK.
// build.gradle — configuração de flavors de produto no 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')
}
}
}
O exemplo cria dois flavors: free e paid. Um applicationId separado é definido para free — isso permite instalar ambos os aplicativos em um dispositivo. BuildConfig é gerado para cada variant: BuildConfig.FLAVOR = "free", BuildConfig.BUILD_TYPE = "debug". Use BuildConfig no código para lógica condicional.
settings.gradle — o arquivo Gradle raiz que descreve os módulos do projeto.
Gradle KTS — uma alternativa ao Groovy usando Kotlin DSL. O KTS fornece autocompletar no Android Studio e verificação de tipos. Recomendado para novos projetos.
O gerenciamento de configurações no iOS é baseado em Scheme — uma configuração do Xcode que define o que e como compilar: Build Configuration (Debug/Release), testes, análise, arquivamento. Os schemes podem ser duplicados para diferentes ambientes (Development, Staging, Production). Os schemes são armazenados em arquivos .xcscheme na pasta xcshareddata.
.xcconfig — um arquivo de configuração do Xcode que armazena as configurações de build em formato de texto. Para o gerenciamento de configurações em aplicativos móveis, o iOS usa .xcconfig: versionamento no Git, reutilização entre projetos, menos configurações manuais. No .xcconfig são definidos SWIFT_ACTIVE_COMPILATION_CONDITIONS, PRODUCT_BUNDLE_IDENTIFIER, CODE_SIGN_IDENTITY.
Info.plist — o arquivo de metadados do aplicativo. Armazena a versão, o identificador, as permissões. O Info.plist pode ser diferente para cada Scheme — através de Info.plist File em Build Settings.
AndroidManifest.xml — o equivalente no Android: armazena permissões, componentes, metadados.
Scheme — o cenário de build (o que fazer). Build Configuration — o conjunto de configurações (como fazer). Um Scheme usa uma Build Configuration (Debug ou Release). Para CI/CD: configure a ação Archive para Release e a ação Test para Debug em um mesmo Scheme.
pubspec.yaml — o arquivo de configuração do projeto Flutter. Contém dependências, versões, recursos. Suporta variáveis de ambiente através de --dart-define.
Podfile — o gerenciador de dependências CocoaPods para iOS. Define as versões das bibliotecas e a plataforma.
.env — um arquivo com variáveis de ambiente para todas as plataformas. Flutter e React Native usam uma abordagem diferente para o gerenciamento de configurações: dart-define no Flutter, react-native-config no React Native. O gerenciamento de configurações em projetos multiplataforma envolve diferentes ferramentas dependendo da stack.
.env — um arquivo de texto com pares chave=valor. Não é commitado no Git (adicione ao .gitignore). Para Flutter — flutter_dotenv, para iOS — Config.xcconfig com #include, para Android — BuildConfig. Variáveis env: API_URL, SENTRY_DSN, APP_SECRET. No gerenciamento de configurações no desenvolvimento móvel, .env é o padrão de facto para armazenar segredos fora do repositório.
O Podfile descreve as dependências do CocoaPods e a plataforma (platform :ios, '15.0'). O pubspec.yaml para Flutter — dependencies e dev_dependencies. Ambos suportam dependências condicionais: pod 'Analytics', :configs => ['Release'] ou flutter pub add --flavor free. Na IT Sectr, usamos .env + BuildConfig para segredos e Podfile para dependências nativas em projetos móveis.
| Parâmetro | Android | iOS | Flutter |
|---|---|---|---|
| Unidade de configuração | Build Variant | Scheme | Flavor (--flavor) |
| Arquivo de build | build.gradle | .xcconfig | pubspec.yaml |
| Código condicional | BuildConfig | Active Compilation Conditions | dart-define |
| Segredos | BuildConfig/NDK | .xcconfig | .env/dart-define |
| Gerenciador de dependências | Gradle (Maven) | SPM/CocoaPods | pub (dart) |
A tabela mostra as principais diferenças no gerenciamento de configurações entre plataformas móveis. O Android oferece mais flexibilidade através do Build Variant. O iOS é mais simples, mas menos flexível. O Flutter centraliza a configuração no dart-define, mas as dependências nativas ainda exigem a configuração do Podfile/build.gradle.
Compilação condicional — inclusão ou exclusão de código em tempo de compilação dependendo de flags. Isso faz parte do gerenciamento de configurações: permite incorporar ferramentas de depuração (logging, inspetor) em builds debug e removê-las do release. A implementação difere entre plataformas.
#if DEBUG — diretiva de pré-processador do Swift. O código dentro do bloco compila apenas na configuração Debug. Outras flags: #if !RELEASE, #if targetEnvironment(simulator). Active Compilation Conditions em Build Settings — adicione suas flags personalizadas através de -D FLAG_NAME. O gerenciamento de configurações de build através de condições de compilação é prática padrão no iOS.
BuildConfig.DEBUG — campo booleano, true em build debug. O BuildConfig é gerado automaticamente pelo Gradle. Para flags personalizadas use buildConfigField no build.gradle: buildConfigField "boolean", "REPORT_CRASHES", "true". No código: if (BuildConfig.REPORT_CRASHES) { ... }.
dart-define — flags de compilação do Flutter: flutter run --dart-define=ENV=staging. No código: const env = String.fromEnvironment('ENV', defaultValue: 'production'). Para compilações condicionais de aplicativos móveis, use o plugin build_runner com geração de código.
Perguntas frequentes
Build Variant = Build Type (debug/release) + Product Flavor. Flavor é a variante do aplicativo (pago/gratuito, cliente/servidor), Build Type são as configurações de build (depuração/otimização). A combinação de flavour + type forma um variant: por exemplo, paidDebug.
.xcconfig é um arquivo de configuração do Xcode que armazena as configurações de build em formato de texto. Ele permite mover as configurações do projeto Xcode para arquivos compatíveis com Git, simplificando o CI/CD e o trabalho em equipe em projetos móveis.
As chaves de API não devem ser armazenadas no código — qualquer .apk ou .ipa pode ser descompilado. Use arquivos .env, um proxy de backend ou ofuscação através do Build Config. A IT Sectr recomenda armazenar segredos no servidor e fornecê-los ao cliente após a autenticação.
Compilação condicional é incluir/excluir código em tempo de compilação dependendo de flags. Em Swift — #if DEBUG, em Kotlin — BuildConfig.DEBUG. Usada para habilitar o logging em debug e desabilitá-lo em release. Este é um elemento chave do gerenciamento de configurações no desenvolvimento móvel.
Podfile é usado apenas ao trabalhar com CocoaPods. Não é necessário para SPM ou Carthage. Não deixe o Podfile em um projeto se você abandonou o CocoaPods — isso confunde a equipe e o sistema CI/CD.
Resumo
Vamos desenvolver um aplicativo móvel chave na mão
A IT Sectr cria aplicativos para iOS e Android para startups e empresas desde 2017. Nós vamos aconselhá-lo e propor a melhor solução.