पब्लिकेशन के वैरिएंट कॉन्फ़िगर करना

पब्लिकेशन के वैरिएंट की मदद से, उपयोगकर्ताओं को उनकी पसंद के मुताबिक अनुभव दिया जा सकता है. पब्लिकेशन के वैरिएंट कॉन्फ़िगर करके, बिल्ड के अलग-अलग वैरिएंट पब्लिश किए जा सकते हैं. और हर एक एट्रिब्यूट की वैल्यू शामिल करें.

अपनी लाइब्रेरी के कई बिल्ड वैरिएंट पब्लिश करने से, उपयोगकर्ता उनकी ज़रूरतों के हिसाब से सही सुविधाएं चुन सकें. उदाहरण के लिए, आप अलग-अलग आर्टफ़ैक्ट डीबग बनाम रिलीज़ बिल्ड टाइप. डीबग पब्लिकेशन आर्टफ़ैक्ट में अतिरिक्त लॉगिंग कोड हो सकता है और अलग-अलग डिपेंडेंसी का इस्तेमाल करके इस अतिरिक्त लॉगिंग को चालू किया जा सकता है.

आगे बढ़ने से पहले, पक्का करें कि रिलीज़ के लिए अपनी लाइब्रेरी तैयार करना.

Gradle मॉड्यूल मेटाडेटा इस्तेमाल करना

अपनी लाइब्रेरी के वैरिएंट पब्लिश करने के लिए, Gradle मॉड्यूल मेटाडेटा (GMM). GMM आपके पब्लिकेशन के बारे में बताता है और उसका रखरखाव करता है वैरिएंट-अवेयर डिपेंडेंसी मैनेजमेंट. GMM, डिफ़ॉल्ट रूप से आपकी लाइब्रेरी के साथ प्रकाशित होता है.

GMM के इस्तेमाल के फ़ायदे:

  • अगर Gradle 6.0 या इसके बाद के वर्शन के साथ GMM का इस्तेमाल किया जा रहा है, तो आपके पास एक से ज़्यादा पब्लिकेशन पब्लिश करने का विकल्प है वैरिएंट या कई आर्टफ़ैक्ट शामिल हों—हर एक एट्रिब्यूट की अपनी-अपनी विशेषताएं और डिपेंडेंसी हो. अगर Maven की पीओएम फ़ाइल का इस्तेमाल किया जाता है GMM की जगह पर, सिर्फ़ एक आर्टफ़ैक्ट पब्लिश किया जा सकता है. पीओएम फ़ाइल का इस्तेमाल करने पर, की कैटगरी तय करने वाले टूल का इस्तेमाल करके, अतिरिक्त आर्टफ़ैक्ट पब्लिश किए जा सकते हैं. हालांकि, अतिरिक्त आर्टफ़ैक्ट अपनी डिपेंडेंसी नहीं हो सकती.
  • Gradle अपने-आप, कंपाइलेशन के लिए एक और रनटाइम के लिए एक वैरिएंट बना देता है. पर निर्भर करता है. कंपाइलेशन के लिए एक वैरिएंट पब्लिश किया जा सकता है और एक रनटाइम के लिए, ताकि उपभोक्ता अपने हिसाब से चुन सकें कि वे कब इस्तेमाल कर रहे हैं आपकी लाइब्रेरी पर टैप करें. जीएमएम की मदद से उपभोक्ता, कंपाइल और टोन के लिए अलग-अलग डिपेंडेंसी देख सकते हैं रनटाइम, जो कि पब्लिश की गई लाइब्रेरी के इस्तेमाल के आधार पर तय होता है api, implementation या compileOnly/runtimeOnly. यहां जाएं: डिपेंडेंसी कॉन्फ़िगरेशन देखें. यह तब भी उपलब्ध रहता है, जब पब्लिकेशन का वैरिएंट.
  • टेस्ट फ़िक्स्चर का इस्तेमाल करते समय, एक खास मेटाडेटा या क्षमताएं ताकि उपभोक्ता उसे चुन सके. यह तब भी उपलब्ध रहता है, जब पब्लिकेशन का एक वैरिएंट.

