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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

android ब्लॉक में मौजूद, अब इस्तेमाल नहीं किया जा रहा एपीआई फ़ंक्शन प्रतिस्थापन
applicationVariants,
libraryVariants,
testVariants, और
unitTestVariants
एजीपी में नई सुविधाएं जोड़ने के लिए, प्लग इन के एक्सटेंशन पॉइंट. इसे 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 एएआर में पैकेज करने के लिए एआईडीएल फ़ाइलें, ताकि इसे इस लाइब्रेरी पर निर्भर लाइब्रेरी और ऐप्लिकेशन के लिए एपीआई के तौर पर दिखाया जा सके. यह अब भी LibraryExtension पर दिखता है, लेकिन अन्य एक्सटेंशन टाइप पर नहीं.

अगर आपने एजीपी 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

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

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

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

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

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

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

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

इसलिए, अपने प्रोजेक्ट को एजीपी 9.0 पर अपग्रेड करते समय, आपको पहले से मौजूद Kotlin पर माइग्रेट करना होगा या ऑप्ट आउट करना होगा.

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

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

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

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

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

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 के पुराने वर्शन पर डाउनग्रेड करना

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

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

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") }
        }
    }
}

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

टेस्ट फ़िक्सचर के लिए आईडीई की सहायता

AGP 9.0 में, टेस्ट फ़िक्सचर के लिए Android Studio IDE की पूरी सुविधा उपलब्ध है.

Fused Library प्लग इन

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

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

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

Android Gradle प्लगिन 9.0 में ये नए बदलाव किए गए हैं:

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

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

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

अगर आपको डिफ़ॉल्ट कंस्ट्रक्टर को सुरक्षित रखना है, तो अपने प्रोजेक्ट के कीप रूल में -keep class A को -keep class A { <init>(); } से बदलें.
android.defaults.buildfeatures.resvalues सभी सबप्रोजेक्ट में resValues को चालू करता है true → false resValues को सिर्फ़ उन सबप्रोजेक्ट में चालू करें जिनमें इसकी ज़रूरत है. इसके लिए, उन प्रोजेक्ट की Gradle बिल्ड फ़ाइलों में यह सेटिंग सेट करें:
android {
  buildFeatures {
    resValues = true
  }
}
android.defaults.buildfeatures.shaders सभी सबप्रोजेक्ट में शेडर कंपाइलेशन की सुविधा चालू करता है true → false शेडर कंपाइलेशन को सिर्फ़ उन सबप्रोजेक्ट में चालू करें जिनमें कंपाइल किए जाने वाले शेडर मौजूद हों. इसके लिए, उन प्रोजेक्ट की Gradle बिल्ड फ़ाइलों में यह सेट करें:
android {
  buildFeatures {
    shaders = true
  }
}
android.r8.proguardAndroidTxt.disallowed AGP 9.0 में, getDefaultProguardFile() सिर्फ़ proguard-android-optimize.txt के साथ काम करेगा, न कि proguard-android.txt के साथ. ऐसा इसलिए किया गया है, ताकि ­dontoptimize फ़्लैग का गलती से इस्तेमाल न हो. यह फ़्लैग proguard-android.txt में शामिल है. false → true अगर आपको ऑप्टिमाइज़ेशन से बचना है, तो कस्टम proguardFile में ­dontoptimize को साफ़ तौर पर बताया जा सकता है. साथ ही, proguard-android-optimize.txt का इस्तेमाल भी किया जा सकता है. अगर हो सके, तो इस फ़ाइल से ­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 false → true पब्लिश की गई लाइब्रेरी से, काम न करने वाले नियमों को हटा देना चाहिए. इंटरनल लाइब्रेरी को, काम न करने वाले लेकिन ज़रूरी नियमों को ऐप्लिकेशन मॉड्यूल में proguardFile में ले जाना चाहिए. android.r8.globalOptionsInConsumerRules.disallowed=false को सेट करके ऑप्ट आउट करें. जब Keep की सभी उपभोक्ता फ़ाइलें साथ काम करने लगें, तो ऑप्ट आउट करने का विकल्प हटा दें.
android.sourceset.disallowProvider AndroidSourceSet डीएसएल का इस्तेमाल करके जनरेट किए गए सोर्स के लिए, प्रोवाइडर को पास करने की अनुमति न दें. false → true जनरेट किए गए सोर्स को रजिस्टर करने के लिए, androidComponents पर Sources एपीआई का इस्तेमाल करें.
android.custom.shader.path.required अगर शेडर कंपाइलेशन की सुविधा चालू है, तो शेडर कंपाइलर पाथ को साफ़ तौर पर local.properties में सेट करना ज़रूरी है. false → true glslc.dir=/path/to/shader-tools को अपने प्रोजेक्ट के local.properties में जोड़ें.

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

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

  • Wear OS ऐप्लिकेशन को एम्बेड करने की सुविधा
    AGP 9.0 में, Wear OS ऐप्लिकेशन को एम्बेड करने की सुविधा हटा दी गई है. यह सुविधा, अब Google Play पर काम नहीं करती. इसमें wearApp कॉन्फ़िगरेशन और AndroidSourceSet.wearAppConfigurationName डीएसएल को हटाना शामिल है. Wear OS पर अपना ऐप्लिकेशन पब्लिश करने का तरीका जानने के लिए, Wear OS पर उपलब्ध कराना देखें.
  • androidDependencies और sourceSets की रिपोर्ट वाला टास्क
  • डेंसिटी स्प्लिट APK के लिए सहायता
    AGP 9.0 में, स्क्रीन डेंसिटी के आधार पर स्प्लिट APK बनाने की सुविधा हटा दी गई है. इस सुविधा और इससे जुड़े एपीआई को हटा दिया गया है. एजीपी 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)
            }
        }
    }
    

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

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

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

