Android Gradle प्लगिन 9.0.1 (जनवरी 2026)

Android Gradle प्लगिन 9.0 एक मुख्य रिलीज़ है. इसमें एपीआई और व्यवहार से जुड़े बदलाव किए गए हैं.

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

अपग्रेड करने की प्रोसेस को आसान बनाने के लिए, एजेंट की दो स्किल भी उपलब्ध हैं. अगर आपको KMP के अलावा किसी दूसरे ऐप्लिकेशन के लिए, AGP 9 को अपग्रेड करने का तरीका जानना है, तो Android skills repository पर जाएं. KMP ऐप्लिकेशन के लिए, JetBrains की AGP 9 अपग्रेड करने की सुविधा आज़माएं. Android Studio में स्किल इस्तेमाल करने के बारे में ज़्यादा जानने के लिए, स्किल की मदद से एजेंट मोड को बेहतर बनाना लेख पढ़ें.

इनके साथ काम करता है

Android Gradle प्लगिन 9.0, ज़्यादा से ज़्यादा एपीआई लेवल 36.1 के साथ काम करता है. Android Gradle प्लगिन 8.6 के साथ काम करने वाले टूल वर्शन से जुड़ी अन्य ज़रूरी जानकारी यहां देखें:

सबसे पुराना वर्शन डिफ़ॉल्ट वर्शन नोट
ग्रेडल 9.1.0 9.1.0 ज़्यादा जानकारी के लिए, Gradle को अपडेट करने का तरीका देखें.
एसडीके बिल्ड टूल 36.0.0 36.0.0 एसडीके बिल्ड टूल इंस्टॉल करें या कॉन्फ़िगर करें.
एनडीके (NDK) लागू नहीं 28.2.13676358 एनडीके का कोई दूसरा वर्शन इंस्टॉल करें या कॉन्फ़िगर करें.
जेडीके 17 17 ज़्यादा जानने के लिए, जेडीके वर्शन सेट करना लेख पढ़ें.
Kotlin Gradle प्लगिन (KGP) 2.2.10 2.2.10 ज़्यादा जानने के लिए, Kotlin Gradle प्लगिन पर रनटाइम डिपेंडेंसी लेख पढ़ें.

android डीएसएल क्लास अब सिर्फ़ नए सार्वजनिक इंटरफ़ेस लागू करती हैं

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

AGP 9.0 में, सिर्फ़ हमारे नए डीएसएल इंटरफ़ेस का इस्तेमाल किया जाता है. साथ ही, लागू करने के तरीके को नए टाइप में बदल दिया गया है, जो पूरी तरह से छिपे हुए हैं. इससे, काम न करने वाले पुराने वैरिएंट एपीआई का ऐक्सेस भी हट जाता है.

AGP 9.0 पर अपडेट करने के लिए, आपको ये काम करने पड़ सकते हैं:

  • पक्का करें कि आपका प्रोजेक्ट, पहले से मौजूद Kotlin के साथ काम करता हो: org.jetbrains.kotlin.android प्लगिन, नए डीएसएल के साथ काम नहीं करता.
  • KMP प्रोजेक्ट को Android Gradle Library Plugin for KMP पर स्विच करें: org.jetbrains.kotlin.multiplatform प्लगिन का इस्तेमाल, com.android.library और com.android.application प्लगिन के साथ एक ही Gradle सबप्रोजेक्ट में नहीं किया जा सकता. यह नए डीएसएल के साथ काम नहीं करता.

  • अपनी बिल्ड फ़ाइलें अपडेट करें: इंटरफ़ेस में बदलाव करने का मकसद, डीएसएल को ज़्यादा से ज़्यादा एक जैसा रखना है. हालांकि, इसमें कुछ छोटे बदलाव हो सकते हैं.

  • नए डीएसएल और एपीआई को रेफ़रंस करने के लिए, कस्टम बिल्ड लॉजिक अपडेट करें: इंटरनल डीएसएल के सभी रेफ़रंस को, सार्वजनिक डीएसएल इंटरफ़ेस से बदलें. ज़्यादातर मामलों में, यह एक-से-एक रिप्लेसमेंट होगा. applicationVariants और इसी तरह के अन्य एपीआई की जगह, नए androidComponents एपीआई का इस्तेमाल करें. यह प्रोसेस ज़्यादा मुश्किल हो सकती है, क्योंकि androidComponents API को ज़्यादा स्थिर बनाने के लिए डिज़ाइन किया गया है, ताकि प्लगिन लंबे समय तक काम कर सकें. उदाहरणों के लिए, हमारी Gradle Recipes देखें.

  • तीसरे पक्ष के प्लगिन अपडेट करें: ऐसा हो सकता है कि तीसरे पक्ष के कुछ प्लगिन अब भी उन इंटरफ़ेस या एपीआई पर निर्भर हों जो अब उपलब्ध नहीं हैं. उन प्लगिन के ऐसे वर्शन पर माइग्रेट करें जो AGP 9.0 के साथ काम करते हों.

नए डीएसएल इंटरफ़ेस पर स्विच करने से, प्लगिन और Gradle बिल्ड स्क्रिप्ट को इन एपीआई का इस्तेमाल करने से रोका जा सकता है:

android ब्लॉक में बंद किया गया एपीआई फ़ंक्शन प्रतिस्थापन
applicationVariants,
libraryVariants,
testVariants, और
unitTestVariants
AGP में नई सुविधाएं जोड़ने के लिए, प्लगिन के लिए एक्सटेंशन पॉइंट. इसे androidComponents.onVariants एपीआई से बदलें. उदाहरण के लिए:
androidComponents {
    onVariants() { variant ->
        variant.signingConfig
            .enableV1Signing.set(false)
    }
}
ऐसा हो सकता है कि पिछले सभी एपीआई के बदले कोई दूसरा एपीआई उपलब्ध न हो. अगर इस्तेमाल का कोई ऐसा उदाहरण है जो नए वर्शन वाले एपीआई में शामिल नहीं है, तो समस्या की शिकायत करें.
variantFilter इस कुकी की मदद से, चुने गए वैरिएंट को बंद किया जा सकता है. इसे androidComponents.beforeVariants एपीआई से बदलें. उदाहरण के लिए:
androidComponents {
    beforeVariants(
        selector()
            .withBuildType("debug")
            .withFlavor("color", "blue")
    ) { variantBuilder ->
        variantBuilder.enable = false
    }
  }
