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

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

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

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

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

AGP 8.8

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

रिसॉर्स कॉन्फ़िगरेशन का इस्तेमाल बंद कर दिया गया है

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

AGP 8.0

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

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

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

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

बदले गए API

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

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

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

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

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

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

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

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

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

सभी क्लास को एक साथ बदलने वाले टास्क को रजिस्टर करने के लिए, 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 recipe देखें. साथ ही, Android बिल्ड टाइप में कस्टम एक्सटेंशन रजिस्टर करने का उदाहरण जानने के लिए, customizeAgpDsl recipe देखें.

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

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

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

AGP 7.2

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

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

AGP 7.2 से, RenderScript API का इस्तेमाल नहीं किया जा सकता. ये टूल काम करते रहेंगे, लेकिन चेतावनियां दिखाएंगे. साथ ही, AGP के आने वाले वर्शन में इन्हें पूरी तरह से हटा दिया जाएगा. 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
          )
      })
  }