Build Variant — bu nima, build type va product flavor Android-da

Muallif: IT Sectr Nashr etilgan: 2026-05-30 O'qish vaqti: 9 daq

Build Variant Android rivojlanishida build type va product flavor kombinatsiyasidir, u APK yoki AAB qanday yig'ilishini belgilaydi: qanday parametrlar, resurslar va kod bilan. Har bir kompilyatsiya varianti o'z applicationId, imzolash kalitlari va kiritilgan bog'liqliklari bilan alohida Gradle konfiguratsiyasidir. Google Android Developers, 2025 ma'lumotlariga ko'ra, Build Variants-ni to'g'ri sozlash har bir variant uchun keraksiz resurslarni chiqarib tashlash orqali kompilyatsiya vaqtini 40% gacha qisqartiradi. Kompilyatsiya variantlari tizimi zamonaviy Android loyihalarida konfiguratsiya boshqaruvining asosidir.

Asosiy fikrlar

  • Build Variant — bitta Build Type va bitta Product Flavor kombinatsiyasi.
  • Build Type kompilyatsiya rejimini belgilaydi: debug (nosozliklarni tuzatish) yoki release (chop etish).
  • Product Flavor ilova versiyasini aniqlaydi: free, paid, demo, enterprise.
  • Gradle har bir Build Variant uchun avtomatik ravishda install va assemble topshiriqlarini yaratadi.
  • Resurslar va kod har bir variant uchun tegishli source sets orqali bekor qilinishi mumkin.

Build Variant nima?

Build Variant — bu bitta Build Type va bitta Product Flavor kombinatsiyasining natijasidir. Loyihada Product Flavor aniqlanmagan bo'lsa, Build Variant Build Type bilan mos keladi. Gradle barcha FlavorDimensions, Product Flavors va Build Types-ning dekart ko'paytmasini avtomatik ravishda yaratadi. Masalan, free/paid flavor va debug/release turlari uchun 8 variant yaratiladi: freeDebug, freeRelease, paidDebug, paidRelease.

Har bir Build Variant <Flavor><Type> formatida o'z nomini oladi (flavor katta harf bilan). Bu variant uchun Gradle alohida topshiriqlar yaratadi: assembleFreeDebug, installFreeDebug, bundleFreeRelease. Android Studio-da variantlar o'rtasida o'tish Build Variants paneli (View → Tool Windows → Build Variants) orqali mumkin. Variantni tanlash qaysi kod kompilyatsiya qilinishiga, qaysi resurslar kiritilishiga va qaysi APK/AAB yaratilishiga ta'sir qiladi.

Build Variants tizimi uchta asosiy vazifani hal qiladi: turli muhitlar (dev/staging/production) uchun konfiguratsiyalarni ajratish, ilovaning bir nechta versiyalarini (free/paid) yaratish va kompilyatsiyalarning A/B testi. Build Variants bo'lmasa, dasturchilar bayroqlar va konfiguratsiyalarni qo'lda almashtirishga majbur bo'lar edilar, bu esa inson omilidan kelib chiqadigan xatolarga olib keladi. Gradle Inc., 2024 tadqiqotiga ko'ra, Build Variants-ni joriy etish uch va undan ortiq joylashtirish muhitiga ega loyihalarda kompilyatsiya xatolarini 60% ga kamaytiradi.

Gradle variantlarni qanday yaratadi

AGP (Android Gradle Plugin) konfiguratsiya bosqichida barcha kombinatsiyalarni hisoblab chiqadi. Loyihada ikki o'lchov mos ravishda ikki va uch flavor bilan bo'lsa, Gradle 2 × 2 × 3 = 12 kombinatsiya yaratadi, Build Types soniga (odatda 2) ko'paytiriladi. Har bir kombinatsiya noyob nom va topshiriqlar to'plamini oladi. AGP har bir variant uchun avtomatik ravishda source set qo'shadi: src/freeDebug/, src/paidRelease/, shuningdek umumlashtirilgan src/free/ va src/debug/. Resurslarni o'qish ustuvorligi: variant → flavor → type → main.

groovy
// Misol: 4 Build Variants
// flavorDimensions "version", "server"
// version: demo, prod
// server: mock, live
// buildTypes: debug, release
// Jami: 2 × 2 × 2 = 8 variant

android {
    flavorDimensions "version", "server"

    productFlavors {
        demo { dimension "version" }
        prod { dimension "version" }
        mock { dimension "server" }
        live { dimension "server" }
    }
}

Build Type va Product Flavor: farqlar

