Android Gradle प्लगिन 9.0 एक मुख्य रिलीज़ है. इसमें एपीआई और व्यवहार में बदलाव किए गए हैं.
Android Gradle प्लगिन 9.0.0 पर अपडेट करने के लिए, Android Gradle प्लगिन अपग्रेड असिस्टेंट का इस्तेमाल करें.
AGP अपग्रेड असिस्टेंट, आपके प्रोजेक्ट को अपग्रेड करते समय मौजूदा व्यवहारों को बनाए रखने में मदद करता है. इससे आपको अपने प्रोजेक्ट को AGP 9.0 का इस्तेमाल करने के लिए अपग्रेड करने की अनुमति मिलती है. भले ही, आप AGP 9.0 में सभी नए डिफ़ॉल्ट को अपनाने के लिए तैयार न हों.
इनके साथ काम करता है
Android Gradle प्लगिन 9.0, ज़्यादा से ज़्यादा एपीआई लेवल 36 के साथ काम करता है. Android Gradle प्लगिन 8.6 के साथ काम करने वाले टूल वर्शन से जुड़ी अन्य ज़रूरी जानकारी यहां देखें:
| कम से कम वर्शन | डिफ़ॉल्ट वर्शन | नोट | |
|---|---|---|---|
| Gradle | 9.1.0 | 9.1.0 | ज़्यादा जानने के लिए, Gradle को अपडेट करने का तरीकादेखें. |
| एसडीके बिल्ड टूल | 36.0.0 | 36.0.0 | एसडीके बिल्ड टूल इंस्टॉल करें या कॉन्फ़िगर करें. |
| एनडीके (NDK) | लागू नहीं | 28.2.13676358 | एनडीके का कोई दूसरा वर्शन इंस्टॉल करें या कॉन्फ़िगर करें. |
| जेडीके | 17 | 17 | ज़्यादा जानने के लिए, जेडीके वर्शन सेट करना लेख पढ़ें. |
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 पर स्विच करें:
com.android.libraryऔरcom.android.applicationप्लगिन के साथ-साथ,org.jetbrains.kotlin.multiplatformप्लगिन का इस्तेमाल करना नए डीएसएल के साथ काम नहीं करता.अपनी बिल्ड फ़ाइलें अपडेट करें: इंटरफ़ेस में बदलाव करने का मकसद, डीएसएल को ज़्यादा से ज़्यादा एक जैसा रखना है. हालांकि, इसमें कुछ छोटे बदलाव हो सकते हैं.
अपने कस्टम बिल्ड लॉजिक को अपडेट करके, नए डीएसएल और एपीआई का रेफ़रंस दें: इंटरनल डीएसएल के सभी रेफ़रंस को, सार्वजनिक डीएसएल इंटरफ़ेस से बदलें. ज़्यादातर मामलों में, यह एक-से-एक रिप्लेसमेंट होगा.
applicationVariantsऔर इसी तरह के अन्य एपीआई की जगह, नएandroidComponentsएपीआई का इस्तेमाल करें. यह प्रोसेस ज़्यादा मुश्किल हो सकती है, क्योंकिandroidComponentsAPI को ज़्यादा स्थिर बनाने के लिए डिज़ाइन किया गया है, ताकि प्लगिन लंबे समय तक काम कर सकें. उदाहरणों के लिए, हमारी 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.0 में, पिछली क्लास को 'अब इस्तेमाल नहीं किया जा सकता' के तौर पर मार्क किया गया है. इसका मतलब है कि जिन प्रोजेक्ट ने newDsl फ़्लैग से ऑप्ट आउट किया है उन्हें बंद होने की चेतावनियां दिखेंगी. ये चेतावनियां, newDsl ब्लॉक पर भी दिखेंगी.android
AGP 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.devtoolsksp:symbol-processing-gradle-plugin:KSP_VERSION")
}
}
KGP के पुराने वर्शन पर डाउनग्रेड करना
KGP के वर्शन को सिर्फ़ तब डाउनग्रेड किया जा सकता है, जब आपने बिल्ट-इन Kotlin से ऑप्ट आउट किया हो. ऐसा इसलिए है, क्योंकि AGP 9.0 में 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.devtoolsksp:symbol-processing-gradle-plugin") {
version { strictly("KSP_VERSION") }
}
}
}
ध्यान दें कि KGP के 2.0.0 वर्शन पर डाउनग्रेड किया जा सकता है.
टेस्ट फ़िक्चर के लिए आईडीई की सुविधा
AGP 9.0 में, Android Studio IDE के लिए टेस्ट फ़िक्चर की सुविधा पूरी तरह से उपलब्ध है.
Fussed Library Plugin
फ़्यूज़्ड लाइब्रेरी प्लगिन (प्रीव्यू) की मदद से, एक से ज़्यादा लाइब्रेरी को एक Android लाइब्रेरी एएआर के तौर पर पब्लिश किया जा सकता है. इससे आपके उपयोगकर्ताओं के लिए, पब्लिश किए गए आर्टफ़ैक्ट पर भरोसा करना आसान हो सकता है.
शुरू करने के बारे में जानकारी के लिए, फ़्यूज़्ड लाइब्रेरी की मदद से, एक से ज़्यादा Android लाइब्रेरी को एक के तौर पर पब्लिश करना लेख पढ़ें.
व्यवहार में बदलाव
Android Gradle प्लगिन 9.0 में ये नई सुविधाएं जोड़ी गई हैं:
| व्यवहार | सुझाव |
|---|---|
Android Gradle प्लगिन 9.0, डिफ़ॉल्ट रूप से NDK के r28c वर्शन का इस्तेमाल करता है.
|
आपको जिस NDK वर्शन का इस्तेमाल करना है उसे साफ़ तौर पर बताएं. |
| Android Gradle प्लगिन 9.0 में, लाइब्रेरी का इस्तेमाल करने वाले लोगों के लिए, कंपाइल SDK टूल के एक ही या इससे ज़्यादा वर्शन का इस्तेमाल करना ज़रूरी है. |
किसी लाइब्रेरी का इस्तेमाल करते समय, उसी या उससे ज़्यादा कंपाइल SDK टूल का इस्तेमाल करें.
अगर ऐसा नहीं किया जा सकता या आपको लाइब्रेरी का इस्तेमाल करने वाले लोगों को स्विच करने के लिए ज़्यादा समय देना है, तो AarMetadata.minCompileSdk को साफ़ तौर पर सेट करें.
|
AGP 9.0 में, Gradle की इन प्रॉपर्टी की डिफ़ॉल्ट वैल्यू अपडेट की गई हैं. इससे आपको अपग्रेड करते समय, AGP 8.13 के व्यवहार को बनाए रखने का विकल्प मिलता है:
| प्रॉपर्टी | फ़ंक्शन | AGP 8.13 से AGP 9.0 में बदलाव | सुझाव |
|---|---|---|---|
android. |
android ब्लॉक के लेगसी वर्शन को दिखाए बिना, नए डीएसएल इंटरफ़ेस का इस्तेमाल करें.इसका यह भी मतलब है कि अब लेगसी वैरिएंट एपीआई, जैसे कि android.applicationVariants
को ऐक्सेस नहीं किया जा सकता.
|
false → true |
android.newDsl=false सेट करके, इससे ऑप्ट आउट किया जा सकता है.आपके प्रोजेक्ट में इस्तेमाल किए गए सभी प्लगिन और बिल्ड लॉजिक के साथ काम करने वाले प्लगिन उपलब्ध होने पर, ऑप्ट आउट करने की सुविधा हटा दें. |
android. |
इस विकल्प को चुनने पर, Kotlin में पहले से मौजूद सुविधाएं चालू हो जाती हैं | false → true |
अगर हो सके, तो बिल्ट-इन Kotlin पर माइग्रेट करें या ऑप्ट आउट करें. |
android. |
यह नियम लागू करता है कि हर लाइब्रेरी का पैकेज का नाम अलग हो. | false → true |
अपने प्रोजेक्ट में मौजूद सभी लाइब्रेरी के लिए, पैकेज के यूनीक नाम डालें. अगर ऐसा नहीं किया जा सकता, तो माइग्रेट करते समय इस फ़्लैग को बंद किया जा सकता है. |
android. |
डिफ़ॉल्ट रूप से androidx
डिपेंडेंसी का इस्तेमाल करें.
|
false → true |
androidx
डिपेंडेंसी का इस्तेमाल करें.
|
android. |
डिफ़ॉल्ट रूप से androidx.test.runner.AndroidJUnitRunner क्लास का इस्तेमाल करके, डिवाइस पर टेस्ट चलाएं. इससे, बंद हो चुकी InstrumentationTestRunner क्लास के डिफ़ॉल्ट इस्तेमाल की जगह androidx.test.runner.AndroidJUnitRunner क्लास का इस्तेमाल किया जा सकेगा
android {
defaultConfig {
testInstrumentationRunner = "..."
}
} |
false → true |
AndroidJUnitRunner को अपनाएं या अपने कस्टम testInstrumentationRunner को साफ़ तौर पर बताएं.
|
android. |
यह कॉन्फ़िगरेशन के बीच, डिपेंडेंसी की शर्तों के इस्तेमाल को कंट्रोल करता है. AGP 9.0 में डिफ़ॉल्ट वैल्यू false है. यह सिर्फ़ ऐप्लिकेशन डिवाइस टेस्ट (AndroidTest) में कंस्ट्रेंट का इस्तेमाल करता है.
इसे true पर सेट करने से, 8.13 वर्शन के हिसाब से काम करने लगेगा.
|
true → false |
जब तक ज़रूरी न हो, तब तक हर जगह डिपेंडेंसी की शर्तों का इस्तेमाल न करें. इस फ़्लैग के नए डिफ़ॉल्ट को स्वीकार करने से, प्रोजेक्ट इंपोर्ट करने की प्रोसेस में ऑप्टिमाइज़ेशन भी चालू हो जाते हैं. इससे, कई Android लाइब्रेरी सबप्रोजेक्ट वाली बिल्ड को इंपोर्ट करने में लगने वाला समय कम हो जाता है. |
android. |
ऐप्लिकेशन में, नॉन-फ़ाइनल R क्लास के ख़िलाफ़ कोड कंपाइल किया गया है. इससे ऐप्लिकेशन कंपाइल करने की प्रोसेस, लाइब्रेरी कंपाइल करने की प्रोसेस के मुताबिक हो जाती है. इससे इंक्रीमेंटैलिटी बेहतर होती है. साथ ही, संसाधन प्रोसेसिंग फ़्लो के लिए, आने वाले समय में परफ़ॉर्मेंस ऑप्टिमाइज़ेशन के लिए रास्ता खुलता है. |
false → true |
कई प्रोजेक्ट, सोर्स कोड में बदलाव किए बिना ही नई सुविधा का इस्तेमाल कर सकते हैं. अगर R क्लास के फ़ील्ड का इस्तेमाल ऐसी किसी जगह पर किया जाता है जहां कॉन्स्टेंट की ज़रूरत होती है, जैसे कि स्विच केस, तो चेन किए गए if स्टेटमेंट का इस्तेमाल करने के लिए रीफ़ैक्टर करें. |
android. |
यह ऐप्लिकेशन और टेस्ट में, टारगेट एसडीके वर्शन के लिए डिफ़ॉल्ट वैल्यू के तौर पर कंपाइल एसडीके वर्शन का इस्तेमाल करता है. इस बदलाव से पहले, टारगेट SDK टूल का वर्शन डिफ़ॉल्ट रूप से, SDK टूल के कम से कम लेवल वाले वर्शन पर सेट होता था. |
false → true |
ऐप्लिकेशन और टेस्ट के लिए, टारगेट एसडीके वर्शन साफ़ तौर पर बताएं. |
android. |
यह सिर्फ़ टेस्ट किए गए बिल्ड टाइप के लिए यूनिट टेस्ट कॉम्पोनेंट बनाता है. डिफ़ॉल्ट प्रोजेक्ट में, इससे डीबग के लिए एक यूनिट टेस्ट मिलती है. हालांकि, पहले डीबग या रिलीज़ के लिए यूनिट टेस्ट चलाई जाती थीं. |
false → true |
अगर आपके प्रोजेक्ट में डीबग और रिलीज़, दोनों के लिए टेस्ट चलाने की ज़रूरत नहीं है, तो कोई बदलाव करने की ज़रूरत नहीं है. |
android. |
अगर AGP DSL में बताई गई कोई भी कीप फ़ाइल डिस्क पर मौजूद नहीं है, तो यह विकल्प गड़बड़ी के साथ बिल्ड को पूरा नहीं करता. इस बदलाव से पहले, फ़ाइल के नाम में टाइप की गई गलतियों की वजह से फ़ाइलों को अनदेखा कर दिया जाता था. | false → true |
proguard.txt फ़ाइल में किए गए अमान्य एलान हटाएं |
android. |
इस विकल्प की मदद से, R8 को कम Android संसाधन रखने की अनुमति मिलती है. ऐसा इसलिए होता है, क्योंकि यह विकल्प क्लास और Android संसाधनों, दोनों पर एक साथ विचार करता है. | false → true |
अगर आपके प्रोजेक्ट के डेटा को सुरक्षित रखने से जुड़े नियम पहले से ही पूरे हैं, तो कोई बदलाव करने की ज़रूरत नहीं है. |
android. |
इस विकल्प की मदद से, R8 किसी क्लास को बनाए रखते समय डिफ़ॉल्ट कंस्ट्रक्टर को बनाए रखने की ज़रूरत नहीं होती. इससे R8 को कम मेमोरी की ज़रूरत पड़ती है.
इसका मतलब है कि -keep class A का मतलब अब -keep class A { <init>(); }नहीं है |
false → true |
अगर आपके प्रोजेक्ट के डेटा को सुरक्षित रखने से जुड़े नियम पहले से ही पूरे हैं, तो कोई बदलाव करने की ज़रूरत नहीं है.
बदलें -keep class A
को
-keep class A { <init>(); }
से. ऐसा उन मामलों में करें जहां आपको डिफ़ॉल्ट कंस्ट्रक्टर को बनाए रखने की ज़रूरत है.
|
android. |
सभी सबप्रोजेक्ट में resValues चालू करता है
|
true → false |
सिर्फ़ उन सबप्रोजेक्ट में resValues को चालू करें जिनमें इसकी ज़रूरत है. इसके लिए, उन प्रोजेक्ट की Gradle बिल्ड फ़ाइलों में यह सेटिंग करें:
android {
buildFeatures {
resValues = true
}
} |
android. |
इस विकल्प से, सभी सबप्रोजेक्ट में शेडर कंपाइलेशन की सुविधा चालू हो जाती है | true → false |
सिर्फ़ उन सबप्रोजेक्ट में शेडर कंपाइल करने की सुविधा चालू करें जिनमें कंपाइल किए जाने वाले शेडर मौजूद हैं. इसके लिए, उन प्रोजेक्ट की Gradle बिल्ड फ़ाइलों में यह सेटिंग करें:
android {
buildFeatures {
shaders = true
}
} |
android. |
AGP 9.0 में, getDefaultProguardFile() सिर्फ़ proguard-android-optimize.txt के साथ काम करेगा, न कि proguard-android.txt के साथ. ऐसा इसलिए किया गया है, ताकि dontoptimize फ़्लैग का इस्तेमाल गलती से न हो. यह फ़्लैग, proguard-android.txt में शामिल है.
|
false → true |
अगर आपको ऑप्टिमाइज़ेशन से बचना है, तो dontoptimize का इस्तेमाल करने के साथ-साथ, कस्टम proguardFile में dontoptimize को साफ़ तौर पर बताया जा सकता है.proguard-android-optimize.txt अगर हो सके, तो इस फ़ाइल से dontoptimize फ़्लैग हटा दें. इससे R8 ऑप्टिमाइज़ेशन के फ़ायदे कम हो जाते हैं. अगर ऐसा नहीं है, तो android.r8.globalOptionsInConsumerRules.disallowed=false को सेट करके ऑप्ट आउट करें.
|
android. |
AGP 9.0 से, Android लाइब्रेरी और सुविधा वाले मॉड्यूल को पब्लिश नहीं किया जा सकेगा. ऐसा तब होगा, जब उपभोक्ता की Keep फ़ाइलों में ProGuard के कॉन्फ़िगरेशन में कोई समस्या होगी. dontoptimize या dontobfuscate जैसे ग्लोबल विकल्पों वाली उपभोक्ता कुकी का इस्तेमाल सिर्फ़ ऐप्लिकेशन मॉड्यूल में किया जाना चाहिए. इससे लाइब्रेरी का इस्तेमाल करने वाले लोगों को ऑप्टिमाइज़ेशन के फ़ायदे कम मिल सकते हैं. अगर Android ऐप्लिकेशन मॉड्यूल में पहले से कंपाइल की गई डिपेंडेंसी (JAR या AAR) एम्बेड की गई है, तो Android ऐप्लिकेशन मॉड्यूल कंपाइलेशन ऐसे किसी भी ग्लोबल विकल्प को अनदेखा कर देगा. यह कब होता है, यह देखने के लिए configuration.txt फ़ाइल देखें. आम तौर पर, यह फ़ाइल <app_module>/build/outputs/mapping/<build_variant>/configuration.txt जैसे पाथ में होती है. इसमें इस तरह की टिप्पणियां होती हैं: # REMOVED CONSUMER RULE: dontoptimize
|
false → true |
पब्लिश की गई लाइब्रेरी में, काम न करने वाले नियमों को हटा देना चाहिए. इंटरनल लाइब्रेरी को, काम न करने वाले लेकिन ज़रूरी नियमों को ऐप्लिकेशन मॉड्यूल में proguardFile में ले जाना चाहिए. android.r8.globalOptionsInConsumerRules.disallowed=false सेट करके ऑप्ट आउट करें. जब आपकी सभी उपभोक्ता फ़ाइलें, ज़रूरी शर्तों के मुताबिक हो जाएं, तब ऑप्ट आउट करने की सुविधा हटा दें.
|
android. |
AndroidSourceSet डीएसएल का इस्तेमाल करके, जनरेट किए गए सोर्स के लिए पासिंग प्रोवाइडर को अनुमति न दें.
|
false → true |
जनरेट किए गए सोर्स रजिस्टर करने के लिए, androidComponents पर Sources एपीआई का इस्तेमाल करें.
|
android. |
अगर शेडर कंपाइलेशन चालू है, तो local.properties में शेडर कंपाइलर का पाथ साफ़ तौर पर सेट करना ज़रूरी है.
|
false → true |
अपने प्रोजेक्ट के local.properties में glslc.dir=/path/to/shader-tools जोड़ें.
|
हटाए गए फ़ीचर
Android Gradle प्लगिन 9.0 में, ये सुविधाएं हटा दी गई हैं:
- Wear OS ऐप्लिकेशन को एम्बेड करने की सुविधा
AGP 9.0 में, Wear OS ऐप्लिकेशन को एम्बेड करने की सुविधा हटा दी गई है. यह सुविधा अब Play में काम नहीं करती. इसमेंwearAppकॉन्फ़िगरेशन औरAndroidSourceSet.wearAppConfigurationNameडीएसएल को हटाना शामिल है. 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 में ये सुविधाएं हटा दी गई हैं:
AndroidSourceSet.jni, क्योंकि यह काम नहीं कर रहा था.AndroidSourceSet.wearAppConfigurationName, क्योंकि यह Wear OS ऐप्लिकेशन को एम्बेड करने की सुविधा को हटाने से जुड़ा है.BuildType.isRenderscriptDebuggable, क्योंकि यह काम नहीं कर रहा था.DependencyVariantSelection. इसेDependencySelectionसे बदल दिया गया है. इसेkotlin.android.localDependencySelectionके तौर पर दिखाया जाता हैInstallation.installOptions(String). इसेInstallation.installOptionsकी बदली जा सकने वाली प्रॉपर्टी से बदल दिया गया है.यह
PostProcessingब्लॉक, एक्सपेरिमेंट के तौर पर उपलब्ध है. हालांकि, यह कभी भी स्टेबल नहीं होता.ProductFlavor.setDimension, जिसेdimensionप्रॉपर्टी से बदल दिया गया हैLanguageSplitOptions, जो सिर्फ़ Google Play झटपट के लिए काम का था. हालांकि, अब यह काम नहीं करता.DensitySplit, क्योंकि यह सुविधा अब काम नहीं करती है. ऐप्लिकेशन बंडल का इस्तेमाल किया जा सकता है.
हटाए गए एपीआई
Android Gradle प्लगिन 9.0 में ये सुविधाएं हटा दी गई हैं:
AndroidComponentsExtension.finalizeDSl. इसेfinalizeDslसे बदल दिया गया हैComponent.transformClassesWith. इसेInstrumentation.transformClassesWithसे बदल दिया गया हैComponent.setAsmFramesComputationMode. इसेInstrumentation.setAsmFramesComputationModeसे बदल दिया गया हैComponentBuilder.enabled. इसकी जगहComponentBuilder.enableने ले ली है.DependenciesInfoBuilder.includedInApk. इसेincludeInApkसे बदल दिया गया हैDependenciesInfoBuilder.includedInBundle. इसेincludeInBundleसे बदल दिया गया हैGeneratesApk.targetSdkVersion. इसेtargetSdkसे बदल दिया गया हैVariant.minSdkVersion. इसेminSdkसे बदल दिया गया हैVariant.maxSdkVersion. इसेmaxSdkसे बदल दिया गया हैVariant.targetSdkVersion. इसेtargetSdkसे बदल दिया गया हैVariant.unitTest, क्योंकि यहcom.android.testप्लगिन पर लागू नहीं होता था.unitTest,VariantBuilderसबटाइप पर उपलब्ध है. यहHasUnitTestतक उपलब्ध है.VariantBuilder.targetSdkऔरtargetSdkPreview, क्योंकि ये लाइब्रेरी में काम के नहीं थे. इसके बजाय,GeneratesApkBuilder.targetSdkयाGeneratesApkBuilder.targetSdkPreviewका इस्तेमाल करें.VariantBuilder.enableUnitTest, क्योंकि यहcom.android.testप्लगिन पर लागू नहीं होता था.enableUnitTest,VariantBuilderसबटाइप पर उपलब्ध है. यहHasUnitTestBuilderतक उपलब्ध है.VariantBuilder.unitTestEnabledको हटा दिया गया है. इसके बजाय,VariantBuilderसबटाइप परenableUnitTestका इस्तेमाल किया जाएगा.enableUnitTestका नामVariantBuilder.unitTestEnabledसे ज़्यादा एक जैसा है.VariantBuilderसबटाइप,HasUnitTestBuilderके साथ काम करते हैं.VariantOutput.enable. इसेenabledसे बदल दिया गया हैFeaturePluginऔरFeatureExtensionके इस्तेमाल पर रोक लगा दी गई है और इन्हें बंद कर दिया गया है.बंद किए गए और बंद की गई सुविधा वाले
BaseExtension.registerTransformएपीआई. इनका इस्तेमाल सिर्फ़ AGP 4.2 या इससे पहले के वर्शन पर चल रहे टारगेट के लिए, AGP के सबसे नए वर्शन के साथ कंपाइल करने के लिए किया जाता था.
हटाई गई Gradle प्रॉपर्टी
शुरुआत में, इन Gradle प्रॉपर्टी को ग्लोबल लेवल पर जोड़ा गया था. ऐसा इसलिए किया गया था, ताकि डिफ़ॉल्ट रूप से चालू होने वाली सुविधाओं को बंद किया जा सके.
AGP 8.0 या इससे पहले के वर्शन में, ये सुविधाएं डिफ़ॉल्ट रूप से बंद कर दी गई हैं. इन सुविधाओं को सिर्फ़ उन उप-प्रोजेक्ट में चालू करें जिनमें इनका इस्तेमाल किया जाता है, ताकि ज़्यादा असरदार तरीके से बनाया जा सके.
| प्रॉपर्टी | फ़ंक्शन | प्रतिस्थापन |
|---|---|---|
android. |
यह सभी सबप्रोजेक्ट में AIDL कंपाइलेशन की सुविधा चालू करता है |
सिर्फ़ उन सबप्रोजेक्ट में AIDL कंपाइलेशन चालू करें जिनमें AIDL सोर्स मौजूद हैं. इसके लिए, उन प्रोजेक्ट की Gradle बिल्ड फ़ाइलों में यह प्रॉपर्टी सेट करें:
android {
buildFeatures {
aidl = true
}
} |
android. |
यह सभी सबप्रोजेक्ट में, RenderScript कंपाइलेशन को चालू करता है |
सिर्फ़ उन सबप्रोजेक्ट में renderscript कंपाइलेशन चालू करें जिनमें renderscript सोर्स मौजूद हैं. इसके लिए, उन प्रोजेक्ट की Gradle बिल्ड फ़ाइलों में यह प्रॉपर्टी सेट करें:
android {
buildFeatures {
renderScript = true
}
} |
लागू की गई Gradle प्रॉपर्टी
अगर आपने नीचे दी गई Gradle प्रॉपर्टी सेट की हैं, तो AGP 9.0 में गड़बड़ी होगी.
Android Gradle प्लगइन अपग्रेड असिस्टेंट, इन प्रॉपर्टी का इस्तेमाल करने वाले प्रोजेक्ट को AGP 9.0 पर अपग्रेड नहीं करेगा.
| प्रॉपर्टी | फ़ंक्शन |
|---|---|
android. |
संसाधन कम करने की प्रोसेस अब हमेशा R8 के हिस्से के तौर पर चलती है. पिछले वर्शन को हटा दिया गया है. |
android. |
इस्तेमाल नहीं किए जाने वाले रिसॉर्स को हटाने की प्रोसेस में अब हमेशा सटीक तरीके से रिसॉर्स हटाए जाते हैं. इससे ज़्यादा रिसॉर्स हटाए जा सकते हैं. |
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 से, कंपैनियन क्लास के तरीकों पर कीप नियमों को लागू नहीं किया जाता. यह इस बात से मेल खाता है कि keep नियमों को कंपाइलर के बनाए गए अन्य फ़ील्ड/तरीकों/क्लास पर लागू नहीं किया जाता.
ऑप्टिमाइज़ेशन की अनुमति न दें और कम करने की अनुमति न दें बिट को कंपैनियन तरीकों में ट्रांसफ़र करके, पहले इस्तेमाल के इस उदाहरण को सपोर्ट किया जाता था:
default/static/privateइंटरफ़ेस के तरीकों के साथ लाइब्रेरी को कंपाइल करें, ताकिminSdk< 24 के साथ DEX किया जा सके. साथ ही, ऐसे नियम लागू करें जिनसे इंटरफ़ेस के तरीके बने रहें.- क्लाथपाथ और
-applymappingपर लाइब्रेरी के साथ ऐप्लिकेशन कंपाइल करें. - ऐप्लिकेशन और लाइब्रेरी को मर्ज करें.
ध्यान दें कि यह सिर्फ़ -applymapping के साथ काम करता है, क्योंकि disallow
obfuscation बिट को कंपैनियन तरीकों में ट्रांसफ़र नहीं किया जाता. इसका मतलब है कि पहले चरण में जनरेट की गई कंपैनियन क्लास में, तरीके के नाम छिपाए गए होंगे.
आगे से, minSdk <24 के लिए, इस इस्तेमाल के उदाहरण का समर्थन नहीं किया जाएगा. इस समस्या को हल करने के लिए, यह तरीका अपनाएं:
default/static/privateइंटरफ़ेस के तरीकों का इस्तेमाल करके, लाइब्रेरी कोminSdk< 24 वाले क्लास फ़ाइलों में बदलें.- R8 और उन नियमों का इस्तेमाल करके, डीशुगर किए गए आर्टफ़ैक्ट को कंपाइल करें जो इंटरफ़ेस के तरीकों को कंपैनियन क्लास पर रखते हैं.
- ऐप्लिकेशन को क्लासपाथ पर मौजूद लाइब्रेरी के साथ कंपाइल करें.
- ऐप्लिकेशन और डीशुगर किए गए आर्टफ़ैक्ट को मर्ज करें.
इसका एक और साइड इफ़ेक्ट यह है कि अब इंटरफ़ेस कंपैनियन के तरीकों के अंदर, गुमनाम और लोकल क्लास के लिए इनर क्लास और एंक्लोज़िंग मेथड एट्रिब्यूट को सेव नहीं किया जा सकता.
डिफ़ॉल्ट रूप से जनरेट होने वाली सोर्स फ़ाइल को 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 प्लगिन |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| लिंट |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| लिंट इंटिग्रेशन |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| Shrinker (R8) |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||