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 | ज़्यादा जानने के लिए, जेडीके वर्शन सेट करना लेख पढ़ें. |
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
एजीपी 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 की सुविधा चालू होती है. साथ ही, इस सुविधा के लिए 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. |
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 क्लास का डिफ़ॉल्ट इस्तेमाल बंद हो जाएगा
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. |
यह ऐप्लिकेशन और टेस्ट में, टारगेट एसडीके के वर्शन के लिए डिफ़ॉल्ट वैल्यू के तौर पर, कंपाइल एसडीके के वर्शन का इस्तेमाल करता है. इस बदलाव से पहले, टारगेट एसडीके वर्शन डिफ़ॉल्ट रूप से, एसडीके के कम से कम वर्शन पर सेट होता था. |
false → true |
ऐप्लिकेशन और टेस्ट के लिए, टारगेट एसडीके वर्शन साफ़ तौर पर बताएं. |
android. |
यह सिर्फ़ टेस्ट किए गए बिल्ड टाइप के लिए यूनिट टेस्ट कॉम्पोनेंट बनाता है. डिफ़ॉल्ट प्रोजेक्ट में, इससे डीबग के लिए एक यूनिट टेस्ट मिलती है, जबकि पहले डीबग या रिलीज़ के लिए यूनिट टेस्ट की जाती थीं. |
false → true |
अगर आपके प्रोजेक्ट में डीबग और रिलीज़, दोनों के लिए टेस्ट चलाने की ज़रूरत नहीं है, तो कोई बदलाव करने की ज़रूरत नहीं है. |
android. |
अगर AGP DSL में बताई गई कोई भी कीप फ़ाइल डिस्क पर मौजूद नहीं है, तो यह विकल्प गड़बड़ी के साथ बिल्ड को पूरा नहीं करता. इस बदलाव से पहले, फ़ाइल के नाम में टाइप की गई गलतियों की वजह से फ़ाइलों को अनदेखा कर दिया जाता था. | false → true |
proguard फ़ाइलों के अमान्य एलान हटाएं |
android. |
इस विकल्प की मदद से, R8 को कम Android संसाधनों को बनाए रखने की अनुमति मिलती है. इसके लिए, वह क्लास और Android संसाधनों, दोनों पर एक साथ विचार करता है. | false → true |
अगर आपके प्रोजेक्ट के डेटा को सुरक्षित रखने से जुड़े नियम पहले से ही पूरे हैं, तो कोई बदलाव करने की ज़रूरत नहीं है. |
android. |
इस विकल्प से 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 लाइब्रेरी और फ़ीचर मॉड्यूल पब्लिश नहीं हो पाएंगे. ऐसा तब होगा, जब उपभोक्ता कीप फ़ाइलों में 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 सेट करके ऑप्ट आउट करें. जब आपकी सभी उपभोक्ता जानकारी वाली फ़ाइलें, ज़रूरी शर्तों के मुताबिक हो जाएं, तब ऑप्ट आउट करने की सुविधा हटा दें.
|
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.wearAppConfigurationNameDSL को हटाना शामिल है. 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केHasUnitTestBuilderसबटाइप में,VariantBuilder.unitTestEnabledको हटा दिया गया है. इसकी जगह,enableUnitTestका इस्तेमाल किया जाएगा.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 से, कंपैनियन तरीकों पर कीप के नियम लागू नहीं होते. यह इस बात से मेल खाता है कि कीप नियमों को कंपाइलर के बनाए गए अन्य फ़ील्ड/तरीकों/क्लास पर लागू नहीं किया जाता है.
ऑप्टिमाइज़ेशन की अनुमति न दें और सिकुड़ने की अनुमति न दें बिट को कंपैनियन तरीकों में ट्रांसफ़र करके, पहले इस इस्तेमाल के उदाहरण का समर्थन किया जाता था:
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 desugaring में, छोटे किए गए सिंथेटिक नामों के इस्तेमाल की सुविधा चालू करें
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) |
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||