Ang mga variable ng kapaligiran ay mga dynamic na halaga na ipinapasa sa application sa pagsisimula upang i-configure ang pag-uugali nito nang hindi binabago ang code. Pinapayagan nila ang paghihiwalay ng mga configuration ng development, testing, at production. Ayon sa Twelve-Factor App, 2025, ang configuration ay dapat na naka-imbak sa mga variable ng kapaligiran, hindi sa code. Mga variable ng kapaligiran ay nagsisiguro ng ligtas na pamamahala ng mga API key, backend URL, at feature flag.
Mga Pangunahing Punto
Ang mga variable ng kapaligiran ay isang pares ng key-value, na naa-access sa proseso ng application sa pamamagitan ng API ng operating system. Ang mga ito ay ipinapasa sa proseso kapag ito ay nilikha at umiiral lamang habang ito ay tumatakbo. Hindi tulad ng mga parameter ng configuration na naka-embed sa source code, ang mga variable ng kapaligiran ay hindi nangangailangan ng recompilation upang baguhin ang mga halaga. Ito ay isang pangunahing prinsipyo ng Twelve-Factor App na nagsisiguro ng malinaw na paghihiwalay sa pagitan ng code at configuration.
Sa mobile development, ang mga variable ng kapaligiran ay lumulutas sa problema ng iba’t ibang configuration para sa mga environment: ang developer ay gumagamit ng lokal na server, ang tester ay gumagamit ng staging, ang mga user ay gumagamit ng production. Sa halip na mag-imbak ng tatlong backend URL sa code na may if-else conditional operators, ang developer ay nagpapasa ng isang URL sa pamamagitan ng isang variable ng kapaligiran sa yugto ng build. Pinapasimple nito ang code at inaalis ang panganib ng hindi sinasadyang paggamit ng production server sa testing environment.
Ang pangunahing bentahe ay seguridad: ang sensitibong data ay hindi napupunta sa repository ng code. Ang mga API key, Firebase secret, backend access token, at certificate ay ikinakarga sa pamamagitan ng CI/CD nang direkta sa build environment. Kung ang isang attacker ay makakuha ng access sa code repository, hindi siya makakahanap ng mga secret doon, dahil ang mga ito ay naka-imbak sa protektadong storage ng CI system at ipinapasa lamang sa yugto ng pagbuo ng binary file.
Ang mga mobile project ay may hindi bababa sa tatlong environment: development, staging, at production. Ang bawat environment ay nangangailangan ng sarili nitong set ng configuration: server URL, package name, signing scheme, at push notification certificate. Kung walang mga variable ng kapaligiran, ang developer ay kailangang manu-manong baguhin ang configuration bago ang bawat build, na humahantong sa mga error: ang isang nakalimutang production key sa isang test build ay maaaring magdulot ng pagpapadala ng mga notification sa mga totoong user o pagkonsumo ng may bayad na API.
Ang mga variable ng kapaligiran ay nagpapahintulot sa paglipat ng backend nang hindi binabago ang code: sapat na upang palitan ang halaga sa variable na API_BASE_URL. Ang mga feature flag ay pinamamahalaan sa pamamagitan ng mga variable tulad ng FEATURE_CHAT_ENABLED=true, na nagpapahintulot sa pag-activate ng mga bagong feature sa staging nang walang epekto sa production. Para sa bawat environment, isang sariling .env file ang ginagawa na ikinakarga sa yugto ng build.
class AppConfig {
static final String apiBaseUrl =
const String.fromEnvironment('API_BASE_URL',
defaultValue: 'http://localhost:8080');
}
Ang mga hard-coded na key ay isang karaniwang kahinaan ng mga mobile application. Ang isang attacker ay nagde-decompile ng APK o IPA gamit ang mga tool tulad ng jadx o Hopper at kumukuha ng mga secret mula sa binary file. Kahit ang obfuscation ay hindi pinoprotektahan ang mga string literal — madali silang matagpuan sa code pagkatapos ng decompilation. Ang mga variable ng kapaligiran ay lumulutas sa problemang ito, na nagpapasa ng mga key sa yugto ng build sa pamamagitan ng CI/CD, kung saan ang mga ito ay natatakpan sa mga log.
object Config {
val apiKey: String =
System.getenv("API_KEY") ?: throw
IllegalStateException("API_KEY not set")
}
Ang mga variable ng kapaligiran ay isinasama sa mga build pipeline: GitHub Actions, GitLab CI, Bitrise at CircleCI ay sumusuporta sa lihim na mga variable na hindi ipinapakita sa mga log. Sa yugto ng build, ang CI ay naglalagay ng mga naaangkop na halaga depende sa branch o tag: para sa develop branch ay ginagamit ang staging, para sa v* tag ay ginagamit ang production. Awtomatiko nito ang proseso at inaalis ang human factor, na tinitiyak na ang bawat build ay tumatanggap ng tamang set ng configuration.
Ang .env file ay ang karaniwang paraan ng pag-iimbak ng mga variable ng kapaligiran sa KEY=VALUE format. Hindi ito kasama sa repository, sa halip ay idinaragdag ang .env.example na may template ng lahat ng variable at walang laman na halaga sa repository. Bawat developer ay gumagawa ng sarili niyang .env file na may lokal na setting, nang hindi naaapektuhan ang configuration ng ibang miyembro ng team. Para sa iba’t ibang environment, ginagamit ang magkakahiwalay na file: .env.dev, .env.stage, .env.prod.
# .env.example — template para sa mga developer
API_BASE_URL=http://localhost:8080
FEATURE_CHAT_ENABLED=true
SENTRY_DSN=
Para sa mga mobile project, may mga espesyalisadong library para sa pagtatrabaho sa mga .env file:
Ang mga setting ng branch sa CI/CD ay nagpapahintulot sa pagpasok ng iba’t ibang .env file: .env.dev para sa mga test server, .env.stage para sa pre-release, at .env.prod para sa publikasyon sa mga app store. Ang mga file na may mga secret ay ikinakarga mula sa secure na imbakan (Vault, AWS Secrets Manager) at hindi naka-imbak sa repository. Tinitiyak nito na kahit na ang version control system ay nakompromiso, ang mga secret ay nananatiling protektado.
Ang iOS ecosystem ay gumagamit ng xcconfig file para sa pamamahala ng mga variable sa antas ng build. Ang mga ito ay kumokonekta sa mga Xcode scheme at nagpapahintulot sa pag-override ng mga halaga para sa Debug at Release configuration. Ang mga xcconfig file ay sumusuporta sa inheritance: isang base file na may karaniwang setting at tiyak na mga file para sa bawat environment ay maaaring gawin.
Ang mga xcconfig file ay nag-iimbak ng mga variable sa KEY = VALUE format at kumokonekta sa build scheme sa Xcode sa pamamagitan ng Configuration setting. Ang mga variable mula sa xcconfig ay naa-access sa Info.plist sa pamamagitan ng syntax $(VARIABLE_NAME), na nagpapahintulot sa paggamit ng iba’t ibang bundle identifier at app name para sa iba’t ibang scheme. Para sa mabilis na pagkilala ng environment, isang Dev o Staging suffix ay idinadagdag sa pangalan ng app.
# Config/Dev.xcconfig — configuration ng development
API_BASE_URL = http://localhost:3000
BUNDLE_ID_SUFFIX = .dev
APP_DISPLAY_NAME = MyApp Dev
Para sa runtime access sa mga variable sa iOS, ginagamit ang Configuration.swift file, na nagbabasa ng mga halaga mula sa Info.plist sa pamamagitan ng Bundle.main.object(forInfoDictionaryKey:). Ang approach na ito ay nagsisiguro na ang mga variable ay tinutukoy sa yugto ng build at agad na available sa application pagkatapos ng startup. Ang mga halaga ay binabasa nang isang beses sa initialization ng module at naka-cache para sa mabilis na access sa buong lifecycle ng application.
enum AppEnvironment {
static var apiBaseURL: URL {
guard let urlString = Bundle.main
.object(forInfoDictionaryKey: "API_BASE_URL"),
let url = URL(string: urlString as! String)
else { fatalError("API_BASE_URL is not configured") }
return url
}
static var isChatEnabled: Bool {
Bundle.main.object(
forInfoDictionaryKey: "FEATURE_CHAT_ENABLED"
) as? Bool ?? false
}
}
Ang Android ay sumusuporta sa mga variable ng kapaligiran sa pamamagitan ng BuildConfig — isang awtomatikong nabubuong klase na ang mga field ay tinutukoy sa build.gradle file ng module. Ang BuildConfig ay nilikha sa yugto ng compilation para sa bawat flavor at build type nang hiwalay. Ito ay nagpapahintulot ng iba’t ibang halaga para sa debug at release nang hindi gumagamit ng conditional operators sa code, na nagpapataas ng performance at seguridad.
Ang mga BuildConfig field ay itinatakda sa pamamagitan ng buildConfigField sa defaultConfig o sa mga tiyak na buildTypes. Para sa bawat environment, isang hiwalay na buildType o productFlavor ay nilikha. Tinitiyak nito ang mahigpit na paghihiwalay ng mga configuration: debug ay gumagamit ng lokal na server, release ay gumagamit ng production. Ang mga BuildConfig field ay statically typed, na nag-aalis ng mga error kapag tinutukoy ang mga ito sa code.
// build.gradle (Module: app)
android {
defaultConfig {
buildConfigField "String", "API_BASE_URL",
"\"http://localhost:8080\""
}
buildTypes {
debug {
buildConfigField "String", "API_BASE_URL",
"\"http://dev.api.itsectr.com\""
}
release {
buildConfigField "String", "API_BASE_URL",
"\"https://api.itsectr.com\""
}
}
}
Ang gradle.properties file sa root ng proyekto ay nag-iimbak ng mga global Gradle variable. Ang mga ito ay naa-access sa lahat ng module sa pamamagitan ng syntax $variableName at ginagamit para sa pagtukoy ng mga dependency version, build flag, at API key. Hindi tulad ng BuildConfig, ang gradle.properties ay gumagana lamang sa yugto ng Gradle configuration, hindi sa runtime ng application. Samakatuwid, ang mga password at API key na tinukoy sa gradle.properties ay hindi nakikita sa na-decompile na code, dahil ang mga ito ay ginagamit lamang para sa pagbuo ng BuildConfig sa yugto ng compilation.
# gradle.properties
SENTRY_DSN=https://key@sentry.io/project
MAPS_API_KEY=AIzaSy...
Para sa ligtas na pagpapadala ng mga secret sa Android project, inirerekomenda ang paggamit ng local.properties (hindi kasama sa VCS) o pag-load ng mga halaga mula sa CI/CD variable sa build.gradle sa pamamagitan ng System.getenv(). Tinitiyak nito na ang mga key ay hindi mapupunta sa repository. Kapag nag-publish sa Google Play Console, siguraduhin na ang lahat ng debug key ay napalitan ng mga production version sa pamamagitan ng iba’t ibang buildTypes o productFlavors na may kaukulang BuildConfig values.
Mga Madalas Itanong
Oo, sinusuportahan ng Flutter ang mga variable ng kapaligiran sa pamamagitan ng flutter_dotenv package para sa runtime access o sa pamamagitan ng native channels para sa platform variable. Sa Dart, available din ang constructor String.fromEnvironment para sa pagpapasa ng mga halaga sa yugto ng compilation sa pamamagitan ng --dart-define, na siyang mas gustong paraan para sa mga Flutter project.
BuildConfig ay isang Java class na may naka-type na field, nabuo sa yugto ng compilation para sa bawat buildType at flavor. gradle.properties ay isang text file na may key-value pairs, accessible sa lahat ng Gradle module sa yugto ng build configuration. Ang BuildConfig ay gumagana sa runtime ng application, gradle.properties — lamang sa Gradle scripts.
Idagdag ang .env sa .gitignore file ng iyong repository. Mag-commit lamang ng .env.example na may walang laman na halaga at paglalarawan ng bawat variable sa repository. Para sa CI/CD, gumamit ng naka-encrypt na mga secret sa setting ng GitHub Actions, GitLab CI o Bitrise, na natatakpan sa mga log at hindi mababasa pagkatapos ng build.
Karamihan sa mga CI system ay sumusuporta sa lihim na mga variable ng kapaligiran. Sa GitHub Actions, ito ay Secrets, sa GitLab CI — CI/CD Variables, sa Bitrise — Secrets. Sa yugto ng build, ang mga ito ay ipinapasa sa build script sa pamamagitan ng process.env o System.getenv(). Ang mga lihim na variable ay hindi ipinapakita sa build logs at hindi available sa forks ng repository.
Feature flags ay mga boolean variable na kumokontrol sa pag-activate o pag-deactivate ng functionality nang walang recompilation ng code. Halimbawa: FEATURE_NEW_PAYMENT=true ay nag-activate ng bagong payment system sa staging para sa pagsubok. Sa production, ang parehong flag ay naka-set sa false hanggang sa ganap na deployment ng backend. Ito ay nagpapahintulot ng ligtas na phased implementation ng mga pagbabago at pag-rollback kung may mga problema.
Buod
Gagawa kami ng mobile application na turnkey
Gumagawa ang IT Sectr ng mga iOS at Android application para sa mga startup at negosyo mula noong 2017. Magpapayo kami sa iyo at magmumungkahi ng pinakamahusay na solusyon.
Basahin din