deviceProvider और
testServer
Android डिवाइसों और एम्युलेटर पर टेस्ट चलाने के लिए, कस्टम टेस्ट एनवायरमेंट रजिस्टर करना. ऐसे डिवाइसों पर स्विच करें जिन्हें Gradle मैनेज करता है.
sdkDirectory,
ndkDirectory,
bootClasspath,
adbExecutable, और
adbExe
कस्टम टास्क के लिए, Android SDK के अलग-अलग कॉम्पोनेंट का इस्तेमाल करना. androidComponents.sdkComponents पर स्विच करें.
registerArtifactType,
registerBuildTypeSourceProvider,
registerProductFlavorSourceProvider,
registerJavaArtifact,
registerMultiFlavorSourceProvider, और
wrapJavaSourceSet
यह सुविधा अब काम नहीं करती. यह सुविधा, Android Studio में जनरेट किए गए सोर्स को हैंडल करने से जुड़ी है. यह AGP 7.2.0 में काम नहीं करती. इन एपीआई के बदले कोई दूसरी सुविधा नहीं जोड़ी जा रही है.
dexOptions dx टूल से जुड़ी पुरानी सेटिंग. इस टूल को d8 से बदल दिया गया है. Android Gradle प्लगिन 7.0 के बाद से, किसी भी सेटिंग का कोई असर नहीं पड़ा है. इसकी जगह कोई दूसरा फ़ंक्शन इस्तेमाल नहीं किया जा सकता.
generatePureSplits झटपट ऐप्लिकेशन के लिए कॉन्फ़िगरेशन स्प्लिट जनरेट करता है. कॉन्फ़िगरेशन स्प्लिट को शिप करने की सुविधा, अब Android ऐप्लिकेशन बंडल में पहले से मौजूद है.
aidlPackagedList लाइब्रेरी के लिए एपीआई के तौर पर इसे उपलब्ध कराने के लिए, AAR में पैकेज की जाने वाली AIDL फ़ाइलें. साथ ही, इस लाइब्रेरी पर निर्भर रहने वाले ऐप्लिकेशन. यह अब भी LibraryExtension पर दिखता है, लेकिन अन्य एक्सटेंशन टाइप पर नहीं दिखता.

अगर आपने AGP 9.0 पर अपडेट किया है और आपको गड़बड़ी का यह मैसेज दिखता है, तो इसका मतलब है कि आपका प्रोजेक्ट अब भी कुछ पुराने टाइप को रेफ़रंस कर रहा है:

java.lang.ClassCastException: class com.android.build.gradle.internal.dsl.ApplicationExtensionImpl$AgpDecorated_Decorated
cannot be cast to class com.android.build.gradle.BaseExtension

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

android.newDsl=false

इसके अलावा, अगर आपको धीरे-धीरे माइग्रेट करना है, तो AGP 9.4 की मदद से अलग-अलग मॉड्यूल को ऑप्ट आउट किया जा सकता है. इसका तरीका जानने के लिए, Variant API मॉड्यूल से ऑप्ट-आउट करना लेख पढ़ें.

AGP 9.0 में, पिछली क्लास को बंद किए गए के तौर पर मार्क किया गया है. इसका मतलब है कि जिन प्रोजेक्ट ने newDsl फ़्लैग से ऑप्ट आउट किया है उन्हें बंद होने की चेतावनियां दिखेंगी. ये चेतावनियां, android ब्लॉक पर भी दिखेंगी.

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

हम सबसे ज़्यादा इस्तेमाल किए जाने वाले प्लगिन के लेखकों से संपर्क कर रहे हैं, ताकि वे नए मोड के साथ काम करने वाले प्लगिन बना सकें और उन्हें रिलीज़ कर सकें. साथ ही, हम Android Studio में AGP अपग्रेड असिस्टेंट को बेहतर बनाते रहेंगे, ताकि आपको माइग्रेट करने में मदद मिल सके.

अगर आपको लगता है कि नए डीएसएल या वैरिएंट एपीआई में कुछ सुविधाएं या क्षमताएं मौजूद नहीं हैं, तो कृपया जल्द से जल्द समस्या की शिकायत करें.

Kotlin में पहले से मौजूद

Android Gradle प्लगिन 9.0 में, Kotlin के लिए पहले से मौजूद सहायता की सुविधा जोड़ी गई है. साथ ही, इसे डिफ़ॉल्ट रूप से चालू किया गया है. इसका मतलब है कि अब आपको Kotlin सोर्स फ़ाइलों को कंपाइल करने के लिए, अपनी बिल्ड फ़ाइलों में org.jetbrains.kotlin.android (या kotlin-android) प्लगिन लागू करने की ज़रूरत नहीं है. इससे AGP के साथ Kotlin को इंटिग्रेट करना आसान हो जाता है. साथ ही, इससे बंद किए गए एपीआई का इस्तेमाल नहीं करना पड़ता और कुछ मामलों में परफ़ॉर्मेंस बेहतर होती है.

इसलिए, जब अपने प्रोजेक्ट को AGP 9.0 पर अपग्रेड किया जाता है, तब आपको बिल्ट-इन Kotlin पर माइग्रेट करना या ऑप्ट आउट करना होगा.

आपके पास उन Gradle सबप्रोजेक्ट के लिए, Kotlin के साथ काम करने की सुविधा को चुनिंदा तौर पर बंद करने का विकल्प भी है जिनमें Kotlin सोर्स नहीं हैं.

Kotlin Gradle प्लगइन पर रनटाइम डिपेंडेंसी

Kotlin के साथ काम करने की सुविधा देने के लिए, Android Gradle प्लगिन 9.0 में अब Kotlin Gradle प्लगिन (KGP) 2.2.10 पर रनटाइम डिपेंडेंसी है. इसका मतलब है कि अब आपको KGP वर्शन के बारे में जानकारी नहीं देनी होगी. साथ ही, अगर KGP के 2.2.10 से कम वर्शन का इस्तेमाल किया जाता है, तो Gradle आपके KGP वर्शन को अपने-आप 2.2.10 पर अपग्रेड कर देगा. इसी तरह, अगर KSP का इस्तेमाल किया जा रहा है और उसका वर्शन 2.2.10-2.0.2 से कम है, तो AGP उसे KGP के वर्शन से मैच करने के लिए 2.2.10-2.0.2 पर अपग्रेड कर देगा.

KGP के नए वर्शन पर अपग्रेड करें

KGP या KSP के नए वर्शन का इस्तेमाल करने के लिए, टॉप-लेवल की build फ़ाइल में यह जानकारी जोड़ें:

buildscript {
    dependencies {
        // For KGP
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:KGP_VERSION")

        // For KSP
        classpath("com.google.devtools.ksp:symbol-processing-gradle-plugin:KSP_VERSION")
    }
}

KGP के पुराने वर्शन पर डाउनग्रेड करना

KGP के वर्शन को सिर्फ़ तब डाउनग्रेड किया जा सकता है, जब आपने बिल्ट-इन Kotlin से ऑप्ट आउट किया हो. ऐसा इसलिए है, क्योंकि AGP 9.0 में Kotlin को डिफ़ॉल्ट रूप से चालू किया जाता है. साथ ही, Kotlin के लिए KGP 2.2.10 या इसके बाद के वर्शन की ज़रूरत होती है.