पब्लिकेशन के वैरिएंट को समझना

पब्लिकेशन के वैरिएंट कैसे काम करते हैं, यह समझने के लिए ज़रूरी है कि ग्रेडल पब्लिश करने के बुनियादी तरीके देखें. प्रकाशन से जुड़े कुछ मुख्य सिद्धांत यहां दिए गए हैं:

  • वैरिएंट बनाना: कॉन्फ़िगरेशन Gradle आपकी लाइब्रेरी बनाने के लिए इस्तेमाल करता है, जो बिल्ड टाइप और प्रॉडक्ट फ़्लेवर का क्रॉस प्रॉडक्ट है. ज़्यादा जानने के लिए, यह देखें Android बिल्ड ग्लॉसरी.
  • आर्टफ़ैक्ट: बिल्ड के ज़रिए बनाई जाने वाली फ़ाइल या डायरेक्ट्री. लाइब्रेरी पब्लिश करने के संदर्भ में, आर्टफ़ैक्ट आम तौर पर एक JAR या AAR फ़ाइल होती है.
  • पब्लिकेशन का वैरिएंट: एक आर्टफ़ैक्ट, जो इससे जुड़े एट्रिब्यूट, फ़ीचर, और डिपेंडेंसी है. नोट जोड़ें जिसे Gradle, पब्लिकेशन के वैरिएंट के वैरिएंट को कॉल करता है. हालांकि, उन्हें पब्लिकेशन के वैरिएंट: बिल्ड वैरिएंट के साथ भी काम कर सकते हैं.
  • एट्रिब्यूट: पब्लिकेशन के वैरिएंट की पहचान करने और उन्हें चुनने के लिए, Gradle, एट्रिब्यूट का इस्तेमाल करता है कई विकल्प हैं. उदाहरण के लिए, org.gradle.usage=java-api और org.gradle.jvm.version=11, वैरिएंट के एट्रिब्यूट हैं.
  • सॉफ़्टवेयर का कॉम्पोनेंट: ऐसा Gradle ऑब्जेक्ट जो पब्लिश होने के बाद, पब्लिकेशन के एक या उससे ज़्यादा वैरिएंट को होल्ड कर सकता है Maven कोऑर्डिनेट के एक सेट (groupdId:artifactId:version) का इस्तेमाल करता है. हां के ज़रिए Gradle के DSL से जुड़े Project.getComponents().
  • पब्लिकेशन: डेटा स्टोर करने की जगह और उपभोक्ता इस्तेमाल करने के लिए पब्लिश किया जाता है. पब्लिकेशन में ये शामिल हैं सॉफ़्टवेयर के किसी एक कॉम्पोनेंट और उसके मेटाडेटा के बारे में बताना चाहिए. उदाहरण के लिए, उसकी पहचान (groupId:artifactId:version).

Android Gradle प्लग इन (AGP) 7.1 किसी खास डोमेन के लिए भाषा (DSL) की मदद से यह कंट्रोल किया जा सकता है कि पब्लिकेशन और जिन्हें अनदेखा किया जाता है. DSL से आपको SoftwareComponent, जिसमें इनमें से कोई एक शामिल हो:

  • बिल्ड के एक वैरिएंट से पब्लिकेशन का एक वैरिएंट
  • बिल्ड के अलग-अलग वैरिएंट में से, पब्लिकेशन के कई वैरिएंट

पब्लिकेशन के कई वैरिएंट वाला सॉफ़्टवेयर कॉम्पोनेंट बनाते समय, एजीपी सेट हर वैरिएंट के लिए एट्रिब्यूट चुनें, ताकि उपयोगकर्ता उनकी ज़रूरत के मुताबिक वैरिएंट चुनना. ये एट्रिब्यूट सीधे बिल्ड से मिलते हैं बिल्ड वैरिएंट बनाने के लिए इस्तेमाल किए गए टाइप और फ़्लेवर की जानकारी. किसी सिंगल पब्लिकेशन वैरिएंट वाले कॉम्पोनेंट के लिए एट्रिब्यूट की ज़रूरत नहीं है, क्योंकि फ़र्क़ करने की कोई ज़रूरत नहीं है.

