'Android Gradle प्लग इन' एपीआई के अपडेट

इस पेज पर, Android Gradle प्लग इन (एजीपी) एपीआई के बंद होने और हटाए जाने की जानकारी को ट्रैक किया जाता है. साथ ही, अपने कोड को अपडेट करने का तरीका बताया जाता है.

एपीआई के बंद होने और हटाए जाने का ट्रैकर

यहां दी गई टेबल में बताया गया है कि एजीपी के किस वर्शन में, एजीपी एपीआई के इस्तेमाल पर रोक लगाई गई और उन्हें हटाया गया.

एपीआई एजीपी के इस वर्शन में अब काम नहीं करता AGP के इस वर्शन से हटाया गया
Component.setAsmFramesComputationMode 7.2
Component.transformClassesWith 7.2
RenderScript 7.2
ट्रांसफ़ॉर्म 7.2 8.0

AGP 8.12

Android Gradle प्लगिन 8.12.0 में, एपीआई से जुड़े ये अहम बदलाव शामिल हैं.

काम करने के तरीके में बदलाव: includeAndroidResources विकल्प, टेस्ट डायरेक्ट्री से मेनिफ़ेस्ट को मर्ज करता है

अब आपके पास अपनी टेस्ट सोर्स डायरेक्ट्री में AndroidManifest.xml फ़ाइल बनाने का विकल्प है. इससे, android.testOptions.unitTests.includeAndroidResources विकल्प का इस्तेमाल करके, यूनिट टेस्ट के लिए मेनिफ़ेस्ट को पसंद के मुताबिक बनाया जा सकता है. टेस्ट मेनिफ़ेस्ट फ़ाइल, ऐप्लिकेशन के मुख्य मेनिफ़ेस्ट में मर्ज हो जाएगी. समस्या #127986458

AGP 8.10

Android Gradle प्लगिन 8.10.0 में, एपीआई से जुड़े ये अहम बदलाव शामिल हैं.

सोर्स लेवल पर नुकसान पहुंचा सकने वाला बदलाव: finalizeDsl के लिए अब पैरामीटर वाले टाइप का इस्तेमाल करना ज़रूरी है

AndroidComponentsExtension को सीधे तौर पर com.android.kotlin.multiplatform.library प्लग इन के साथ इस्तेमाल करने की अनुमति देने के लिए, finalizeDsl पर टाइप बाउंड को कम किया गया.

उदाहरण के लिए, अगर ऐप्लिकेशन और लाइब्रेरी को ऐक्सेस करने के लिए, AndroidComponentsExtension के रॉ टाइप का इस्तेमाल किया जा रहा है, तो:

extensions.getByType(AndroidComponentsExtension::class).finalizeDsl { androidExtension ->
  androidExtension.experimentalProperties["android.example"] = true
}

अपग्रेड करने से पहले या अपग्रेड के दौरान, आपको अपने सोर्स कोड में बदलाव करना होगा. जैसे:

extensions.getByType<AndroidComponentsExtension<CommonExtension<*, *, *, *, *, *>, *, *>>().finalizeDsl { androidExtension ->
  androidExtension.experimentalProperties["android.example"] = true
}

ध्यान दें कि अगर आपको ऐसा finalizeDsl कोड लिखना है जो मौजूदा com.android.library और com.android.application प्लग इन के साथ-साथ नए com.android.kotlin.multiplatform.library प्लग इन के लिए भी काम करे, तो आपको रनटाइम के दौरान टाइप की जांच करनी पड़ सकती है:

extensions.getByType<AndroidComponentsExtension<*, *, *>>().finalizeDsl { androidExtension ->
  when(androidExtension) {
    is CommonExtension<*, *, *, *, *, *> -> androidExtension.experimentalProperties["android.example"] = true
    is KotlinMultiplatformAndroidLibraryExtension -> androidExtension.experimentalProperties["android.example"] = true
  }
}