KGP या KSP के पुराने वर्शन का इस्तेमाल करने के लिए, टॉप-लेवल की अपनी बिल्ड फ़ाइल में उस वर्शन की जानकारी दें. इसके लिए, स्ट्रिक्ट वर्शन का एलान करें:

buildscript {
    dependencies {
        // For KGP
        classpath("org.jetbrains.kotlin:kotlin-gradle-plugin") {
            version { strictly("KGP_VERSION") }
        }

        // For KSP
        classpath("com.google.devtools.ksp:symbol-processing-gradle-plugin") {
            version { strictly("KSP_VERSION") }
        }
    }
}

ध्यान दें कि KGP के 2.0.0 वर्शन पर डाउनग्रेड किया जा सकता है.

टेस्ट फ़िक्चर के लिए IDE की सुविधा

AGP 9.0 में, Android Studio IDE के साथ टेस्ट फ़िक्चर का इस्तेमाल किया जा सकता है.

Fused Library Plugin

फ़्यूज़्ड लाइब्रेरी प्लगिन (प्रीव्यू) की मदद से, एक से ज़्यादा लाइब्रेरी को एक Android लाइब्रेरी एएआर के तौर पर पब्लिश किया जा सकता है. इससे आपके उपयोगकर्ताओं के लिए, पब्लिश किए गए आर्टफ़ैक्ट पर भरोसा करना आसान हो सकता है.

शुरू करने के बारे में जानकारी के लिए, फ़्यूज़्ड लाइब्रेरी की मदद से, एक से ज़्यादा Android लाइब्रेरी को एक के तौर पर पब्लिश करना लेख पढ़ें.

व्यवहार में हुए बदलाव

Android Gradle प्लगिन 9.0 में ये नई सुविधाएं जोड़ी गई हैं:

व्यवहार सुझाव
Android Gradle प्लगिन 9.0, डिफ़ॉल्ट रूप से NDK के r28c वर्शन का इस्तेमाल करता है. आपको जिस NDK वर्शन का इस्तेमाल करना है उसे साफ़ तौर पर बताएं.
Android Gradle प्लगिन 9.0 में, लाइब्रेरी का इस्तेमाल करने वाले लोगों को डिफ़ॉल्ट रूप से, कंपाइल SDK टूल के एक ही या इससे ज़्यादा नए वर्शन का इस्तेमाल करना होता है. किसी लाइब्रेरी का इस्तेमाल करते समय, उसी या उससे ज़्यादा कंपाइल एसडीके का इस्तेमाल करें. अगर ऐसा नहीं किया जा सकता या आपको लाइब्रेरी का इस्तेमाल करने वाले लोगों को स्विच करने के लिए ज़्यादा समय देना है, तो AarMetadata.minCompileSdk को साफ़ तौर पर सेट करें.

AGP 9.0 में, Gradle की इन प्रॉपर्टी की डिफ़ॉल्ट वैल्यू अपडेट की गई हैं. अपग्रेड करते समय, AGP 8.13 के व्यवहार को बनाए रखने का विकल्प मिलता है:

प्रॉपर्टी फ़ंक्शन AGP 8.13 से AGP 9.0 में बदलाव सुझाव
android.newDsl android ब्लॉक के लेगसी वर्शन को दिखाए बिना, नए डीएसएल इंटरफ़ेस का इस्तेमाल करें.
इसका यह भी मतलब है कि अब लेगसी वैरिएंट एपीआई, जैसे कि android.applicationVariants को ऐक्सेस नहीं किया जा सकता.
falsetrue android.newDsl=false को सेट करके, इससे ऑप्ट आउट किया जा सकता है.
आपके प्रोजेक्ट में इस्तेमाल किए जाने वाले सभी प्लगिन और बिल्ड लॉजिक के साथ काम करने वाले प्लगिन का इस्तेमाल करने के बाद, ऑप्ट आउट करने की सुविधा हटा दें.
android.builtInKotlin इस विकल्प को चालू करने पर, Kotlin में पहले से मौजूद सुविधाएं चालू हो जाती हैं falsetrue अगर हो सके, तो बिल्ट-इन Kotlin पर माइग्रेट करें या ऑप्ट आउट करें.
android.uniquePackageNames यह नियम लागू करता है कि हर लाइब्रेरी के लिए पैकेज का नाम अलग-अलग हो. falsetrue अपने प्रोजेक्ट में मौजूद सभी लाइब्रेरी के लिए, पैकेज के यूनीक नाम तय करें. अगर ऐसा नहीं किया जा सकता, तो माइग्रेट करते समय इस फ़्लैग को बंद किया जा सकता है.
android.useAndroidx डिफ़ॉल्ट रूप से androidx डिपेंडेंसी का इस्तेमाल करें. falsetrue androidx डिपेंडेंसी को अपनाएं.
android.default.androidx.test.runner डिफ़ॉल्ट रूप से androidx.test.runner.AndroidJUnitRunner क्लास का इस्तेमाल करके, उपयोगकर्ता के डिवाइस पर टेस्ट चलाएं. इससे, बंद हो चुकी InstrumentationTestRunner क्लास का डिफ़ॉल्ट इस्तेमाल बंद हो जाएगा
android {
  defaultConfig {
    testInstrumentationRunner = "..."
  }
}
falsetrue AndroidJUnitRunner को अपनाएं या अपने कस्टम testInstrumentationRunner को साफ़ तौर पर बताएं.
android.dependency.useConstraints यह कॉन्फ़िगरेशन के बीच, डिपेंडेंसी की शर्तों के इस्तेमाल को कंट्रोल करता है.
AGP 9.0 में डिफ़ॉल्ट वैल्यू false है. यह सिर्फ़ ऐप्लिकेशन डिवाइस टेस्ट (AndroidTest) में कंस्ट्रेंट का इस्तेमाल करता है. इसे true पर सेट करने से, 8.13 वर्शन के हिसाब से काम करने लगेगा.
truefalse जब तक ज़रूरी न हो, तब तक हर जगह डिपेंडेंसी की शर्तों का इस्तेमाल न करें. इस फ़्लैग के नए डिफ़ॉल्ट को स्वीकार करने से, प्रोजेक्ट इंपोर्ट करने की प्रोसेस में ऑप्टिमाइज़ेशन भी चालू हो जाते हैं. इससे, कई Android लाइब्रेरी सबप्रोजेक्ट वाली बिल्ड को इंपोर्ट करने में लगने वाला समय कम हो जाता है.
android.enableAppCompileTimeRClass ऐप्लिकेशन में, नॉन-फ़ाइनल R क्लास के ख़िलाफ़ कोड कंपाइल करें. इससे ऐप्लिकेशन कंपाइलेशन, लाइब्रेरी कंपाइलेशन के मुताबिक हो जाएगा.
इससे इंक्रीमेंटैलिटी बेहतर होती है. साथ ही, संसाधन प्रोसेसिंग फ़्लो की परफ़ॉर्मेंस को आने वाले समय में ऑप्टिमाइज़ करने का रास्ता खुलता है.
falsetrue कई प्रोजेक्ट, सोर्स कोड में बदलाव किए बिना ही नई सुविधा का इस्तेमाल कर सकते हैं. अगर R क्लास के फ़ील्ड का इस्तेमाल ऐसी किसी जगह पर किया जाता है जहां कॉन्स्टेंट की ज़रूरत होती है, जैसे कि स्विच केस, तो चेन किए गए if स्टेटमेंट का इस्तेमाल करने के लिए रिफ़ैक्टर करें.
android.sdk.defaultTargetSdkToCompileSdkIfUnset यह ऐप्लिकेशन और टेस्ट में, टारगेट एसडीके के वर्शन के लिए डिफ़ॉल्ट वैल्यू के तौर पर, कंपाइल एसडीके के वर्शन का इस्तेमाल करता है.
इस बदलाव से पहले, टारगेट एसडीके वर्शन डिफ़ॉल्ट रूप से, कम से कम एसडीके वर्शन पर सेट होता था.
falsetrue ऐप्लिकेशन और टेस्ट के लिए, टारगेट एसडीके वर्शन के बारे में साफ़ तौर पर बताएं.
android.onlyEnableUnitTestForTheTestedBuildType यह सिर्फ़ टेस्ट किए गए बिल्ड टाइप के लिए यूनिट टेस्ट कॉम्पोनेंट बनाता है.
डिफ़ॉल्ट प्रोजेक्ट में, इससे डीबग के लिए एक यूनिट टेस्ट मिलती है. हालांकि, पहले डीबग या रिलीज़ के लिए यूनिट टेस्ट चलाई जाती थीं.
falsetrue अगर आपके प्रोजेक्ट में डीबग और रिलीज़, दोनों के लिए टेस्ट चलाने की ज़रूरत नहीं है, तो कोई बदलाव करने की ज़रूरत नहीं है.
android.proguard.failOnMissingFiles अगर AGP DSL में बताई गई कोई भी कीप फ़ाइल डिस्क पर मौजूद नहीं है, तो यह विकल्प बिल्ड को गड़बड़ी के साथ फ़ेल कर देता है. इस बदलाव से पहले, फ़ाइल के नाम में टाइप की गई गलतियों की वजह से फ़ाइलों को अनदेखा कर दिया जाता था. falsetrue अमान्य proguard फ़ाइलों के सभी एलान हटाएं
android.r8.optimizedResourceShrinking इससे R8 को, क्लास और Android संसाधनों को एक साथ ध्यान में रखकर, कम Android संसाधनों को सुरक्षित रखने की अनुमति मिलती है. falsetrue अगर आपके प्रोजेक्ट के लिए डेटा सुरक्षित रखने से जुड़े नियम पहले से ही पूरे किए जा चुके हैं, तो आपको कोई बदलाव करने की ज़रूरत नहीं है.
android.r8.strictFullModeForKeepRules इस विकल्प से R8 को कम कोड बनाए रखने की अनुमति मिलती है. ऐसा इसलिए, क्योंकि जब किसी क्लास को बनाए रखा जाता है, तब यह डिफ़ॉल्ट कंस्ट्रक्टर को अपने-आप बनाए नहीं रखता. इसका मतलब है कि -keep class A का मतलब अब -keep class A { <init>(); }
नहीं है
falsetrue अगर आपके प्रोजेक्ट के लिए डेटा सुरक्षित रखने से जुड़े नियम पहले से ही पूरे किए जा चुके हैं, तो आपको कोई बदलाव करने की ज़रूरत नहीं है.

बदलें -keep class A को -keep class A { <init>(); } से. ऐसा उन मामलों में करें जहां आपको डिफ़ॉल्ट कंस्ट्रक्टर को सुरक्षित रखना है.
android.defaults.buildfeatures.resvalues यह सभी सबप्रोजेक्ट में resValues को चालू करता है truefalse सिर्फ़ उन सबप्रोजेक्ट में resValues को चालू करें जिनमें इसकी ज़रूरत है. इसके लिए, उन प्रोजेक्ट की Gradle बिल्ड फ़ाइलों में यह सेटिंग करें:
android {
  buildFeatures {
    resValues = true
  }
}
android.defaults.buildfeatures.shaders इस विकल्प से, सभी सबप्रोजेक्ट में शेडर कंपाइलेशन की सुविधा चालू हो जाती है truefalse सिर्फ़ उन सबप्रोजेक्ट में शेडर कंपाइलेशन चालू करें जिनमें कंपाइल किए जाने वाले शेडर मौजूद हैं. इसके लिए, उन प्रोजेक्ट की Gradle बिल्ड फ़ाइलों में यह सेटिंग करें:
android {
  buildFeatures {
    shaders = true
  }
}
android.r8.proguardAndroidTxt.disallowed AGP 9.0 में, getDefaultProguardFile() सिर्फ़ proguard-android-optimize.txt के साथ काम करेगा, न कि proguard-android.txt के साथ. ऐसा इसलिए किया जाता है, ताकि ­dontoptimize फ़्लैग का इस्तेमाल गलती से न हो. यह फ़्लैग, proguard-android.txt में शामिल है. falsetrue अगर आपको ऑप्टिमाइज़ेशन से बचना है, तो proguard-android-optimize.txt का इस्तेमाल करने के साथ-साथ, कस्टम proguardFile में ­dontoptimize को साफ़ तौर पर बताया जा सकता है. अगर हो सके, तो इस फ़ाइल से ­dontoptimize फ़्लैग हटा दें. इससे R8 ऑप्टिमाइज़ेशन के फ़ायदे कम हो जाते हैं. अगर ऐसा नहीं है, तो android.r8.globalOptionsInConsumerRules.disallowed=false को सेट करके ऑप्ट आउट करें.
android.r8.globalOptionsInConsumerRules.disallowed AGP 9.0 से, Android लाइब्रेरी और फ़ीचर मॉड्यूल को पब्लिश नहीं किया जा सकेगा. ऐसा तब होगा, जब उपभोक्ता कीप फ़ाइलों में Proguard के कॉन्फ़िगरेशन में कोई समस्या होगी. उपयोगकर्ता के पास ऐसी फ़ाइलें होती हैं जिनमें ­dontoptimize या ­dontobfuscate जैसे ग्लोबल विकल्प शामिल होते हैं. इनका इस्तेमाल सिर्फ़ ऐप्लिकेशन मॉड्यूल में किया जाना चाहिए. साथ ही, इनसे लाइब्रेरी का इस्तेमाल करने वाले लोगों के लिए ऑप्टिमाइज़ेशन के फ़ायदे कम हो सकते हैं. अगर Android ऐप्लिकेशन मॉड्यूल को पहले से कंपाइल की गई किसी डिपेंडेंसी (JAR या AAR) में एम्बेड किया गया है, तो मॉड्यूल कंपाइलेशन के दौरान ऐसे ग्लोबल विकल्पों को अनदेखा कर दिया जाएगा. यह कब होता है, यह देखने के लिए configuration.txt फ़ाइल देखें. आम तौर पर, यह फ़ाइल <app_module>/build/outputs/mapping/<build_variant>/configuration.txt जैसे पाथ में होती है. इसमें इस तरह की टिप्पणियां होती हैं: # REMOVED CONSUMER RULE: ­dontoptimize falsetrue पब्लिश की गई लाइब्रेरी में, काम न करने वाले नियमों को हटा देना चाहिए. इंटरनल लाइब्रेरी को, काम न करने वाले लेकिन ज़रूरी नियमों को ऐप्लिकेशन मॉड्यूल में मौजूद proguardFile में ले जाना चाहिए. android.r8.globalOptionsInConsumerRules.disallowed=false सेट करके ऑप्ट आउट करें. जब आपकी सभी उपभोक्ता जानकारी वाली फ़ाइलें, ज़रूरी शर्तों के मुताबिक हो जाएं, तब ऑप्ट आउट करने की सुविधा हटा दें.
android.sourceset.disallowProvider AndroidSourceSet डीएसएल का इस्तेमाल करके जनरेट किए गए सोर्स के लिए, पासिंग प्रोवाइडर को अनुमति न दें. falsetrue जनरेट किए गए सोर्स रजिस्टर करने के लिए, androidComponents पर Sources एपीआई का इस्तेमाल करें.
android.custom.shader.path.required अगर शेडर कंपाइलेशन चालू है, तो local.properties में शेडर कंपाइलर का पाथ साफ़ तौर पर सेट करना ज़रूरी है. falsetrue अपने प्रोजेक्ट के local.properties में glslc.dir=/path/to/shader-tools जोड़ें.

