बिल्ड डिपेंडेंसी जोड़ना

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

लाइब्रेरी या प्लगिन डिपेंडेंसी जोड़ना

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

नेटिव डिपेंडेंसी (आम तौर पर इस्तेमाल नहीं की जाती) को जोड़ने और मैनेज करने के बारे में जानने के लिए, नेटिव डिपेंडेंसी लेख पढ़ें.

यहां दिए गए उदाहरण में, प्रोजेक्ट में रिमोट बाइनरी डिपेंडेंसी (Jetpack Macrobenchmark लाइब्रेरी), लोकल लाइब्रेरी मॉड्यूल डिपेंडेंसी (myLibrary), और प्लगिन डिपेंडेंसी (Android Gradle प्लगिन) जोड़ी गई हैं. अपने प्रोजेक्ट में इन डिपेंडेंसी को जोड़ने के लिए, यहां सामान्य तरीका बताया गया है:

  1. डिपेंडेंसी के उस वर्शन के लिए कोई उपनाम जोड़ें जो आपको वर्शन कैटलॉग फ़ाइल के [versions] सेक्शन में चाहिए. इसे libs.versions.toml कहा जाता है. यह प्रोजेक्ट व्यू में gradle डायरेक्ट्री या Android व्यू में Gradle स्क्रिप्ट के तहत होता है:

    [versions]
    agp = "8.3.0"
    androidx-macro-benchmark = "1.2.2"
    my-library = "1.4"
    
    [libraries]
    ...
    
    [plugins]
    ...
    

    उर्फ़ नामों में डैश या अंडरस्कोर शामिल किए जा सकते हैं. ये उपनाम, नेस्ट की गई वैल्यू जनरेट करते हैं. इनका रेफ़रंस, बिल्ड स्क्रिप्ट में दिया जा सकता है. रेफ़रंस, कैटलॉग के नाम से शुरू होते हैं. यह libs.versions.toml का libs हिस्सा होता है. एक वर्शन वाले कैटलॉग का इस्तेमाल करते समय, हमारा सुझाव है कि आप "libs." की डिफ़ॉल्ट वैल्यू को बनाए रखें.

  2. libs.versions.toml फ़ाइल के [libraries] (रिमोट बाइनरी या लोकल लाइब्रेरी मॉड्यूल के लिए) या [plugins] (प्लगिन के लिए) सेक्शन में, डिपेंडेंसी के लिए कोई उपनाम जोड़ें.

    [versions]
    ...
    
    [libraries]
    androidx-benchmark-macro = { group = "androidx.benchmark", name = "benchmark-macro-junit4", version.ref = "androidx-macro-benchmark" }
    my-library = { group = "com.myapplication", name = "mylibrary", version.ref = "my-library" }
    
    [plugins]
    androidApplication = { id = "com.android.application", version.ref = "agp" }
    

    कुछ लाइब्रेरी, पब्लिश किए गए बिल ऑफ़ मटीरियल (बीओएम) में उपलब्ध होती हैं. यह बीओएम, लाइब्रेरी के फ़ैमिली ग्रुप और उनके वर्शन को ग्रुप करता है. अपने वर्शन कैटलॉग और बिल्ड फ़ाइलों में बीओएम शामिल किया जा सकता है. साथ ही, बीओएम को उन वर्शन को मैनेज करने की अनुमति दी जा सकती है. ज़्यादा जानकारी के लिए, बिल ऑफ़ मटीरियल का इस्तेमाल करना लेख पढ़ें.

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

    Kotlin

    plugins {
      alias(libs.plugins.androidApplication)
    }
    
    dependencies {
      implementation(libs.androidx.benchmark.macro)
      implementation(libs.my.library)
    }

    Groovy

    plugins {
      alias 'libs.plugins.androidApplication'
    }
    
    dependencies {
      implementation libs.androidx.benchmark.macro
      implementation libs.my.library
    }

    प्लगिन के रेफ़रंस में, कैटलॉग के नाम के बाद plugins शामिल होता है. साथ ही, वर्शन के रेफ़रंस में, कैटलॉग के नाम के बाद versions शामिल होता है. वर्शन के रेफ़रंस आम तौर पर नहीं मिलते. वर्शन के रेफ़रंस के उदाहरणों के लिए, एक ही वर्शन नंबर वाली डिपेंडेंसी देखें. लाइब्रेरी के रेफ़रंस में libraries क्वालिफ़ायर शामिल नहीं होता. इसलिए, लाइब्रेरी के एलियास की शुरुआत में versions या plugins का इस्तेमाल नहीं किया जा सकता.