पब्लिकेशन के एक वैरिएंट वाला सॉफ़्टवेयर कॉम्पोनेंट बनाना

नीचे दिया गया स्निपेट एक सॉफ़्टवेयर कॉम्पोनेंट को एक पब्लिकेशन के साथ कॉन्फ़िगर करता है release बिल्ड वैरिएंट से बनाया गया वैरिएंट और सोर्स JAR को सेकंडरी आर्टफ़ैक्ट:

Kotlinग्रूवी
android {
  publishing {
    singleVariant("release") {
        withSourcesJar()
    }
  }
}
android {
  publishing {
    singleVariant('release') {
        withSourcesJar()
    }
  }
}

कई कॉम्पोनेंट बनाए जा सकते हैं, जिनमें से हर एक कॉम्पोनेंट को एक पब्लिकेशन वैरिएंट के साथ बनाया जा सकता है और उन्हें अलग-अलग Maven कोऑर्डिनेट के तहत डिस्ट्रिब्यूट किया जा सकता है. इस मामले में, एट्रिब्यूट पब्लिकेशन के वैरिएंट पर सेट नहीं किए जाते. यह नहीं बताया जा सकता कि यह पब्लिकेशन यह वैरिएंट, release बिल्ड वैरिएंट से है. इसके लिए, पब्लिकेशन पेज को देखें मेटाडेटा. पब्लिकेशन का सिर्फ़ एक वैरिएंट शामिल है. इसलिए, इसकी ज़रूरत नहीं है ताकि साफ़ तौर पर समझ सकें.

पब्लिकेशन के कई वैरिएंट वाला सॉफ़्टवेयर कॉम्पोनेंट बनाएं

किसी सॉफ़्टवेयर को इंस्टॉल करने के लिए, सभी बिल्ड वैरिएंट या उनके कुछ वैरिएंट को एक साथ चुना जा सकता है कॉम्पोनेंट. AGP में, बिल्ड टाइप के नाम और प्रॉडक्ट के फ़्लेवर का इस्तेमाल अपने-आप किया जाता है नाम और प्रॉडक्ट फ़्लेवर वाले डाइमेंशन का नाम शामिल करें, ताकि एट्रिब्यूट इस्तेमाल करने वाले प्रोजेक्ट से इनके बीच अंतर किया जा सकता है.

बिल्ड के सभी वैरिएंट को एक ही कॉम्पोनेंट में पब्लिश करने के लिए, allVariants() तय करें मॉड्यूल-लेवल की build.gradle फ़ाइल में, multipleVariants{} ब्लॉक में:

Kotlinग्रूवी
android {
  publishing {
    multipleVariants {
      allVariants()
      withJavadocJar()
    }
  }
}
android {
  publishing {
    multipleVariants {
      allVariants()
      withJavadocJar()
    }
  }
}

इससे default नाम का एक कॉम्पोनेंट बनता है. अपने कॉम्पोनेंट को नाम देने के लिए कुछ और, multipleVariants({name}) का इस्तेमाल करें. इस मामले में, बिल्ड टाइप और प्रॉडक्ट के फ़्लेवर वाले सभी डाइमेंशन का इस्तेमाल इस तरह किया जाता है एट्रिब्यूट.

यह भी चुना जा सकता है कि कौनसे वैरिएंट पब्लिश किए जाएं. इसके लिए, includeBuildTypeValues() और includeFlavorDimensionAndValues():

Kotlinग्रूवी
android {
  publishing {
    multipleVariants("custom") {
      includeBuildTypeValues("debug", "release")
      includeFlavorDimensionAndValues(
        dimension = "color",
        values = arrayOf("blue", "pink")
      )
        includeFlavorDimensionAndValues(
          dimension = "shape",
          values = arrayOf("square")
      )
    }
  }
}
android {
  publishing {
    multipleVariants('custom') {
      includeBuildTypeValues('debug', 'release')
      includeFlavorDimensionAndValues(
        /*dimension =*/ 'color',
        /*values =*/ 'blue', 'pink'
      )
      includeFlavorDimensionAndValues(
        /*dimension =*/ 'shape',
        /*values =*/ 'square'
      )
    }
  }
}