Build Type ilova qanday yig'ilishini belgilaydi — nosozliklarni tuzatish ma'lumoti bilan yoki unsiz, optimizatsiya bilan yoki unsiz, qanday imzolash bilan. Product Flavor nima yig'ilishini belgilaydi — mahsulotning qaysi versiyasini. Build Type — kompilyatsiya mexanizmi (debug, release, staging). Product Flavor — mahsulot varianti (free, paid, enterprise, demo). Ikkala tushuncha ortogonaldir: har qanday Build Type har qanday Product Flavor-ga qo'llanilishi mumkin.

Build Type sukut bo'yicha debug (debuggable=true, minification=false, signing=debug.keystore) va release (debuggable=false, minification=true, signing=production.keystore) ni o'z ichiga oladi. Product Flavor sukut bo'yicha bitta, nomsiz (aslida main source set). Dasturchi o'zining Build Types (masalan, “staging” debuggable=true va minification=true bilan) va Product Flavors-ni istalgan sonda qo'shishi mumkin. Farq shundaki, Build Type o'lchovlarga guruhlanishi mumkin emas, Product Flavor esa mumkin.

Asosiy amaliy farq: build.gradle-dagi defaultConfig barcha Variants-ga qo'llaniladi, lekin productFlavors va buildTypes-da bekor qilinishi mumkin. buildType-ga qo'shilgan BuildConfigField ushbu turning barcha flavor-larida ko'rinadi, productFlavor-ga qo'shilgan esa ushbu flavor-ning barcha turlarida. Agar maydon ham u yerda, ham bu yerda aniqlangan bo'lsa — buildType ustunlikka ega (zanjirda oxirgi qo'llaniladi).

Taqqoslash jadvali

XususiyatBuild TypeProduct Flavor
MaqsadQanday yig'ishNimani yig'ish
Misollardebug, release, stagingfree, paid, demo, enterprise
Sukut bo'yichadebug + releasebitta (main)
Source Setsrc/debug/, src/release/src/free/, src/paid/
O'lchovlaryo'qflavorDimensions
Qo'llashflavor-dan keyin, bekor qiladidefaultConfig-dan keyin
BuildConfigFieldflavor-ni bekor qiladidefaultConfig-ni bekor qiladi

Build Variants-ni build.gradle-da sozlash

Konfiguratsiyalar ustuvorligi

Build Variants-ni sozlash modul darajasidagi build.gradle faylining android blokida amalga oshiriladi. Avval buildTypes o'z parametrlari bilan, keyin flavorDimensions va productFlavors e'lon qilinadi. Gradle ushbu e'lonlar asosida avtomatik variantlar yaratadi. Har bir variant modulning defaultConfig-ni meros qilib oladi, belgilangan maydonlarni bekor qiladi. E'lon qilish tartibi ustuvorlikka ta'sir qiladi: buildTypes productFlavors-dan keyin qo'llaniladi.

Gradle skriptlarida aniq Build Variant-ga kirish uchun android.applicationVariants (app moduli uchun) yoki android.libraryVariants (kutubxona moduli uchun) ishlatiladi. Bu to'plam bo'lib, unda iteratsiya qilish va konfiguratsiya vaqtida har bir variant konfiguratsiyasini o'zgartirish mumkin. Masalan, “demo” so'zini o'z ichiga olgan barcha variantlar uchun dasturiy ravishda buildConfigField qo'shilishi mumkin.

Android Gradle Plugin 8.x, variantlarni lambdalar orqali sozlash uchun onVariants — tozaroq API qo'llab-quvvatlashini qo'shdi. Eski API (variantOutput, variantFilter) eskirgan deb belgilangan. Kutubxona modullari uchun onVariants bilan birga onEach ishlatish tavsiya etiladi. AGP 7.x dan 8.x ga yangilashda variantOutput-dan onVariants-ga migratsiya tavsiya etiladi.

groovy
android {
    buildTypes {
        debug {
            debuggable true
            minification false
            signingConfig signingConfigs.debug
        }
        release {
            debuggable false
            minification true
            proguardFiles "proguard-rules.pro"
            signingConfig signingConfigs.release
        }
        staging {
            debuggable true
            minification true
            versionNameSuffix "-staging"
        }
    }

    flavorDimensions "tier", "region"

    productFlavors {
        free { dimension "tier" }
        paid { dimension "tier" }
        us { dimension "region" }
        eu { dimension "region" }
    }
}

android.onVariants { variant ->
    if (variant.name.contains("Demo")) {
        variant.setEnabled(false)
    }
}

Source Sets va resurslarni bekor qilish