हटाए गए एपीआई

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

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

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

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

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

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

अगर आपने Gradle की ये प्रॉपर्टी सेट की हैं, तो AGP 9.0 एक गड़बड़ी दिखाता है.

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

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

R8 में किए गए बदलाव

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

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

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

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 पहले ऑप्टिमाइज़ेशन की अनुमति न दें और श्रिंक करने की अनुमति न दें बिट को सिंथेसाइज़ किए गए कंपैनियन तरीकों में ट्रांसफ़र कर देता था.

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

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

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

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

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

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

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

एमिट की गई डिफ़ॉल्ट सोर्स फ़ाइल को बदलकर r8-map-id-<MAP_ID> करें

यह बदलाव, एजीपी के 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 आउटपुट खराब होना
एजीपी में पहले से मौजूद Kotlin की सुविधा, Kotlin के सोर्ससेट के साथ सिंक नहीं होनी चाहिए
missingDimensionStrategy, अपने नाम से मेल खाने वाले फ़्लेवर को प्राथमिकता देता है. भले ही, वह किसी असंबंधित डाइमेंशन से हो
एजीपी में पहले से मौजूद Kotlin की सुविधा, Kotlin के सोर्ससेट के साथ सिंक नहीं होनी चाहिए
AGP 9.0.0-rc01, kotlin() फ़ंक्शन के ज़रिए Kotlin लाइब्रेरी को रिज़ॉल्व नहीं करता
Built-in-kotlin, maven pom में kotlin-stdlib डिपेंडेंसी कंस्ट्रेंट को पब्लिश नहीं करता
compileSdk और targetSdk के बीच के अंतर के लिए, एक टेस्ट केस जोड़ें
resConfigs की वैल्यू खाली होने पर, aapt से जुड़ी गड़बड़ी का पता नहीं चलता
प्योर Java प्रोजेक्ट, Kotlin stdlib पर निर्भर करता है.
AGP 9.0 में, KotlinMultiplatformAndroidCompilationBuilder की ऐसी प्रॉपर्टी हटाना जिनके इस्तेमाल पर रोक लगा दी गई है
`com.android.tools.build:gradle:9.0.0-alpha05` में केजीपी और gradle-api पर एपीआई डिपेंडेंसी होनी चाहिए
com.android.experimental.built-in-kotlin Gradle प्लगिन का नाम बदलना
AGP9: `variant.sources.kotlin!!.addGeneratedSourceDirectory()` काम नहीं कर रहा है
कंपाइल एसडीके पर Aar मेटाडेटा की जांच के लिए, पुराने डीएसएल का इस्तेमाल किया जाता है
अब इस्तेमाल में नहीं होने वाली `com.android.build.api.dsl.ManagedDevices.devices` प्रॉपर्टी को हटाना
एजीपी में पहले से मौजूद Kotlin की सुविधा, Kotlin के सोर्ससेट के साथ सिंक नहीं होनी चाहिए
अगर उपभोक्ता की कीप फ़ाइल में -dontobfuscate शामिल है, तो Android लाइब्रेरी पब्लिश नहीं हो पाती
ऑप्टिमाइज़ किए गए रिसॉर्स के लिए, मैपिंग प्रिंट करने का कोई विकल्प नहीं है
इस फ़ेज़ के पास होने के बाद, finalizeDsl को कॉल करने पर गड़बड़ी का मैसेज दिखाएं
Jetifier बंद होने पर भी, AGP Jetifier कॉन्फ़िगरेशन को शुरू करता है
Kotlin में बनाया गया, `kotlin.stdlib.default.dependency` के मॉड्यूल और pom फ़ाइलों के लिए सही होने पर, kotlinStdlib को कंपाइल टाइम डिपेंडेंसी के तौर पर नहीं जोड़ता है
नया ऑप्टिमाइज़ेशन डीएसएल, डिफ़ॉल्ट रूप से configuration.txt नहीं बनाता
AGP 8.13.0, किसी मॉड्यूल में नेविगेशन ग्राफ़ की पुष्टि नहीं कर पाता
AGP, अब काम नहीं करने वाले Gradle एपीआई का इस्तेमाल करता है: मल्टी-स्ट्रिंग नोटेशन
minSdkVersion >=21 के साथ लेगसी मल्टीडेक्स लाइब्रेरी का इस्तेमाल करने की कोशिश करने वाले उपयोगकर्ताओं को चेतावनी दें
अगर कोड जनरेट करने के टास्क मौजूद हैं, तो बिल्ड नहीं हो पाता
`android.builtInKotlin=false`, `android.newDsl=false`, और `android.enableLegacyVariantApi=false` के साथ `kotlin-android` प्लग इन का इस्तेमाल करने पर, "एपीआई 'applicationVariants' अब काम नहीं करता" गड़बड़ी का मैसेज दिखेगा
kotlin.stdlib.default.dependency=false होने पर, Kotlin में पहले से मौजूद kotlin-stdlib, बिना वर्शन वाले kotlin-stdlib को रिज़ॉल्व नहीं कर पाता
DexData, किसी फ़ाइल को बंद किए बिना खोलता है. इससे क्लीनअप नहीं हो पाता
AndroidSourceDirectorySet को AGP 9.0 में PatternFilterable को एक्सटेंड करना बंद कर देना चाहिए
सिर्फ़ टेस्ट मॉड्यूल में टेस्ट फ़िक्सचर से जुड़ी गड़बड़ी
टेस्ट फ़िक्सचर में कॉन्टेक्स्ट रिसीवर का इस्तेमाल करने पर, गलत गड़बड़ी दिखना
testFixtures में Kotlin कोड के लिए, IDE से जुड़ी गड़बड़ियां गलत तरीके से दिखती थीं
`kotlin-kapt` के उलट, `legacy-kapt` प्लगिन, एनोटेशन प्रोसेसिंग को स्किप कर देता है
compileSdkSpec.minorApiLevel, SettingsExtension के साथ काम नहीं कर रहा है
[fused lib - public] जनरेट की गई फ़्यूज़्ड लाइब्रेरी में सोर्स शामिल नहीं हैं
extractNativeLibs और useEmbeddedDex, मेनिफ़ेस्ट से नहीं आने चाहिए
AGP 9.0.0-alpha09 में R8 से मिलने वाली चेतावनियां
एजीपी 9.0 में, AndroidSourceSet.jni को हटा दिया गया है. यह अब काम नहीं करता
AGP 9.0 में Installation.installOptions() को हटाएं
AGP 9.0 में BuildType.isRenderscriptDebuggable को हटाना.
android.defaults.buildfeatures.renderscript को हटाएं
`com.android.kotlin.multiplatform.library` क्रैश हो जाता है, जब Gradle से मैनेज किए जा रहे डिवाइसों का इस्तेमाल किया जाता है
`android.defaults.buildfeatures.aidl` डिफ़ॉल्ट gradle.properties फ़्लैग हटाएं
ProGuard फ़ाइल मौजूद न होने पर, बिल्ड नहीं हो पाता
buildconfig defaults gradle.properties फ़्लैग हटाएं
ऐप्लिकेशन के targetSdk की डिफ़ॉल्ट वैल्यू को minSdk के बजाय compileSdk पर आधारित होने के लिए बदलें
`isIncludeAndroidResources` चालू होने पर, AGP 8.12.0 में tools:overrideLibrary के इस्तेमाल को मर्ज करने में `process{Variant}UnitTestManifest` फ़ेल हो जाता है
AGP की वजह से, Gradle में जेवीएम टेस्ट टास्क के लिए, अब काम न करने की चेतावनियां दिखना
DependencyReportTask, कॉन्फ़िगरेशन कैश मेमोरी के साथ काम नहीं करता
AGP 9.0 में, डिफ़ॉल्ट सोर्स/टारगेट Java वर्शन को Java 8 से Java 11 पर स्विच करना
android.useAndroidX की डिफ़ॉल्ट वैल्यू को true पर सेट करें
Kotlin के साथ kapt प्लगिन लागू करते समय, अपवादों को बेहतर तरीके से मैनेज किया जा सकता है.
consumerProguardFiles के लिए, android.proguard.failOnMissingFiles काम नहीं कर रहा है
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 नहीं जोड़ता
लिंट क्लासपाथ में, अलग-अलग वर्शन की डुप्लीकेट क्लास मौजूद हैं
निजी संसाधनों को बदलने का तरीका काम नहीं कर रहा है (tools:override = "true")
गड़बड़ी: इस्तेमाल न किए गए संसाधनों को हटाने से, उनके अनुवाद नहीं हटते. साथ ही, इसके बारे में पूछा भी नहीं जाता
लिंट से चेतावनी मिल रही है कि "K2 कैश मेमोरी को खाली नहीं किया जा सका"
लिंट से चेतावनी मिल रही है कि "K2 कैश मेमोरी को खाली नहीं किया जा सका"
लिंट इंटिग्रेशन
systemPropertyInputs.javaVersion में अंतर होने की वजह से, अलग-अलग JDK वेंडर या माइनर वर्शन में AndroidLintAnalysisTask की कैश मेमोरी का काम न करना
Lint, compileSdk के बावजूद, इंस्टॉल किए गए नए SDK टूल का अपने-आप इस्तेमाल करता है. यह टास्क इनपुट के तौर पर रजिस्टर नहीं होता और कैश मेमोरी को मिटा देता है
Shrinker (R8)
अगर फ़ाइनल रिसॉर्स आईडी का इस्तेमाल किया जाता है, तो R8 की मदद से इस्तेमाल नहीं किए जाने वाले ऑप्टिमाइज़ रिसॉर्स को हटाने की प्रोसेस बिना किसी सूचना के फ़ेल हो जाती है