डिपेंडेंसी कॉन्फ़िगर करना

dependencies ब्लॉक में, लाइब्रेरी की डिपेंडेंसी का एलान किया जा सकता है. इसके लिए, कई अलग-अलग डिपेंडेंसी कॉन्फ़िगरेशन में से किसी एक का इस्तेमाल किया जा सकता है. जैसे, implementation को पहले दिखाया गया था. हर डिपेंडेंसी कॉन्फ़िगरेशन, Gradle को डिपेंडेंसी इस्तेमाल करने के बारे में अलग-अलग निर्देश देता है. यहां दी गई टेबल में, Android प्रोजेक्ट में किसी डिपेंडेंसी के लिए इस्तेमाल किए जा सकने वाले हर कॉन्फ़िगरेशन के बारे में बताया गया है.

कॉन्फ़िगरेशन व्यवहार
implementation Gradle, डिपेंडेंसी को कंपाइल क्लासपाथ में जोड़ता है. साथ ही, डिपेंडेंसी को बिल्ड आउटपुट में पैकेज करता है. जब आपका मॉड्यूल, implementation डिपेंडेंसी कॉन्फ़िगर करता है, तो इसका मतलब है कि वह Gradle को यह बताता है कि आपको कंपाइल टाइम पर, मॉड्यूल से अन्य मॉड्यूल में डिपेंडेंसी लीक नहीं करनी है. इसका मतलब है कि निर्भरता को उन अन्य मॉड्यूल के लिए उपलब्ध नहीं कराया जाता जो मौजूदा मॉड्यूल पर निर्भर करते हैं.

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

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

इस कॉन्फ़िगरेशन का इस्तेमाल सावधानी से करें. साथ ही, सिर्फ़ उन डिपेंडेंसी के साथ करें जिन्हें आपको अन्य अपस्ट्रीम उपभोक्ताओं को ट्रांज़िटिव तरीके से एक्सपोर्ट करना है. अगर api डिपेंडेंसी अपना बाहरी एपीआई बदलती है, तो Gradle उन सभी मॉड्यूल को फिर से कंपाइल करता है जिनके पास कंपाइल टाइम पर उस डिपेंडेंसी का ऐक्सेस होता है. api डिपेंडेंसी की संख्या ज़्यादा होने पर, बिल्ड होने में ज़्यादा समय लग सकता है. अगर आपको किसी डिपेंडेंसी के एपीआई को किसी दूसरे मॉड्यूल के लिए उपलब्ध नहीं कराना है, तो लाइब्रेरी मॉड्यूल को implementation डिपेंडेंसी का इस्तेमाल करना चाहिए.

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

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

ध्यान दें: Android Archive (AAR) डिपेंडेंसी के साथ, compileOnly कॉन्फ़िगरेशन का इस्तेमाल नहीं किया जा सकता.

runtimeOnly Gradle, डिपेंडेंसी को सिर्फ़ बिल्ड आउटपुट में जोड़ता है, ताकि रनटाइम के दौरान इसका इस्तेमाल किया जा सके. इसका मतलब है कि इसे कंपाइल क्लासपाथ में नहीं जोड़ा गया है. Android पर इसका इस्तेमाल बहुत कम किया जाता है. हालांकि, सर्वर ऐप्लिकेशन में इसका इस्तेमाल आम तौर पर किया जाता है, ताकि लॉगिंग की सुविधा दी जा सके. उदाहरण के लिए, कोई लाइब्रेरी ऐसे लॉगिंग एपीआई का इस्तेमाल कर सकती है जिसमें कोई लागू करने की सुविधा शामिल नहीं है. उस लाइब्रेरी का इस्तेमाल करने वाले लोग, उसे implementation डिपेंडेंसी के तौर पर जोड़ सकते हैं. साथ ही, लॉगिंग को लागू करने के लिए runtimeOnly डिपेंडेंसी को शामिल कर सकते हैं.
ksp
kapt
annotationProcessor

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