हटा दी गई सुविधाएं

Android Gradle प्लगिन 9.0 में, ये सुविधाएं हटा दी गई हैं:

  • Wear OS ऐप्लिकेशन को एम्बेड करने की सुविधा
    AGP 9.0 में, Wear OS ऐप्लिकेशन को एम्बेड करने की सुविधा हटा दी गई है. यह सुविधा अब Play में काम नहीं करती. इसमें wearApp कॉन्फ़िगरेशन और AndroidSourceSet.wearAppConfigurationName DSL को हटाना शामिल है. अपने ऐप्लिकेशन को Wear OS पर पब्लिश करने का तरीका जानने के लिए, Wear OS पर ऐप्लिकेशन उपलब्ध कराना लेख पढ़ें.
  • androidDependencies और sourceSets रिपोर्ट टास्क
  • डेंसिटी के हिसाब से जनरेट किए गए, बँटे हुए APK की सुविधा
    AGP 9.0 में, स्क्रीन डेंसिटी के हिसाब से बँटे हुए APK जनरेट करने की सुविधा हटा दी गई है. इस सुविधा और इससे जुड़े एपीआई को हटा दिया गया है. AGP 9.0 या उसके बाद के वर्शन का इस्तेमाल करके, स्क्रीन डेंसिटी के आधार पर APK को स्प्लिट करने के लिए, ऐप्लिकेशन बंडल का इस्तेमाल करें.

बदला गया डीएसएल

Android Gradle प्लगिन 9.0 में, डीएसएल से जुड़े ये बदलाव किए गए हैं:

  • CommonExtension के पैरामीटर को हटा दिया गया है.

    यह बदलाव सिर्फ़ सोर्स लेवल पर किया गया है, ताकि आने वाले समय में सोर्स लेवल पर होने वाले बदलावों से बचा जा सके. हालांकि, इसका यह भी मतलब है कि ब्लॉक करने के तरीकों को CommonExtension से ApplicationExtension, LibraryExtension, DynamicFeatureExtension, और TestExtension पर ले जाना होगा.

    अपने प्रोजेक्ट को AGP 9.0 पर अपग्रेड करते समय, Gradle प्लगिन कोड को फिर से फ़ैक्टर करें. यह कोड, उन पैरामीटर या ब्लॉक के तरीकों का इस्तेमाल करता है. उदाहरण के लिए, टाइप पैरामीटर को हटाने के लिए इस प्लगिन को अपडेट किया गया है. साथ ही, अब यह हटाए गए ब्लॉक के तरीकों पर निर्भर नहीं करता:

    AGP 8.13

    val commonExtension: CommonExtension<*, *, *, *, *, *> =
            extensions.getByType(CommonExtension::class)
    commonExtension.apply {
        defaultConfig {
            minSdk {
                version = release(28)
            }
        }
    }
    

    AGP 9.0

    val commonExtension: CommonExtension =
            extensions.getByType(CommonExtension::class)
    commonExtension.apply {
        defaultConfig.apply {
            minSdk {
                version = release(28)
            }
        }
    }
    

    जो प्लगिन, AGP के कई वर्शन को टारगेट करते हैं उनके लिए, सीधे तौर पर getter का इस्तेमाल करना, AGP के 9.0 से पहले के वर्शन के साथ बाइनरी के तौर पर काम करता है.

डीएसएल हटाया गया

Android Gradle प्लगिन 9.0 में ये सुविधाएं हटा दी गई हैं:

हटाए गए एपीआई

Android Gradle प्लगिन 9.0 में ये सुविधाएं हटा दी गई हैं:

हटाई गई Gradle प्रॉपर्टी

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

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

प्रॉपर्टी फ़ंक्शन प्रतिस्थापन
android.defaults.buildfeatures.aidl यह सभी सबप्रोजेक्ट में AIDL कंपाइलेशन की सुविधा चालू करता है सिर्फ़ उन सबप्रोजेक्ट में AIDL कंपाइलेशन चालू करें जिनमें AIDL सोर्स मौजूद हैं. इसके लिए, उन प्रोजेक्ट की Gradle बिल्ड फ़ाइलों में यह प्रॉपर्टी सेट करें:
android {
  buildFeatures {
    aidl = true
  }
}
AIDL सोर्स वाली हर सबप्रोजेक्ट की Gradle बिल्ड फ़ाइल में
android.defaults.buildfeatures.renderscript यह सभी सबप्रोजेक्ट में RenderScript कंपाइलेशन को चालू करता है सिर्फ़ उन सबप्रोजेक्ट में renderscript कंपाइलेशन चालू करें जिनमें renderscript सोर्स मौजूद हैं. इसके लिए, उन प्रोजेक्ट की Gradle बिल्ड फ़ाइलों में यह प्रॉपर्टी सेट करें:
android {
  buildFeatures {
    renderScript = true
  }
}