Har bir Build Variant o'zining source sets ierarxiyasini oladi — manba kodi, resurslar va manifest bilan kataloglar. Source set src/<variantName>/ da joylashgan (masalan, src/freeDebug/) va java/, res/, AndroidManifest.xml, assets/ ni o'z ichiga olishi mumkin. Agar fayl variant source setida mavjud bo'lsa, u asosiy source setdagi (src/main/) bir xil nomli faylni bekor qiladi. Resurslar uchun birlashtirish ishlaydi, almashtirish emas — tizim barcha faol source sets-lardan resurslarni birlashtiradi, variant-spetsifik bo'lganlarga ustunlik beradi.

Build Variant uchun source sets zanjir bo'ylab quriladi: src/main/src/flavor/src/type/src/flavorType/. Masalan, paidRelease uchun avval main, keyin paid, keyin release, keyin paidRelease qo'llaniladi. Har bir keyingi source set oldingisini bekor qiladi. Bu shuni anglatadiki, src/release/res/values/strings.xml src/paid/ faylidagi bir xil satrlarni bekor qiladi, lekin src/paid/release/res/ yanada ustunroqdir.

Variantlar uchun source sets ishlatish resurslarni sozlashning tavsiya etilgan usulidir. Koddagi BuildConfig.FLAVOR ni tekshirish va mantiqni tarmoqlash o'rniga, turli fayllarni turli source sets-larga joylashtirish mumkin. Masalan, free va paid versiyalari uchun piktogrammalar mos ravishda src/free/res/ va src/paid/res/ ga, turli ruxsatnomalar bilan AndroidManifest esa src/free/AndroidManifest.xml va src/paid/AndroidManifest.xml ga joylashtiriladi. Bu tozaroq, tezroq (resurslar kompilyatsiya qilinadi, runtime-da tekshirilmaydi) va xavfsizroqdir (kod xatosi tufayli tasodifan pullik funksionallikni bepul versiyaga kiritish mumkin emas).

Ko'p modulli loyihalarda Build Variant

Ko'p modulli loyihalarda har bir modul (kutubxona) o'zining Build Variants-iga ega bo'lishi mumkin. AGP variantlarni avtomatik sinxronlashtiradi: agar app moduli paidRelease-ni yig'sa, barcha bog'liq kutubxonalar ham paidRelease-ga mos keladigan variantlarida yig'iladi. Muammo kutubxonada product flavors bo'lmaganda, lekin app modulida bo'lganda yuzaga keladi — u holda kutubxona bir marta (turga qarab release yoki debug) yig'iladi.

Kutubxona modullari uchun Build Variant sukut bo'yicha app modulining Build Type bilan mos keladi, chunki kutubxonalarda product flavors mavjud emas. Agar kutubxona app modulining flavor-iga moslashishi kerak bo'lsa, kutubxonada bir xil flavorDimensions va productFlavors e'lon qilinishi kerak. AGP flavor-ni nomning to'liq mos kelishiga qarab moslashtiradi. Gradle, subprojects yoki Convention Plugins orqali ildiz loyihada flavor-larni sinxronlashtirishni tavsiya qiladi.

AGP 8.1 dan boshlab, kutubxonalar multiple variants nashr qilishi mumkin — kutubxonaning barcha variantlarini maven omboriga bir vaqtning o'zida joylashtirishi mumkin. Bu app moduli paid flavor ishlatganda, kutubxona faqat free uchun nashr qilinganda yuzaga keladigan muammoni hal qiladi. Multiple variants publishing (MVP) bog'liq loyihaga kerakli variantni avtomatik tanlash imkonini beradi. MVP-ni faollashtirish uchun kutubxonaning build.gradle fayliga publishing { multipleVariants { ... } } qo'shish kerak.

Variantlarni filtrlash va o'chirish

CI/CD orqali dinamik filtrlash

Ba'zan Build Variants-ning bir qismini o'chirish kerak bo'ladi — masalan, mockRelease kombinatsiyasi ma'nosiz bo'lsa (mock server ishlab chiqarishga tushmasligi kerak). Gradle variantFilter — DSL blokini taqdim etadi, unda har bir variantning xususiyatlarini tekshirish va setIgnore(true) orqali o'chirish mumkin. VariantFilter konfiguratsiya bosqichida, topshiriqlar yaratilishidan oldin qo'llaniladi, shuning uchun o'chirilgan variant assemble va install topshiriqlarini yaratmaydi.