ऐसी डिपेंडेंसी जोड़ने के लिए, आपको इसे एनोटेशन प्रोसेसर क्लासपाथ में जोड़ना होगा. इसके लिए, ksp, kapt या annotationProcessor कॉन्फ़िगरेशन का इस्तेमाल करें. इन कॉन्फ़िगरेशन का इस्तेमाल करने से, बिल्ड की परफ़ॉर्मेंस बेहतर होती है. ऐसा इसलिए होता है, क्योंकि ये कॉन्फ़िगरेशन, कंपाइल क्लासपाथ को एनोटेशन प्रोसेसर क्लासपाथ से अलग करते हैं. अगर Gradle को कंपाइल क्लासपाथ पर एनोटेशन प्रोसेसर मिलते हैं, तो वह कंपाइल करने से बचने की सुविधा बंद कर देता है. इससे बिल्ड प्रोसेस में लगने वाले समय पर बुरा असर पड़ता है. Gradle 5.0 और इसके बाद के वर्शन, कंपाइल क्लासपाथ पर मिले एनोटेशन प्रोसेसर को अनदेखा करते हैं.

Android Gradle प्लग इन, किसी डिपेंडेंसी को एनोटेशन प्रोसेसर तब मानता है, जब उसकी JAR फ़ाइल में यह फ़ाइल मौजूद हो:

META-INF/services/javax.annotation.processing.Processor

अगर प्लगिन को कोई ऐसा एनोटेशन प्रोसेसर मिलता है जो कंपाइल क्लासपाथ पर है, तो वह बिल्ड से जुड़ी गड़बड़ी दिखाता है.

ksp एक Kotlin Symbol Processor है. इसे Kotlin कंपाइलर चलाता है.

kapt और apt अलग-अलग टूल हैं. ये Kotlin या Java कंपाइलर के एक्ज़ीक्यूट होने से पहले, एनोटेशन को प्रोसेस करते हैं.

कौनसा कॉन्फ़िगरेशन इस्तेमाल करना है, यह तय करते समय इन बातों का ध्यान रखें:

  • अगर कोई प्रोसेसर Kotlin Symbol Processor के तौर पर उपलब्ध है, तो उसे ksp डिपेंडेंसी के तौर पर इस्तेमाल करें. Kotlin Symbol Processors का इस्तेमाल करने के बारे में ज़्यादा जानने के लिए, kapt से ksp पर माइग्रेट करना लेख पढ़ें.
  • अगर प्रोसेसर, Kotlin Symbol Processor के तौर पर उपलब्ध नहीं है, तो:
    • अगर आपके प्रोजेक्ट में Kotlin सोर्स शामिल है (लेकिन इसमें Java सोर्स भी शामिल हो सकता है), तो इसे शामिल करने के लिए kapt का इस्तेमाल करें.
    • अगर आपके प्रोजेक्ट में सिर्फ़ Java सोर्स का इस्तेमाल किया जाता है, तो उसे शामिल करने के लिए annotationProcessor का इस्तेमाल करें.

एनोटेशन प्रोसेसर इस्तेमाल करने के बारे में ज़्यादा जानने के लिए, एनोटेशन प्रोसेसर जोड़ना लेख पढ़ें.

lintChecks

इस कॉन्फ़िगरेशन का इस्तेमाल करके, ऐसी लाइब्रेरी शामिल करें जिसमें Lint चेक शामिल हों. Gradle को इन चेक को तब लागू करना चाहिए, जब वह आपके Android ऐप्लिकेशन प्रोजेक्ट को बना रहा हो.

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