लागू की गई Gradle प्रॉपर्टी

AGP 9.0 में, इन Gradle प्रॉपर्टी को सेट करने पर गड़बड़ी होती है.

Android Gradle प्लगिन अपग्रेड असिस्टेंट, इन प्रॉपर्टी का इस्तेमाल करने वाले प्रोजेक्ट को AGP 9.0 पर अपग्रेड नहीं करेगा.

प्रॉपर्टी फ़ंक्शन
android.r8.integratedResourceShrinking अब रिसॉर्स श्रिंकिंग की प्रोसेस हमेशा R8 के हिस्से के तौर पर चलती है. इसे लागू करने का पिछला तरीका हटा दिया गया है.
android.enableNewResourceShrinker.preciseShrinking इस्तेमाल नहीं किए जाने वाले रिसॉर्स को हटाने की प्रोसेस में अब हमेशा सटीक तरीके से रिसॉर्स हटाए जाते हैं. इससे ज़्यादा रिसॉर्स हटाए जा सकते हैं.

R8 में बदलाव

AGP 9.0.0 में, R8 से जुड़े ये बदलाव शामिल हैं.

कॉन्फ़िगरेशन का नया विकल्प -processkotlinnullchecks

हमने Kotlin में नल चेक की प्रोसेसिंग के लिए, R8 को कॉन्फ़िगर करने का नया विकल्प -processkotlinnullchecks जोड़ा है. इस विकल्प के लिए, एक ज़रूरी आर्ग्युमेंट की ज़रूरत होती है. इसकी वैल्यू, इन तीन वैल्यू में से कोई एक होनी चाहिए: keep, remove_message, और remove. यह विकल्प, Kotlin कंपाइलर की ओर से जोड़े गए इन नल चेक को प्रोसेस करता है:

class kotlin.jvm.internal.Intrinsics {
  void checkNotNull(java.lang.Object);
  void checkNotNull(java.lang.Object, java.lang.String);
  void checkExpressionValueIsNotNull(
      java.lang.Object, java.lang.String);
  void checkNotNullExpressionValue(
      java.lang.Object, java.lang.String);
  void checkReturnedValueIsNotNull(
      java.lang.Object, java.lang.String);
  void checkReturnedValueIsNotNull(
      java.lang.Object, java.lang.String, java.lang.String);
  void checkFieldIsNotNull(java.lang.Object, java.lang.String);
  void checkFieldIsNotNull(
      java.lang.Object, java.lang.String, java.lang.String);
  void checkParameterIsNotNull(java.lang.Object, java.lang.String);
  void checkNotNullParameter(java.lang.Object, java.lang.String);
}

विकल्पों की वैल्यू को सबसे कम से लेकर सबसे ज़्यादा तक के क्रम में लगाया गया है. इनका असर इस तरह पड़ता है:

  • keep से जांचों में कोई बदलाव नहीं होता.
  • remove_message, जांच करने के हर तरीके के कॉल को कॉल के पहले आर्ग्युमेंट पर getClass() के कॉल में बदल देता है. इससे, शून्य की जांच को असरदार तरीके से बनाए रखा जाता है, लेकिन बिना किसी मैसेज के.
  • remove से, जांचों को पूरी तरह से हटा दिया जाता है.

डिफ़ॉल्ट रूप से R8, remove_message का इस्तेमाल करता है. -processkotlinnullchecks की कोई भी जानकारी, इसे ओवरराइड कर देगी. इसे एक से ज़्यादा बार सबमिट करने पर, सबसे सटीक वैल्यू का इस्तेमाल किया जाता है.

कंपैनियन तरीकों के लिए, जानकारी सेव करने की सुविधा को बंद करना

जब कीप नियम, इंटरफ़ेस के उन तरीकों से मेल खाते हैं जिन पर डिसुगरिंग लागू होती है, तो R8 पहले disallow optimization और disallow shrinking बिट को सिंथेसाइज़ किए गए कंपैनियन तरीकों में इंटरनल तौर पर ट्रांसफ़र करता था.

AGP 9.0 से, कंपैनियन तरीकों पर कीप के नियम लागू नहीं होते. यह इस बात से मेल खाता है कि कीप नियमों को कंपाइलर के बनाए गए अन्य फ़ील्ड/तरीकों/क्लास पर लागू नहीं किया जाता.

ऑप्टिमाइज़ेशन की अनुमति न दें और सिकुड़ने की अनुमति न दें बिट को कंपैनियन तरीकों में ट्रांसफ़र करके, पहले इस इस्तेमाल के उदाहरण के लिए सहायता दी जाती थी:

  1. default/static/private इंटरफ़ेस के तरीकों वाली लाइब्रेरी को minSdk < 24 के साथ DEX में कंपाइल करें. साथ ही, ऐसे नियम बनाएं जिनसे इंटरफ़ेस के तरीके बने रहें.
  2. क्लाथपाथ और -applymapping पर लाइब्रेरी के साथ ऐप्लिकेशन कंपाइल करें.
  3. ऐप्लिकेशन और लाइब्रेरी को मर्ज करें.

ध्यान दें कि यह सिर्फ़ -applymapping के साथ काम करता है, क्योंकि disallow obfuscation बिट को कंपैनियन तरीकों में ट्रांसफ़र नहीं किया जाता. इसका मतलब है कि पहले चरण में जनरेट की गई कंपैनियन क्लास में, तरीके के नाम छिपाए गए होंगे.

minSdk <24 के लिए, अब इस इस्तेमाल के उदाहरण को स्वीकार नहीं किया जाएगा. इस समस्या को हल करने के लिए, यह तरीका अपनाएं:

  1. minSdk < 24 वाले क्लास फ़ाइलों के लिए, default/static/private इंटरफ़ेस के तरीकों का इस्तेमाल करके लाइब्रेरी को डीसुगर करें.
  2. R8 और उन नियमों का इस्तेमाल करके, डीशुगर किए गए आर्टफ़ैक्ट को कंपाइल करें जो इंटरफ़ेस के तरीकों को कंपैनियन क्लास पर रखते हैं.
  3. ऐप्लिकेशन को क्लासपाथ पर मौजूद लाइब्रेरी के साथ कंपाइल करें.
  4. ऐप्लिकेशन और डीशुगर किए गए आर्टफ़ैक्ट को मर्ज करें.

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

डिफ़ॉल्ट रूप से जनरेट होने वाली सोर्स फ़ाइल को r8-map-id-<MAP_ID> में बदलें

यह बदलाव, AGP के 8.12.0 वर्शन से लागू है.