Filtrlash shuningdek kompilyatsiyani tezlashtirish uchun foydalidir. Loyihada 8 variant bo'lsa va dasturchi faqat bittasi ustida ishlasa, qolgan 7 variant baribir konfiguratsiyadan (configuration phase) o'tadi. VariantFilter ishlatganda, o'chirilgan variantlar topshiriq yaratmaydi, bu 6+ flavor o'lchovli loyihalar uchun konfiguratsiya vaqtini 30-50% ga qisqartiradi. CI/CD da variantlarni buyruq satri parametrlari -PbuildOnly=paidRelease orqali dinamik filtrlash mumkin.

groovy
android {
    variantFilter { variant ->
        // Mock-ni release va demo-ni production uchun o'chiramiz
        def names = variant.flavors*.name
        def isMock = names.contains("mock")
        def isDemo = names.contains("demo")
        def isRelease = variant.buildType.name == "release"

        if ((isMock && isRelease) || (isDemo && !isMock)) {
            variant.setIgnore(true)
        }
    }
}

// Parametrlar orqali dinamik filtrlash
if (project.hasProperty("buildOnly")) {
    def target = project.property("buildOnly")
    android.variantFilter { variant ->
        variant.setIgnore(variant.name != target)
    }
}

Ko'p beriladigan savollar

Qancha Build Variants yaratish mumkin?

Cheklov yo'q, lekin Gradle barcha flavor va turlarning dekart ko'paytmasini yaratadi. Agar 3 o'lchovda 3 flavor va 3 build type bo'lsa — 27 variant olinadi. Juda ko'p variant konfiguratsiyani sekinlashtiradi. Bir modulda 10-12 variantdan oshmasligi tavsiya etiladi.

flavorDimensions nima uchun kerak?

flavorDimensions Product Flavors-ni mustaqil o'qlarda guruhlaydi. Masalan, “tier” (free, paid) va “region” (us, eu) o'lchovlari. O'lchovlarsiz barcha flavor bir o'qga tegishli va Gradle hammadan faqat bitta flavor-ni tanlaydi (free+us va paid+eu alohida variantlar sifatida bo'lishi mumkin emas).

Variant uchun applicationId-ni qanday bekor qilish mumkin?

productFlavor yoki buildType blokida applicationId ni ko'rsating. Masalan, free versiyasi uchun: free { applicationId "com.example.app.free" }. Manifestda ${applicationId} ishlating — Gradle avtomatik qiymatni almashtiradi. Bu ikkala variantni bitta qurilmada o'rnatish imkonini beradi.

Build Variants iOS da ishlatilishi mumkinmi?

iOS da Build Variants-ning analogi Scheme + Configuration kombinatsiyasidir. Xcode Schemes turli parametrlar bilan Debug/Release konfiguratsiyalari orqali sozlanadi. Bir nechta versiyalar (free/paid) uchun Build Configurations va Preprocessor Macros ishlatiladi. Android da kontseptsiya qattiqroq rasmiylashtirilgan va Gradle-ga o'rnatilgan.

Build Variant APK hajmiga ta'sir qiladimi?

Ha, har bir variant turli APK hajmiga ega bo'lishi mumkin. debug kompilyatsiyalari nosozliklarni tuzatish ma'lumotini, SDK va qo'llab-quvvatlanmaydigan resurslarni o'z ichiga oladi. Minifikatsiya va resurslarni qisqartirish bilan release kompilyatsiyalari minimal hajmni beradi. Product Flavor ham ta'sir qiladi: pullik kutubxonalarsiz free versiyasi paid versiyasidan ushbu kutubxonalar hajmiga qadar kichik bo'ladi.

Xulosa

  • Build Variant — kompilyatsiya konfiguratsiyasini belgilaydigan bitta Build Type va bitta Product Flavor kombinatsiyasi.
  • Build Type kompilyatsiya rejimini (debug/release/staging), Product Flavor esa mahsulot versiyasini (free/paid) boshqaradi.
  • Source sets har bir kompilyatsiya varianti uchun kod, resurslar va manifestni bekor qilish imkonini beradi.
  • VariantFilter keraksiz kombinatsiyalarni o'chiradi, Gradle konfiguratsiyasini 30-50% tezlashtiradi.
  • Ko'p modulli loyihalar barcha modullar bo'ylab flavor sinxronizatsiyasini yoki multiple variants publishing ni talab qiladi.
  • BuildConfigField va source sets — variantlar o'rtasida xatti-harakatni sozlashning ikkita toza usuli.
  • Tavsiya: bitta loyihada 10-12 variantdan ko'p yaratmang, o'lchovlarni mazmunli guruhlang.

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.

Loyihani muhokama qilish

Shuningdek o'qing