lintPublish Android लाइब्रेरी प्रोजेक्ट में इस कॉन्फ़िगरेशन का इस्तेमाल करें. इससे, आपको Gradle की मदद से उन लिंट चेक को lint.jar फ़ाइल में कंपाइल करने और उन्हें अपने AAR में पैकेज करने में मदद मिलेगी. इस वजह से, आपके एएआर का इस्तेमाल करने वाले प्रोजेक्ट पर भी लिंट चेक लागू होते हैं. अगर आपने पब्लिश किए गए एएआर में लिंट चेक शामिल करने के लिए, पहले lintChecks डिपेंडेंसी कॉन्फ़िगरेशन का इस्तेमाल किया था, तो आपको उन डिपेंडेंसी को माइग्रेट करना होगा. इसके बाद, lintPublish कॉन्फ़िगरेशन का इस्तेमाल किया जा सकेगा.

Kotlin

dependencies {
  // Executes lint checks from the ":checks" project at build time.
  lintChecks(project(":checks"))
  // Compiles lint checks from the ":checks-to-publish" into a
  // lint.jar file and publishes it to your Android library.
  lintPublish(project(":checks-to-publish"))
}

Groovy

dependencies {
  // Executes lint checks from the ':checks' project at build time.
  lintChecks project(':checks')
  // Compiles lint checks from the ':checks-to-publish' into a
  // lint.jar file and publishes it to your Android library.
  lintPublish project(':checks-to-publish')
}

किसी खास बिल्ड वैरिएंट के लिए डिपेंडेंसी कॉन्फ़िगर करना

ऊपर दिए गए सभी कॉन्फ़िगरेशन, सभी बिल्ड वैरिएंट पर डिपेंडेंसी लागू करते हैं. अगर आपको किसी बिल्ड वैरिएंट सोर्स सेट या टेस्टिंग सोर्स सेट के लिए ही डिपेंडेंसी का एलान करना है, तो आपको कॉन्फ़िगरेशन के नाम को कैपिटल लेटर में लिखना होगा. साथ ही, इसके पहले बिल्ड वैरिएंट या टेस्टिंग सोर्स सेट का नाम जोड़ना होगा.

उदाहरण के लिए, implementation कॉन्फ़िगरेशन का इस्तेमाल करके, सिर्फ़ अपने "मुफ़्त" प्रॉडक्ट फ़्लेवर में रिमोट बाइनरी डिपेंडेंसी जोड़ने के लिए, इसका इस्तेमाल करें:

Kotlin

dependencies {
    freeImplementation("com.google.firebase:firebase-ads:21.5.1")
}

Groovy

dependencies {
    freeImplementation 'com.google.firebase:firebase-ads:21.5.1'
}

हालांकि, अगर आपको किसी ऐसे वैरिएंट के लिए डिपेंडेंसी जोड़नी है जिसमें प्रॉडक्ट फ़्लेवर और बिल्ड का तरीका, दोनों शामिल हों, तो आपको कॉन्फ़िगरेशन का नाम शुरू करना होगा:

Kotlin

// Initializes a placeholder for the freeDebugImplementation dependency configuration.
val freeDebugImplementation by configurations.creating

dependencies {
    freeDebugImplementation(project(":free-support"))
}

Groovy

configurations {
    // Initializes a placeholder for the freeDebugImplementation dependency configuration.
    freeDebugImplementation {}
}

dependencies {
    freeDebugImplementation project(":free-support")
}

लोकल टेस्ट और इंस्ट्रुमेंटेड टेस्ट के लिए implementation डिपेंडेंसी जोड़ने का तरीका यहां दिया गया है:

Kotlin

dependencies {
    // Adds a remote binary dependency only for local tests.
    testImplementation("junit:junit:4.12")

    // Adds a remote binary dependency only for the instrumented test APK.
    androidTestImplementation("androidx.test.espresso:espresso-core:3.6.1")
}

Groovy

dependencies {
    // Adds a remote binary dependency only for local tests.
    testImplementation 'junit:junit:4.12'

    // Adds a remote binary dependency only for the instrumented test APK.
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.6.1'
}

हालांकि, कुछ कॉन्फ़िगरेशन इस स्थिति में काम नहीं करते. उदाहरण के लिए, androidTest पर अन्य मॉड्यूल निर्भर नहीं हो सकते. इसलिए, androidTestApi कॉन्फ़िगरेशन का इस्तेमाल करने पर, आपको यह चेतावनी मिलती है:

WARNING: Configuration 'androidTestApi' is obsolete and has been replaced with
'androidTestImplementation'.

डिपेंडेंसी का क्रम

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

उदाहरण के लिए, अगर आपका प्रोजेक्ट यह एलान करता है:

  • LIB_A और LIB_B पर निर्भर है (इसी क्रम में)
  • साथ ही, LIB_A, LIB_C और LIB_D पर निर्भर करता है (इसी क्रम में)
  • साथ ही, LIB_B भी LIB_C पर निर्भर करता है

इसके बाद, डिपेंडेंसी का फ़्लैट ऑर्डर इस तरह होगा:

  1. LIB_A
  2. LIB_D
  3. LIB_B
  4. LIB_C

इससे यह पक्का हो जाता है कि LIB_A और LIB_B, दोनों LIB_C को बदल सकते हैं. साथ ही, LIB_D को अब भी LIB_B से ज़्यादा प्राथमिकता दी जाती है, क्योंकि LIB_A (जो इस पर निर्भर करता है) को LIB_B से ज़्यादा प्राथमिकता दी जाती है.

अलग-अलग प्रोजेक्ट सोर्स या डिपेंडेंसी से मेनिफ़ेस्ट को मर्ज करने के बारे में ज़्यादा जानने के लिए, एक से ज़्यादा मेनिफ़ेस्ट फ़ाइलों को मर्ज करना लेख पढ़ें.

Play Console के लिए डिपेंडेंसी की जानकारी

AGP, आपके ऐप्लिकेशन को बनाते समय मेटाडेटा शामिल करता है. इस मेटाडेटा में, लाइब्रेरी डिपेंडेंसी के बारे में जानकारी होती है. ये डिपेंडेंसी, आपके ऐप्लिकेशन में कंपाइल की जाती हैं. जब ऐप्लिकेशन अपलोड किया जाता है, तब Play Console इस मेटाडेटा की जांच करता है. इससे, आपके ऐप्लिकेशन में इस्तेमाल किए गए एसडीके और डिपेंडेंसी से जुड़ी जानी-पहचानी समस्याओं के बारे में सूचनाएं मिलती हैं. साथ ही, कुछ मामलों में इन समस्याओं को हल करने के लिए कार्रवाई की जा सकने वाली प्रतिक्रिया मिलती है.

डेटा को कंप्रेस किया जाता है. साथ ही, Google Play की साइनिंग कुंजी से एन्क्रिप्ट (सुरक्षित) किया जाता है. इसके बाद, इसे रिलीज़ किए गए ऐप्लिकेशन के साइनिंग ब्लॉक में सेव किया जाता है. हमारा सुझाव है कि इस डिपेंडेंसी फ़ाइल को सुरक्षित रखें, ताकि उपयोगकर्ताओं को सुरक्षित और बेहतर अनुभव मिल सके. ऑप्ट आउट करने के लिए, अपने मॉड्यूल की build.gradle.kts फ़ाइल में यहां दिया गया dependenciesInfo ब्लॉक शामिल करें.

android {
    dependenciesInfo {
        // Disables dependency metadata when building APKs.
        includeInApk = false
        // Disables dependency metadata when building Android App Bundles.
        includeInBundle = false
    }
}

हमारी नीतियों और डिपेंडेंसी से जुड़ी संभावित समस्याओं के बारे में ज़्यादा जानने के लिए, अपने ऐप्लिकेशन में तीसरे पक्ष के एसडीके टूल इस्तेमाल करने के बारे में जानकारी देने वाला हमारा सहायता पेज देखें.

एसडीके की अहम जानकारी

Android Studio, Google Play SDK इंडेक्स में मौजूद सार्वजनिक एसडीके के लिए, वर्शन कैटलॉग फ़ाइल और प्रोजेक्ट स्ट्रक्चर डायलॉग में लिंट चेतावनियां दिखाता है. ऐसा तब होता है, जब ये समस्याएं लागू होती हैं:

  • एसडीके टूल के लेखकों ने उन्हें पुराना बताया है.
  • एसडीके, Play की नीतियों का उल्लंघन करते हैं.
  • एसडीके में सुरक्षा से जुड़े जोखिम मौजूद हैं.
  • एसडीके बनाने वालों ने इन्हें बंद कर दिया है.