जब रीट्रैसिंग की ज़रूरत होती है, तब किसी क्लास के लिए डिफ़ॉल्ट रूप से जनरेट होने वाले सोर्स फ़ाइल एट्रिब्यूट की वैल्यू SourceFile से बदलकर r8-map-id-<MAP_ID> हो जाती है. रीट्रैसिंग की ज़रूरत तब होती है, जब ओब्फ़स्केशन या ऑप्टिमाइज़ेशन चालू हो.

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

अगर कस्टम सोर्स फ़ाइल एट्रिब्यूट (-renamesourcefileattribute) का इस्तेमाल किया जाता है, तो इस कस्टम सोर्स फ़ाइल एट्रिब्यूट को प्राथमिकता मिलती रहेगी.

ProGuard के साथ काम करने वाले मोड में (जब gradle.properties में android.enableR8.fullMode=false शामिल हो), r8-map-id-<MAP_ID> के सोर्स फ़ाइल एट्रिब्यूट को सिर्फ़ तब लागू किया जाता है, जब SourceFile एट्रिब्यूट को नहीं रखा जाता है. ProGuard के कंपैटिबिलिटी मोड का इस्तेमाल करने वाले ऐप्लिकेशन, अगर अपने स्टैक ट्रेस में मैपिंग फ़ाइल आईडी शामिल करना चाहते हैं, तो उन्हें -keepattributes SourceFile हटाना होगा या R8 के फ़ुल मोड पर माइग्रेट करना होगा.

r8-map-id-<MAP_ID> में इस्तेमाल किया गया मैप आईडी, मैप का पूरा हैश है. यह मैप के हैश का सात वर्णों वाला प्रीफ़िक्स नहीं है, जिसका इस्तेमाल पहले किया जाता था.

L8 डिसुगरिंग में, छोटे किए गए सिंथेटिक नामों के इस्तेमाल की सुविधा चालू करें

D8 से जनरेट की गई सिंथेटिक क्लास के नाम में आम तौर पर सबस्ट्रिंग $$ExternalSynthetic शामिल होता है. इससे पता चलता है कि यह D8 से जनरेट की गई सिंथेटिक क्लास है. इसके अलावा, सिंथेटिक के नाम में सिंथेटिक का टाइप भी शामिल होता है. उदाहरण के लिए, Backport, Lambda. इससे DEX के साइज़ पर बुरा असर पड़ता है, क्योंकि क्लास के नाम स्ट्रिंग पूल में ज़्यादा जगह लेते हैं.

AGP 9.0, L8 (कोर लाइब्रेरी डिसुगरिंग) को कॉन्फ़िगर करता है, ताकि सभी j$ क्लास वाली DEX फ़ाइल, सिंथेटिक क्लास के लिए क्लास के नाम के नए छोटे फ़ॉर्मैट का इस्तेमाल करे. क्लास के नए नाम में संख्या वाला आईडी इस्तेमाल किया गया है. उदाहरण के लिए, $1.

-addconfigurationdebugging के लिए सहायता हटाएं

AGP 9.0, -addconfigurationdebugging के साथ काम नहीं करता. अगर इस फ़्लैग का इस्तेमाल किया जाता है, तो कंपाइलर अब चेतावनी दिखाता है.

D8/R8 से L8 के नियम जनरेट करने की सुविधा हटा दी गई है

यह बदलाव सिर्फ़ उन डेवलपर के लिए है जो D8/R8 कमांड लाइन या एपीआई का सीधे तौर पर इस्तेमाल करते हैं.

R8 9.0, D8 और R8 से L8 के लिए कीप रूल जनरेट करने की सुविधा हटा देता है. इसके बजाय, आपको TraceReferences का इस्तेमाल करना चाहिए.

खास तौर पर, D8Command.builder.setDesugaredLibraryKeepRuleConsumer और R8Command.Builder.setDesugaredLibraryKeepRuleConsumer तरीकों को हटा दिया गया है. साथ ही, D8 और R8 के कमांड लाइन विकल्पों से --desugared-lib-pg-conf-output के लिए सहायता हटा दी गई है.

ठीक की गई समस्याएं

Android Gradle प्लगिन 9.0.0