यह बदलाव सिर्फ़ सोर्स लेवल पर नुकसान पहुंचा सकने वाला बदलाव है और इससे बाइनरी प्लग इन पर कोई असर नहीं पड़ेगा.

AGP 8.8

Android Gradle प्लगिन 8.8 के लिए, एपीआई से जुड़े ज़रूरी अपडेट यहां दिए गए हैं.

संसाधन कॉन्फ़िगरेशन की सुविधा बंद कर दी गई है

संसाधन कॉन्फ़िगरेशन को AGP 8.8 से बंद कर दिया गया है. ऐसा इसलिए किया गया, क्योंकि एजीपी अब अलग-अलग रिसॉर्स डेंसिटी के साथ काम नहीं करता. साथ ही, Google Play Console पर अब ऐप्लिकेशन को ऐप्लिकेशन बंडल के तौर पर पब्लिश करना ज़रूरी है. भाषा कॉन्फ़िगरेशन के लिए, localeFilters डीएसएल का इस्तेमाल करके, आपके ऐप्लिकेशन में काम करने वाली भाषाएं तय की जा सकती हैं. इससे, भाषा के कॉन्फ़िगरेशन को उनसे जुड़े संसाधनों के साथ मैप किया जा सकता है.

AGP 8.0

एजीपी 8.0 के लिए, एपीआई से जुड़े अहम अपडेट यहां दिए गए हैं.

Transform API को हटा दिया गया है

AGP 8.0 और इसके बाद के वर्शन में, Transform एपीआई को हटा दिया गया है. इसका मतलब है कि पैकेज com.android.build.api.transform में मौजूद सभी क्लास हटा दी जाती हैं.

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

रिप्लेसमेंट एपीआई

Transform API की जगह इस्तेमाल करने के लिए, कोई एक एपीआई नहीं है. इसके बजाय, हर इस्तेमाल के उदाहरण के लिए नए और टारगेट किए गए एपीआई उपलब्ध हैं. बदले गए सभी एपीआई, androidComponents {} ब्लॉक में मौजूद हैं. ये सभी एपीआई, एजीपी 7.2 के साथ उपलब्ध हैं.

बाइट कोड को बदलने की सुविधा

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

अपने ऐप्लिकेशन में जनरेट की गई क्लास जोड़ने के लिए सहायता

ऐप्लिकेशन में जनरेट की गई अतिरिक्त क्लास जोड़ने के लिए, MultipleArtifact.ALL_CLASSES_DIRS के साथ Artifacts एपीआई का इस्तेमाल करें. खास तौर पर, इनका इस्तेमाल करें

artifacts.use(TaskProvider)
  .wiredWith(...)
  .toAppend(Artifact.Multiple)

MultipleArtifact.ALL_CLASSES_DIRS के साथ, ताकि जनरेट की गई अन्य डायरेक्ट्री को प्रोजेक्ट क्लास में जोड़ा जा सके. Artifacts API, आपके कस्टम टास्क के आउटपुट के लिए, अपने-आप एक यूनीक जगह चुन लेगा. इस एपीआई को इस्तेमाल करने का तरीका जानने के लिए, addToAllClasses recipe देखें.

पूरे प्रोग्राम के विश्लेषण के आधार पर ट्रांसफ़ॉर्मेशन के लिए सहायता

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

सभी क्लास को एक साथ ट्रांसफ़ॉर्म करने वाले टास्क को रजिस्टर करने के लिए, Android Gradle प्लगिन 7.4 में Artifacts.forScope एपीआई को शामिल किया गया है. मौजूदा प्रोजेक्ट की सभी क्लास को बदलने के लिए, Artifacts.forScope.PROJECT का इस्तेमाल करें. मौजूदा प्रोजेक्ट, इंपोर्ट किए गए प्रोजेक्ट, और सभी बाहरी डिपेंडेंसी में मौजूद सभी क्लास को बदलने के लिए, Artifacts.forScope.ALL का इस्तेमाल करें. यहां दिए गए कोड से पता चलता है कि सभी क्लास को एक साथ ट्रांसफ़ॉर्म करने वाले टास्क को रजिस्टर करने के लिए, Artifacts.forScope.ALL का इस्तेमाल कैसे किया जाता है:

variant.artifacts.forScope(ScopedArtifacts.Scope.ALL)
    .use(taskProvider)
    .toTransform(
        ScopedArtifact.CLASSES,
        ModifyClassesTask::allJars,
        ModifyClassesTask::allDirectories,
        ModifyClassesTask::output,
    )

इस एपीआई को इस्तेमाल करने का उदाहरण देखने के लिए, modifyProjectClasses रेसिपी देखें. साथ ही, Android बिल्ड टाइप में कस्टम एक्सटेंशन को रजिस्टर करने का उदाहरण देखने के लिए, customizeAgpDsl रेसिपी देखें.

अगर आपका इस्तेमाल का उदाहरण किसी भी AndroidComponents एपीआई में शामिल नहीं है, तो गड़बड़ी की शिकायत की जा सकती है.

आम तौर पर इस्तेमाल होने वाले कई प्लग इन, इन नए एपीआई का इस्तेमाल करने के लिए पहले ही माइग्रेट हो चुके हैं. इनमें Firebase परफ़ॉर्मेंस मॉनिटरिंग प्लग इन (1.4.1, एजीपी 8.0 के साथ काम करता है) और Hilt Gradle प्लग इन (2.40.1, एजीपी 8.0 के साथ काम करता है) शामिल हैं. AGP अपग्रेड असिस्टेंट, प्रोजेक्ट डेवलपर को ज़रूरत के हिसाब से, आम तौर पर इस्तेमाल किए जाने वाले प्लग इन अपग्रेड करने में भी मदद करेगा.

अगर तीसरे पक्ष के प्लग इन के ज़रिए Transform API का इस्तेमाल किया जा रहा है, तो प्लग इन बनाने वाले को यह जानकारी दी जा सकती है कि उसे अपने प्लग इन को अपडेट करना होगा, ताकि वह AGP 8.0 के लिए नए एपीआई के साथ काम कर सके.

AGP 7.2

AGP 7.2 के लिए, एपीआई से जुड़े अहम अपडेट यहां दिए गए हैं.

RenderScript अब काम नहीं करता

AGP 7.2 या इसके बाद के वर्शन से, RenderScript एपीआई का इस्तेमाल नहीं किया जा सकता. ये काम करते रहेंगे, लेकिन चेतावनियां ट्रिगर करेंगे. साथ ही, एजीपी के आने वाले वर्शन में इन्हें पूरी तरह से हटा दिया जाएगा. RenderScript से माइग्रेट करने का तरीका जानने के लिए, RenderScript से माइग्रेट करना लेख पढ़ें.

Component.transformClassesWith और Component.setAsmFramesComputationMode का अब इस्तेमाल नहीं किया जा सकता

AGP 7.2 या इसके बाद के वर्शन से, क्लास बाइटकोड इंस्ट्रुमेंटेशन एपीआई Component.transformClassesWith और Component.setAsmFramesComputationMode का इस्तेमाल नहीं किया जा सकता. इन्हें एक नए ब्लॉक, Component.instrumentation में ले जाया गया है. इसमें इंस्ट्रुमेंटेशन प्रोसेस को कॉन्फ़िगर करने से जुड़े सभी एपीआई शामिल हैं. इंस्ट्रुमेंटेशन की इन सुविधाओं का इस्तेमाल जारी रखने के लिए, नए ब्लॉक में मौजूद एपीआई का इस्तेमाल करें. इसके बारे में यहां दिए गए कोड स्निपेट में बताया गया है:

androidComponents {
      onVariants(selector().all(), {
          instrumentation.transformClassesWith(AsmClassVisitorFactoryImpl.class,
                                               InstrumentationScope.Project) { params ->
              params.x = "value"
          }
          instrumentation.setAsmFramesComputationMode(
              COMPUTE_FRAMES_FOR_INSTRUMENTED_METHODS
          )
      })
  }