चेतावनी मिलने का मतलब है कि आपको उन डिपेंडेंसी को अपडेट करना चाहिए. ऐसा इसलिए, क्योंकि पुराने वर्शन का इस्तेमाल करने से, आने वाले समय में Google Play Console पर पब्लिश करने में समस्या आ सकती है.

वर्शन कैटलॉग के बिना बिल्ड डिपेंडेंसी जोड़ना

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

Kotlin

plugins {
    id("com.android.application")
}

android { ... }

dependencies {
    // Dependency on a remote binary
    implementation("com.example.android:app-magic:12.3")
    // Dependency on a local library module
    implementation(project(":mylibrary"))
}

Groovy

plugins {
    id 'com.android.application'
}

android { ... }

dependencies {
    // Dependency on a remote binary
    implementation 'com.example.android:app-magic:12.3'
    // Dependency on a local library module
    implementation project(':mylibrary')
}

इस बिल्ड फ़ाइल में, "com.example.android" नेमस्पेस ग्रुप के अंदर, "app-magic" लाइब्रेरी के 12.3 वर्शन की डिपेंडेंसी के बारे में बताया गया है. रिमोट बाइनरी डिपेंडेंसी का एलान, यहां दिए गए एलान का शॉर्टहैंड है:

Kotlin

implementation(group = "com.example.android", name = "app-magic", version = "12.3")

Groovy

implementation group: 'com.example.android', name: 'app-magic', version: '12.3'

बिल्ड फ़ाइल, "mylibrary" नाम के Android लाइब्रेरी मॉड्यूल पर भी डिपेंडेंसी का एलान करती है. यह नाम, आपकी settings.gradle.kts फ़ाइल में include: के साथ तय किए गए लाइब्रेरी के नाम से मेल खाना चाहिए. ऐप्लिकेशन बनाते समय, बिल्ड सिस्टम लाइब्रेरी मॉड्यूल को कंपाइल करता है. साथ ही, कंपाइल किए गए कॉन्टेंट को ऐप्लिकेशन में पैकेज करता है.

बिल्ड फ़ाइल, Android Gradle प्लगिन (com.application.android) पर डिपेंडेंसी का एलान भी करती है. अगर आपके पास एक से ज़्यादा ऐसे मॉड्यूल हैं जो एक ही प्लगिन का इस्तेमाल करते हैं, तो आपके पास सभी मॉड्यूल में बिल्ड क्लासपाथ पर प्लगिन का सिर्फ़ एक वर्शन हो सकता है. हर मॉड्यूल की बिल्ड स्क्रिप्ट में वर्शन तय करने के बजाय, आपको रूट बिल्ड स्क्रिप्ट में प्लगिन की डिपेंडेंसी को वर्शन के साथ शामिल करना चाहिए. साथ ही, यह बताना चाहिए कि इसे लागू नहीं करना है. apply false जोड़ने से, Gradle को प्लगिन के वर्शन के बारे में पता चलता है. हालाँकि, इसका इस्तेमाल रूट बिल्ड में नहीं किया जाता. आम तौर पर, रूट बिल्ड स्क्रिप्ट में यह plugins ब्लॉक छोड़कर और कुछ नहीं होता.

Kotlin

plugins {
    id("org.jetbrains.kotlin.android") version "1.9.0" apply false
}

Groovy

plugins {
    id 'com.android.application' version '8.3.0-rc02' apply false
}

अगर आपके पास सिंगल-मॉड्यूल प्रोजेक्ट है, तो मॉड्यूल-लेवल की बिल्ड स्क्रिप्ट में वर्शन की जानकारी साफ़ तौर पर दी जा सकती है. साथ ही, प्रोजेक्ट-लेवल की बिल्ड स्क्रिप्ट को खाली छोड़ा जा सकता है:

Kotlin

plugins {
    id("com.android.application") version "8.3.0"
}

Groovy

plugins {
    id 'com.android.application' version '8.3.0-rc02'
}