ठीक की गई समस्याएं
Android Gradle प्लगिन
सुविधा का अनुरोध: AGP के सबसे सही वर्शन को प्रॉपर्टी के तौर पर इंजेक्ट करना
SingleArtifact.VERSION_CONTROL_INFO_FILE को स्टेबलाइज़ करना
androidTest connectedCheck logcat आउटपुट खराब होना
AGP में Kotlin के लिए पहले से मौजूद सपोर्ट को Kotlin के सोर्ससेट के साथ सिंक नहीं किया जाना चाहिए
missingDimensionStrategy, अपने नाम से मेल खाने वाले फ़्लेवर को प्राथमिकता देता है. भले ही, वह किसी ऐसे डाइमेंशन से मिला हो जो उससे जुड़ा न हो
AGP में Kotlin के लिए पहले से मौजूद सपोर्ट को Kotlin के सोर्ससेट के साथ सिंक नहीं किया जाना चाहिए
AGP 9.0.0-rc01, kotlin() फ़ंक्शन के ज़रिए Kotlin लाइब्रेरी को हल नहीं करता
Built-in-kotlin, maven pom में kotlin-stdlib डिपेंडेंसी की शर्त को पब्लिश नहीं करता है
compileSdk और targetSdk के बीच अंतर के लिए, टेस्ट केस जोड़ें
empty resConfigs value leads to obscure aapt error
प्योर Java प्रोजेक्ट में, kotlin stdlib पर डिपेंडेंसी होती है.
AGP 9.0 में, KotlinMultiplatformAndroidCompilationBuilder की ऐसी प्रॉपर्टी हटा दी गई हैं जिनके इस्तेमाल पर रोक लगा दी गई है
`com.android.tools.build:gradle:9.0.0-alpha05` में KGP और gradle-api पर एपीआई डिपेंडेंसी होनी चाहिए
com.android.experimental.built-in-kotlin Gradle प्लगिन का नाम बदलें
AGP9: `variant.sources.kotlin!!.addGeneratedSourceDirectory()` काम नहीं कर रहा है
AAR मेटाडेटा की जांच, कंपाइल एसडीके पर की जाती है. इसके लिए, पुराने डीएसएल का इस्तेमाल किया जाता है
हटा दी गई `com.android.build.api.dsl.ManagedDevices.devices` प्रॉपर्टी को हटाएं
AGP में Kotlin के लिए पहले से मौजूद सपोर्ट को Kotlin के सोर्ससेट के साथ सिंक नहीं किया जाना चाहिए
अगर उपभोक्ता की कीप फ़ाइल में -dontobfuscate शामिल है, तो Android लाइब्रेरी पब्लिश नहीं की जा सकती
ऑप्टिमाइज़ किए गए संसाधनों के लिए प्रिंट मैपिंग के विकल्प उपलब्ध नहीं हैं
इस फ़ेज़ के बाद finalizeDsl को कॉल करने पर गड़बड़ी दिखेगी
AGP, Jetifier के बंद होने पर भी Jetifier कॉन्फ़िगरेशन शुरू करता है
kotlin में बनाया गया यह प्लगिन, kotlinStdlib को कंपाइल टाइम डिपेंडेंसी के तौर पर नहीं जोड़ता है. ऐसा तब होता है, जब `kotlin.stdlib.default.dependency` की वैल्यू, मॉड्यूल और pom फ़ाइलों के लिए सही होती है
नया ऑप्टिमाइज़ेशन डीएसएल, डिफ़ॉल्ट रूप से configuration.txt फ़ाइल नहीं बनाता है
AGP 8.1.3.0, किसी मॉड्यूल में मौजूद नेविगेशन ग्राफ़ की पुष्टि नहीं कर पाता
AGP, बंद हो चुके Gradle API का इस्तेमाल करता है: मल्टी-स्ट्रिंग नोटेशन
minSdkVersion >=21 के साथ लेगसी मल्टीडेक्स लाइब्रेरी का इस्तेमाल करने की कोशिश करने वाले उपयोगकर्ताओं को चेतावनी दें
कोड जनरेट करने वाले टास्क मौजूद होने पर, बिल्ड नहीं हो पाता
`android.builtInKotlin=false`, `android.newDsl=false`, और `android.enableLegacyVariantApi=false` के साथ, `kotlin-android` प्लगिन का इस्तेमाल करने पर "API 'applicationVariants' अब काम नहीं करता" मैसेज दिखेगा
kotlin.stdlib.default.dependency=false होने पर, Kotlin में पहले से मौजूद कंपाइलर, बिना वर्शन वाले kotlin-stdlib को हल नहीं कर पाता
DexData, फ़ाइल को बंद किए बिना खोलता है. इससे फ़ाइल को मिटाने में समस्या आती है
AGP 9.0 में, AndroidSourceDirectorySet को PatternFilterable को एक्सटेंड करना बंद कर देना चाहिए
सिर्फ़ टेस्ट मॉड्यूल में टेस्ट फ़िक्चर से जुड़ी गड़बड़ी
टेस्ट फ़िक्चर में कॉन्टेक्स्ट रिसीवर का इस्तेमाल करते समय गलत गड़बड़ी
testFixtures में Kotlin कोड के लिए, आईडीई से जुड़ी गलतियां
`legacy-kapt` प्लगिन, `kotlin-kapt` के उलट एनोटेशन प्रोसेसिंग को स्किप कर देता है
compileSdkSpec.minorApiLevel, SettingsExtension के साथ काम नहीं कर रहा है
[fused lib - public] Generated fused library does not include sources
extractNativeLibs और useEmbeddedDex, मेनिफ़ेस्ट से नहीं आने चाहिए
AGP 9.0.0-alpha09 में R8 से मिलने वाली चेतावनियां
AGP 9.0 में, AndroidSourceSet.jni को हटाना
AGP 9.0 में Installation.installOptions() हटाएं
AGP 9.0 में BuildType.isRenderscriptDebuggable को हटाएं.
android.defaults.buildfeatures.renderscript को हटाएं
Gradle मैनेज किए गए डिवाइसों के साथ `com.android.kotlin.multiplatform.library` क्रैश हो जाता है
`android.defaults.buildfeatures.aidl` डिफ़ॉल्ट gradle.properties फ़्लैग हटाएं
ProGuard फ़ाइल मौजूद न होने पर, बिल्ड नहीं हो पाता
gradle.properties फ़ाइल से buildconfig के डिफ़ॉल्ट फ़्लैग हटाएं
ऐप्लिकेशन के targetSdk की डिफ़ॉल्ट वैल्यू को minSdk के बजाय compileSdk पर आधारित करने के लिए बदलें
जब `isIncludeAndroidResources` चालू होता है, तब AGP 8.12.0 में `process{Variant}UnitTestManifest`, tools:overrideLibrary के इस्तेमाल को मर्ज नहीं कर पाता
AGP की वजह से, JVM टेस्ट टास्क के लिए Gradle में डेप्रिकेशन की चेतावनियां दिख रही हैं
DependencyReportTask, कॉन्फ़िगरेशन कैश मेमोरी के साथ काम नहीं करता
AGP 9.0 में, डिफ़ॉल्ट सोर्स/टारगेट Java वर्शन को Java 8 से Java 11 पर स्विच करें
android.useAndroidX की डिफ़ॉल्ट वैल्यू को true पर सेट करें
Kotlin में पहले से मौजूद kapt प्लगिन को लागू करने पर बेहतर अपवाद.
android.proguard.failOnMissingFiles, consumerProguardFiles के लिए काम नहीं कर रहा है
Kotlin Gradle प्लगिन की डिपेंडेंसी को 2.2.10 पर अपडेट करें
KGP API का इस्तेमाल करके KotlinJvmAndroidCompilation बनाना
टेस्ट सोर्स पर Kotlin का एक्सप्लिसिट एपीआई मोड लागू किया गया
लिंट
AGP 8.11.0: apply(from = "...") का इस्तेमाल करके .gradle.kts फ़ाइलें जोड़ने पर, lintAnalyzeRelease टास्क का क्रैश होना
Lint ChecksSdkIntAtLeast Check यह नहीं देखता कि एनोटेट की गई वैल्यू सही है या नहीं
Kotlin में पहले से मौजूद कंपाइलर, META-INF में .kotlin_module नहीं जोड़ता है
Lint क्लासपाथ में अलग-अलग वर्शन की डुप्लीकेट क्लास मौजूद हैं
निजी संसाधनों को बदलने का तरीका काम नहीं कर रहा है (tools:override = "true")
बग: इस्तेमाल नहीं किए गए संसाधनों को हटाने पर, उनके अनुवाद भी नहीं हटते. साथ ही, इस बारे में पूछा भी नहीं जाता
लिंट में "Could not clean up K2 caches" चेतावनी दिख रही है
लिंट में "Could not clean up K2 caches" चेतावनी दिख रही है
लिंट इंटिग्रेशन
systemPropertyInputs.javaVersion में अंतर होने की वजह से, अलग-अलग JDK वेंडर या माइनर वर्शन में AndroidLintAnalysisTask की कैश मेमोरी का काम न करना
Lint, compileSdk के बावजूद इंस्टॉल किए गए नए SDK का इस्तेमाल अपने-आप करता है. यह टास्क इनपुट के तौर पर रजिस्टर नहीं होता और कैश मेमोरी को तोड़ता है
Shrinker (R8)
फ़ाइनल रिसॉर्स आईडी का इस्तेमाल करने पर, R8 की ऑप्टिमाइज़ की गई रिसॉर्स श्रिंकिंग सुविधा चुपचाप काम नहीं करती