इस उदाहरण में, कस्टम घटक में बिल्ड टाइप के लिए (debug, release), डाइमेंशन color के लिए (blue, pink), और (square) आयाम shape के लिए .

सभी फ़्लेवर डाइमेंशन को सूची में डालना ज़रूरी है, भले ही आप सिर्फ़ एक वैल्यू पब्लिश कर रहे हों किया जाता है, ताकि AGP को हर डाइमेंशन के लिए इस्तेमाल की जाने वाली वैल्यू पता चल सके.

नीचे दी गई टेबल में, पब्लिकेशन के वैरिएंट और उनके एट्रिब्यूट की वैल्यू सबमिट करें.

वैरिएंट विशेषताएं
blueSquareDebug com.android.build.api.attributes.BuildTypeAttr="debug" com.android.build.api.attributes.ProductFlavorAttr:color="blue"
blueSquareRelease com.android.build.api.attributes.BuildTypeAttr="release"
com.android.build.api.attributes.ProductFlavorAttr:color="blue"
pinkSquareDebug com.android.build.api.attributes.BuildTypeAttr="debug"
com.android.build.api.attributes.ProductFlavorAttr:color="pink"
pinkSquareRelease com.android.build.api.attributes.BuildTypeAttr="release"
com.android.build.api.attributes.ProductFlavorAttr:color="pink"

व्यावहारिक तौर पर, ज़्यादा वैरिएंट पब्लिश किए जाते हैं. उदाहरण के लिए, ऊपर दिए गए हर वैरिएंट को दो बार पब्लिश किया जाता है. एक बार कंपाइलेशन के लिए और एक बार पब्लिश करने के लिए रनटाइम, जिसमें अलग-अलग डिपेंडेंसी के साथ-साथ, एलान की गई डिपेंडेंसी के आधार पर implementation या api का इस्तेमाल करें) और एट्रिब्यूट के लिए किसी दूसरी वैल्यू का इस्तेमाल करें org.gradle.Usage. हालांकि, इन दोनों वैरिएंट के लिए आर्टफ़ैक्ट (एएआर फ़ाइल) एक जैसा.

ज़्यादा जानकारी के लिए, देखें publishing एपीआई दस्तावेज़.

अलग-अलग तरह की लाइब्रेरी पब्लिश करने पर काम करने से जुड़ी समस्या

एजीपी 7.0 या इससे पहले के वर्शन का इस्तेमाल करने वाले प्रोजेक्ट में, पब्लिश की गई अलग-अलग तरह की लाइब्रेरी का इस्तेमाल नहीं किया जा सकता AGP 7.1 या इससे ऊपर के वर्शन के साथ. यह एक आम समस्या है, जो एट्रिब्यूट में बदलाव करने की वजह से हुई है प्रॉडक्ट फ़्लेवर वाले डाइमेंशन का नाम, dimensionName से बदलकर एजीपी 7.1 में com.android.build.api.attributes.ProductFlavor:dimensionName. अपने प्रोजेक्ट सेटअप के आधार पर, missingDimensionStrategy का इस्तेमाल इसमें किया जा सकता है काम करने के लिए, एपीआई का पुराना वर्शन इस्तेमाल करें समस्या को हल करने में मदद मिलेगी.

उदाहरण के लिए, मान लें कि आपके ऐप्लिकेशन प्रोजेक्ट का केवल एक वर्शन प्रॉडक्ट है फ़्लेवर डाइमेंशन:

Kotlinग्रूवी

android {
    applicationVariants.forEach { variant ->
        val flavor = variant.productFlavors[0].name
        val attributePrefix = "com.android.build.api.attributes.ProductFlavor"
        val dimensionName = "version"
        variant.missingDimensionStrategy("$attributePrefix:$dimensionName", flavor)
    }
}

android {
    applicationVariants.forEach { variant ->
        def flavor = variant.getProductFlavors()[0].name
        def attributePrefix = "com.android.build.api.attributes.ProductFlavor"
        def dimensionName = "version"
        variant.missingDimensionStrategy("$attributePrefix:$dimensionName", flavor)
    }
}