Atrof-muhit o‘zgaruvchilari — bu dasturni ishga tushirishda uning xatti-harakatini kodni o‘zgartirmasdan sozlash uchun uzatiladigan dinamik qiymatlardir. Ular ishlab chiqish, test va ishlab chiqarish muhitlari konfiguratsiyalarini ajratish imkonini beradi. Twelve-Factor App, 2025 ma’lumotlariga ko‘ra, konfiguratsiya atrof-muhit o‘zgaruvchilarida saqlanishi kerak, koddagidek emas. Atrof-muhit o‘zgaruvchilari API kalitlari, backend URL va funksionallik bayroqlarini xavfsiz boshqarishni ta’minlaydi.
Asosiy fikrlar
Atrof-muhit o‘zgaruvchilari — operatsion tizim API orqali dastur jarayoniga taqdim etiladigan kalit-qiymat juftligidir. Ular jarayon yaratilganda unga uzatiladi va faqat uning ishlash vaqti davomida mavjud bo‘ladi. Manba kodiga o‘rnatilgan konfiguratsiya parametrlaridan farqli o‘laroq, atrof-muhit o‘zgaruvchilari qiymatlarni o‘zgartirish uchun qayta kompilyatsiyani talab qilmaydi. Bu kod va konfiguratsiya o‘rtasida aniq ajratishni ta’minlaydigan Twelve-Factor App ning asosiy printsipidir.
Mobil ishlanmada atrof-muhit o‘zgaruvchilari turli muhitlar uchun konfiguratsiya muammosini hal qiladi: ishlab chiqaruvchi mahalliy serverdan, sinovchi staging-dan, foydalanuvchilar ishlab chiqarish muhitidan foydalanadi. Koddagi if-else shart operatorlari bilan uchta backend URL saqlash o‘rniga, ishlab chiqaruvchi qurish bosqichida bitta URL ni atrof-muhit o‘zgaruvchisi orqali uzatadi. Bu kodni soddalashtiradi va sinov muhitida tasodifan ishlab chiqarish serveridan foydalanish xavfini bartaraf etadi.
Asosiy afzallik xavfsizlikdir: maxfiy ma’lumotlar kod repozitariysiga tushmaydi. API kalitlari, Firebase sirlari, backend kirish tokenlari va sertifikatlar CI/CD orqali to‘g‘ridan-to‘g‘ri qurish muhitiga yuklanadi. Agar tajovuzkor kod repozitariysiga kirish imkoniyatiga ega bo‘lsa, u yerda sirlarni topmaydi, chunki ular CI tizimining himoyalangan omborlarida saqlanadi va faqat ikkilik faylni qurish bosqichida uzatiladi.
Mobil loyihalar kamida uchta muhitga ega: development, staging va ishlab chiqarish. Har bir muhit o‘z konfiguratsiya to‘plamini talab qiladi: server URL, paket nomi, imzo sxemasi va push bildirishnomalari sertifikatlari. Atrof-muhit o‘zgaruvchilari bo‘lmasa, ishlab chiqaruvchi har bir qurishdan oldin konfiguratsiyani qo‘lda o‘zgartirishi kerak, bu esa xatolarga olib keladi: unutilgan ishlab chiqarish kaliti test qurilishida haqiqiy foydalanuvchilarga bildirishnomalar yuborilishiga yoki pulli API sarflanishiga sabab bo‘lishi mumkin.
Atrof-muhit o‘zgaruvchilari kodni o‘zgartirmasdan backendni o‘zgartirish imkonini beradi: API_BASE_URL o‘zgaruvchisidagi qiymatni almashtirish kifoya. Funksionallik bayroqlari (feature flags) FEATURE_CHAT_ENABLED=true tipidagi o‘zgaruvchilar orqali boshqariladi, bu esa ishlab chiqarish muhitiga ta’sir qilmasdan staging-da yangi imkoniyatlarni yoqish imkonini beradi. Har bir muhit uchun qurish bosqichida yuklanadigan o‘z .env fayli yaratiladi.
class AppConfig {
static final String apiBaseUrl =
const String.fromEnvironment('API_BASE_URL',
defaultValue: 'http://localhost:8080');
}
Qattiq kodlangan kalitlar mobil ilovalarning keng tarqalgan zaifligidir. Tajovuzkor jadx yoki Hopper kabi vositalar bilan APK yoki IPA ni dekompilyatsiya qiladi va ikkilik fayldan sirlarni chiqaradi. Hatto obfuskatsiya ham string literal himoya qilmaydi — ular dekompilyatsiyadan keyin koddan osonlikcha topiladi. Atrof-muhit o‘zgaruvchilari bu muammoni hal qiladi, kalitlarni CI/CD orqali qurish bosqichida uzatadi, bu erda ular jurnallarda maskalanadi.
object Config {
val apiKey: String =
System.getenv("API_KEY") ?: throw
IllegalStateException("API_KEY not set")
}
Atrof-muhit o‘zgaruvchilari qurish pipeline-lari bilan integratsiyalanadi: GitHub Actions, GitLab CI, Bitrise va CircleCI jurnallarda ko‘rsatilmaydigan maxfiy o‘zgaruvchilarni qo‘llab-quvvatlaydi. Qurish bosqichida CI filial yoki teg ga qarab tegishli qiymatlarni almashtiradi: develop filiali uchun staging, v* tegi uchun ishlab chiqarish ishlatiladi. Bu jarayonni avtomatlashtiradi va inson omilini bartaraf etadi, har bir qurishning to‘g‘ri konfiguratsiya to‘plamini olishini kafolatlaydi.
.env fayli atrof-muhit o‘zgaruvchilarini KEY=VALUE formatida saqlashning standart usulidir. Repozitariyga kiritilmaydi, uning o‘rniga repozitariyga barcha o‘zgaruvchilarning shabloni va bo‘sh qiymatlari bilan .env.example qo‘shiladi. Har bir ishlab chiqaruvchi jamoa a’zolarining konfiguratsiyasiga ta’sir qilmasdan o‘z .env faylini yaratadi. Turli muhitlar uchun alohida fayllar ishlatiladi: .env.dev, .env.stage, .env.prod.
# .env.example — ishlab chiquvchilar uchun shablon
API_BASE_URL=http://localhost:8080
FEATURE_CHAT_ENABLED=true
SENTRY_DSN=
Mobil loyihalar uchun .env fayllari bilan ishlash uchun ixtisoslashgan kutubxonalar mavjud:
CI/CD da filial sozlamalari turli .env fayllarini almashtirish imkonini beradi: test serverlari uchun .env.dev, chiqarish oldi uchun .env.stage va ilova do‘konlarida nashr qilish uchun .env.prod. Sirlari bor fayllar xavfsiz ombordan (Vault, AWS Secrets Manager) yuklanadi va repozitariyda saqlanmaydi. Bu versiya nazorat tizimi buzilgan taqdirda ham sirlarning himoyalanganligini kafolatlaydi.
iOS ekotizimi qurish darajasida o‘zgaruvchilarni boshqarish uchun xcconfig fayllaridan foydalanadi. Ular Xcode sxemalariga ulanadi va Debug va Release konfiguratsiyalari uchun qiymatlarni bekor qilish imkonini beradi. xcconfig fayllari meros olishni qo‘llab-quvvatlaydi: umumiy sozlamalar bilan asosiy fayl va har bir muhit uchun maxsus fayllar yaratilishi mumkin.
xcconfig fayllari o‘zgaruvchilarni KEY = VALUE formatida saqlaydi va Xcode da Configuration sozlamalari orqali qurish sxemasiga ulanadi. xcconfig dan o‘zgaruvchilar Info.plist da $(VARIABLE_NAME) sintaksisi orqali mavjud bo‘lib, bu turli sxemalar uchun turli paket identifikatorlari va ilova nomlaridan foydalanish imkonini beradi. Muhitni tez aniqlash uchun ilova nomiga Dev yoki Staging qo‘shimchasi qo‘shiladi.
# Config/Dev.xcconfig — ishlab chiqish konfiguratsiyasi
API_BASE_URL = http://localhost:3000
BUNDLE_ID_SUFFIX = .dev
APP_DISPLAY_NAME = MyApp Dev
iOS da o‘zgaruvchilarga runtime kirish uchun Bundle.main.object(forInfoDictionaryKey:) orqali Info.plist dan qiymatlarni o‘qiyadigan Configuration.swift fayli ishlatiladi. Bu yondashuv o‘zgaruvchilarning qurish bosqichida aniqlanishini va ilova ishga tushgandan so‘ng darhol mavjud bo‘lishini kafolatlaydi. Qiymatlar modul ishga tushirilganda bir marta o‘qiladi va ilova hayot davri davomida tez kirish uchun keshga olinadi.
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
}
}
Android atrof-muhit o‘zgaruvchilarini BuildConfig — maydonlari modulning build.gradle faylida aniqlanadigan avtomatik yaratiladigan sinf orqali qo‘llab-quvvatlaydi. BuildConfig har bir flavor va qurish turi uchun alohida kompilyatsiya bosqichida yaratiladi. Bu koddagi shart operatorlaridan foydalanmasdan debug va release uchun turli qiymatlarga ega bo‘lish imkonini beradi, bu esa unumdorlik va xavfsizlikni oshiradi.
BuildConfig maydonlari defaultConfig da yoki aniq buildTypes da buildConfigField orqali o‘rnatiladi. Har bir muhit uchun alohida buildType yoki productFlavor yaratiladi. Bu konfiguratsiyalarning qat’iy izolyatsiyasini ta’minlaydi: debug mahalliy serverdan, release ishlab chiqarishdan foydalanadi. BuildConfig maydonlari statik tiplangan bo‘lib, bu koddagi murojaatlarda xatolarni bartaraf etadi.
// 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\""
}
}
}
Loyiha ildizidagi gradle.properties fayli global Gradle o‘zgaruvchilarini saqlaydi. Ular $variableName sintaksisi orqali barcha modullarda mavjud va bog‘liqlik versiyalari, qurish bayroqlari va API kalitlarini ko‘rsatish uchun ishlatiladi. BuildConfig dan farqli o‘laroq, gradle.properties faqat Gradle konfiguratsiyasi bosqichida ishlaydi, ilovaning runtime ida emas. Shuning uchun gradle.properties da ko‘rsatilgan parollar va API kalitlari dekompilyatsiya qilingan kodda ko‘rinmaydi, chunki ular faqat kompilyatsiya bosqichida BuildConfig yaratish uchun ishlatiladi.
# gradle.properties
SENTRY_DSN=https://key@sentry.io/project
MAPS_API_KEY=AIzaSy...
Android loyihalarida sirlarni xavfsiz uzatish uchun local.properties (VCS dan chiqarilgan) dan foydalanish yoki System.getenv() orqali CI/CD o‘zgaruvchilaridan qiymatlarni build.gradle ga yuklash tavsiya etiladi. Bu kalitlarning repozitariyga tushmasligini kafolatlaydi. Google Play Console da nashr qilishda barcha debug kalitlarining tegishli BuildConfig qiymatlari bilan turli buildTypes yoki productFlavors orqali ishlab chiqarish versiyalari bilan almashtirilganligiga ishonch hosil qiling.
Tez-tez so‘raladigan savollar
Ha, Flutter atrof-muhit o‘zgaruvchilarini runtime kirish uchun flutter_dotenv paketi orqali yoki platforma o‘zgaruvchilari uchun native kanallar orqali qo‘llab-quvvatlaydi. Dart da shuningdek --dart-define orqali kompilyatsiya bosqichida qiymatlarni uzatish uchun String.fromEnvironment konstruktori mavjud, bu Flutter loyihalari uchun afzal qilingan usuldir.
BuildConfig — har bir buildType va flavor uchun kompilyatsiya bosqichida yaratiladigan tiplangan maydonlarga ega Java sinfidir. gradle.properties — barcha Gradle modullari uchun qurish konfiguratsiyasi bosqichida mavjud bo‘lgan kalit-qiymat juftliklaridan iborat matn faylidir. BuildConfig ilovaning runtime ida ishlaydi, gradle.properties esa faqat Gradle skriptlarida ishlaydi.
Repozitariyingizning .gitignore fayliga .env qo‘shing. Repozitariyga faqat bo‘sh qiymatlar va har bir o‘zgaruvchining tavsifi bilan .env.example ni commit qiling. CI/CD uchun GitHub Actions, GitLab CI yoki Bitrise sozlamalarida jurnallarda maskalanadigan va qurish tugagandan so‘ng o‘qib bo‘lmaydigan shifrlangan sirlardan foydalaning.
Ko‘pchilik CI tizimlari maxfiy atrof-muhit o‘zgaruvchilarini qo‘llab-quvvatlaydi. GitHub Actions da bular Secrets, GitLab CI da — CI/CD Variables, Bitrise da — Secrets deb ataladi. Qurish bosqichida ular process.env yoki System.getenv() orqali qurish skriptiga uzatiladi. Maxfiy o‘zgaruvchilar qurish jurnallarida ko‘rsatilmaydi va repozitariy fork larida mavjud emas.
Feature flags — kodni qayta kompilyatsiya qilmasdan funksionallikni yoqish yoki o‘chirishni boshqaradigan mantiqiy o‘zgaruvchilardir. Misol: FEATURE_NEW_PAYMENT=true test uchun staging da yangi to‘lov tizimini yoqadi. Ishlab chiqarishda xuddi shu bayroq backend to‘liq joylashtirilgunga qadar false ga o‘rnatilgan. Bu o‘zgarishlarni bosqichma-bosqich xavfsiz joriy qilish va muammolar bo‘lganda qaytarish imkonini beradi.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.