Android Gradle प्लग इन 4.1.0 (अगस्त 2020)
इनके साथ काम करता है
कम से कम वर्शन | डिफ़ॉल्ट वर्शन | नोट | |
---|---|---|---|
Gradle | 6.5 | लागू नहीं | ज़्यादा जानने के लिए, Gradle को अपडेट करना लेख पढ़ें. |
एसडीके बिल्ड टूल | 29.0.2 | 29.0.2 | एसडीके बिल्ड टूल इंस्टॉल करें या कॉन्फ़िगर करें. |
एनडीके | लागू नहीं | 21.1.6352462 | NDK का कोई दूसरा वर्शन इंस्टॉल करें या कॉन्फ़िगर करें. |
<p>This version of the Android plugin requires the following:</p>
<ul>
<li>
<p><a href="https://docs.gradle.org/6.5.1/release-notes.html">Gradle 6.5</a>.
To learn more, read the section about <a href="#updating-gradle">updating
Gradle</a>.</p>
</li>
<li>
<p><a href="/studio/releases/build-tools.html#notes">SDK Build Tools
29.0.2</a> or higher.</p>
</li>
</ul>
<p>The default NDK version in this release is 21.1.6352462. To install a
different NDK version, see <a href="/studio/projects/install-ndk#specific-version">Install a specific version of the NDK</a>.</p>
नई सुविधाएं
Android Gradle प्लगिन के इस वर्शन में, ये नई सुविधाएं शामिल हैं.
Kotlin Script DSL के लिए सहायता
Kotlin buildscript का इस्तेमाल करने वाले लोगों के लिए, एडिटिंग के अनुभव को बेहतर बनाने के लिए, Android Gradle प्लगिन 4.1 के डीएसएल और एपीआई को अब Kotlin इंटरफ़ेस के सेट में, उनकी लागू करने वाली क्लास से अलग तौर पर तय किया गया है. इसका मतलब है कि:
- Kotlin टाइप पर, अब नल वैल्यू असाइन करने की सुविधा और वैल्यू बदलने की सुविधा के बारे में साफ़ तौर पर बताया गया है.
- इन इंटरफ़ेस से जनरेट किया गया दस्तावेज़, Kotlin API Reference में पब्लिश किया जाता है.
- Android Gradle प्लगइन की एपीआई सतह को साफ़ तौर पर तय किया गया है, ताकि आने वाले समय में Android बिल्ड को कमज़ोर होने से बचाया जा सके.
अहम जानकारी: अगर आपने पहले से ही KTS बिल्ड स्क्रिप्ट का इस्तेमाल किया है या buildSrc
में Kotlin का इस्तेमाल किया है, तो ऐसा हो सकता है कि कुछ गड़बड़ियों के लिए सोर्स कंपैटिबिलिटी टूट जाए. ये गड़बड़ियां, पिछली रिलीज़ में रन-टाइम गड़बड़ियों के तौर पर दिखती थीं.
डीएसएल में बदलाव करने के लिए डिज़ाइन किए गए कलेक्शन टाइप को अब एक जैसा परिभाषित किया गया है:
val collection: MutableCollectionType
इसका मतलब है कि अब उन कलेक्शन के लिए Kotlin स्क्रिप्ट में यह नहीं लिखा जा सकता जिनके लिए पहले यह सुविधा उपलब्ध थी:
collection = collectionTypeOf(...)
हालांकि, कलेक्शन में बदलाव करने की सुविधा सभी के लिए एक जैसी है. इसलिए, अब collection += …
और collection.add(...)
हर जगह काम करने चाहिए.
अगर आपको Android Gradle प्लगिन Kotlin API और DSL का इस्तेमाल करने वाले किसी प्रोजेक्ट को अपग्रेड करते समय कोई समस्या आती है, तो कृपया बग की शिकायत करें.
AAR से C/C++ डिपेंडेंसी एक्सपोर्ट करना
Android Gradle प्लगइन 4.0 में, AAR डिपेंडेंसी में Prefab पैकेज इंपोर्ट करने की सुविधा जोड़ी गई है. AGP 4.1 में, अब Android लाइब्रेरी प्रोजेक्ट के लिए, बाहरी नेटिव बिल्ड से लाइब्रेरी को AAR फ़ाइल में एक्सपोर्ट किया जा सकता है.
अपनी नेटिव लाइब्रेरी एक्सपोर्ट करने के लिए, अपनी लाइब्रेरी प्रोजेक्ट की build.gradle
फ़ाइल के android
ब्लॉक में यह जोड़ें:
buildFeatures { prefabPublishing true }prefab { <var>mylibrary</var&;gt { headers "src/main/cpp/<var>mylibrary</var>/include" }
<var>myotherlibrary</var> { headers "src/main/cpp/<var>myotherlibrary</var>/include" }
}
buildFeatures { prefabPublishing = true }prefab { create("<var>mylibrary</var>") { headers = "src/main/cpp/<var>mylibrary</var>/include" }
create("<var>myotherlibrary</var>") { headers = "src/main/cpp/<var>myotherlibrary</var>/include" }
}
इस उदाहरण में, ndk-build या CMake के बाहरी नेटिव बिल्ड से मिली mylibrary
और myotherlibrary
लाइब्रेरी को आपके बिल्ड से बनाए गए AAR में पैकेज किया जाएगा. साथ ही, हर लाइब्रेरी, तय की गई डायरेक्ट्री से हेडर को अपने डिपेंडेंट में एक्सपोर्ट करेगी.
ध्यान दें: Android Gradle प्लगिन 4.0 और उसके बाद के वर्शन का इस्तेमाल करने वाले लोगों के लिए, पहले से बनी नेटिव लाइब्रेरी इंपोर्ट करने की कॉन्फ़िगरेशन सेटिंग बदल गई हैं. ज़्यादा जानकारी के लिए, 4.0 वर्शन की जानकारी देखें.
Kotlin मेटाडेटा के लिए R8 का सपोर्ट
Kotlin, Java क्लास फ़ाइलों में कस्टम मेटाडेटा का इस्तेमाल करता है, ताकि Kotlin लैंग्वेज कंस्ट्रक्ट की पहचान की जा सके. R8 अब Kotlin मेटाडेटा को बनाए रखने और फिर से लिखने की सुविधा देता है. इससे Kotlin लाइब्रेरी और kotlin-reflect
का इस्तेमाल करने वाले ऐप्लिकेशन को पूरी तरह से छोटा किया जा सकता है.
Kotlin मेटाडेटा को सेव रखने के लिए, सेव रखने से जुड़े ये नियम जोड़ें:
-keep class kotlin.Metadata { *; }
-keepattributes RuntimeVisibleAnnotations
इससे R8 को यह निर्देश मिलेगा कि वह उन सभी क्लास के लिए Kotlin मेटाडेटा को सेव रखे जिन्हें सीधे तौर पर सेव किया गया है.
ज़्यादा जानकारी के लिए, Medium पर R8 के साथ Kotlin रिफ़्लेक्शन का इस्तेमाल करके, Kotlin लाइब्रेरी और ऐप्लिकेशन को छोटा करना{:.external} लेख पढ़ें.
डीबग बिल्ड में दावे
Android Gradle plugin 4.1.0 और इसके बाद के वर्शन का इस्तेमाल करके, अपने ऐप्लिकेशन का डीबग वर्शन बनाने पर, बिल्ट-इन कंपाइलर (D8) आपके ऐप्लिकेशन के कोड को फिर से लिखेगा. इससे कंपाइल टाइम पर असर्शन चालू हो जाएंगे, ताकि असर्शन की जांच हमेशा चालू रहे.
व्यवहार में बदलाव
Android Gradle प्लग इन का बिल्ड कैश हटा दिया गया है
AGP 4.1 में, AGP की बिल्ड कैश मेमोरी को हटा दिया गया था. AGP 2.3 में, Gradle बिल्ड कैश के साथ काम करने के लिए AGP बिल्ड कैश को पेश किया गया था. हालांकि, AGP 4.1 में AGP बिल्ड कैश को पूरी तरह से Gradle बिल्ड कैश से बदल दिया गया था. इस बदलाव से, बिल्ड टाइम पर कोई असर नहीं पड़ता.
cleanBuildCache
टास्क और android.enableBuildCache
और android.buildCacheDir
प्रॉपर्टी अब काम नहीं करती हैं. इन्हें AGP 7.0 में हटा दिया जाएगा. फ़िलहाल, android.enableBuildCache
प्रॉपर्टी का कोई असर नहीं पड़ता. वहीं, android.buildCacheDir
प्रॉपर्टी और cleanBuildCache
टास्क, AGP 7.0 तक काम करेंगे. इनका इस्तेमाल, AGP की किसी मौजूदा बिल्ड कैश मेमोरी के कॉन्टेंट को मिटाने के लिए किया जा सकता है.
कोड छोटा करने की सुविधा का इस्तेमाल करने वाले ऐप्लिकेशन के साइज़ में काफ़ी कमी आई है
इस रिलीज़ के बाद से, R क्लास के फ़ील्ड डिफ़ॉल्ट रूप से सेव नहीं किए जाएंगे. इससे कोड श्रिंक करने की सुविधा चालू करने वाले ऐप्लिकेशन के APK का साइज़ काफ़ी कम हो सकता है. इससे व्यवहार में कोई बदलाव नहीं होना चाहिए. हालांकि, अगर रिफ़्लेक्शन के ज़रिए R क्लास ऐक्सेस की जा रही हैं, तो उन R क्लास के लिए डेटा सुरक्षित रखने के नियम जोड़ना ज़रूरी है.
android.namespacedRClass प्रॉपर्टी का नाम बदलकर android.nonTransitiveRClass कर दिया गया है
एक्सपेरिमेंट के तौर पर उपलब्ध फ़्लैग android.namespacedRClass
का नाम बदलकर android.nonTransitiveRClass
कर दिया गया है.
gradle.properties
फ़ाइल में सेट किया गया यह फ़्लैग, हर लाइब्रेरी के R क्लास के नेमस्पेस को चालू करता है. इससे, R क्लास में सिर्फ़ लाइब्रेरी में ही तय किए गए संसाधन शामिल होते हैं. इसमें लाइब्रेरी की डिपेंडेंसी से कोई संसाधन शामिल नहीं होता. इससे उस लाइब्रेरी के R क्लास का साइज़ कम हो जाता है.
Kotlin DSL: coreLibraryDesugaringEnabled का नाम बदला गया
Kotlin DSL के कंपाइल विकल्प coreLibraryDesugaringEnabled
को बदलकर isCoreLibraryDesugaringEnabled
कर दिया गया है.
इस फ़्लैग के बारे में ज़्यादा जानने के लिए, Java 8 या इसके बाद के वर्शन वाले एपीआई के लिए डिसुगरिंग की सुविधा (Android Gradle प्लगिन 4.0.0 या इसके बाद के वर्शन) देखें.
लाइब्रेरी प्रोजेक्ट में BuildConfig क्लास से वर्शन प्रॉपर्टी हटा दी गई हैं
सिर्फ़ लाइब्रेरी प्रोजेक्ट के लिए, जनरेट की गई BuildConfig
क्लास से BuildConfig.VERSION_NAME
और BuildConfig.VERSION_CODE
प्रॉपर्टी हटा दी गई हैं. ऐसा इसलिए किया गया है, क्योंकि ये स्टैटिक वैल्यू, ऐप्लिकेशन के वर्शन कोड और नाम की फ़ाइनल वैल्यू को नहीं दिखाती थीं. इसलिए, ये गुमराह करने वाली थीं. इसके अलावा, मेनिफ़ेस्ट मर्ज करने के दौरान इन वैल्यू को खारिज कर दिया गया था.
Android Gradle प्लग इन के आने वाले वर्शन में, versionName
और versionCode
प्रॉपर्टी को लाइब्रेरी के डीएसएल से भी हटा दिया जाएगा.
फ़िलहाल, लाइब्रेरी के सब-प्रोजेक्ट से ऐप्लिकेशन के वर्शन कोड/नाम को अपने-आप ऐक्सेस करने का कोई तरीका उपलब्ध नहीं है.
ऐप्लिकेशन मॉड्यूल के लिए, कोई बदलाव नहीं किया गया है. डीएसएल में अब भी versionCode
और versionName
को वैल्यू असाइन की जा सकती हैं. ये वैल्यू, ऐप्लिकेशन के मेनिफ़ेस्ट और BuildConfig
फ़ील्ड में दिखेंगी.
NDK पाथ सेट करना
अपने मॉड्यूल की build.gradle
फ़ाइल में मौजूद android.ndkPath
प्रॉपर्टी का इस्तेमाल करके, अपने लोकल NDK इंस्टॉलेशन का पाथ सेट किया जा सकता है.
android {
ndkPath "your-custom-ndk-path"
}
android {
ndkPath = "your-custom-ndk-path"
}
अगर इस प्रॉपर्टी का इस्तेमाल android.ndkVersion
प्रॉपर्टी के साथ किया जाता है, तो इस पाथ में android.ndkVersion
से मेल खाने वाला NDK वर्शन होना चाहिए.
लाइब्रेरी यूनिट टेस्ट के व्यवहार में बदलाव
हमने लाइब्रेरी की यूनिट टेस्ट को कंपाइल और चलाने के तरीके में बदलाव किया है. अब लाइब्रेरी की यूनिट टेस्ट को, लाइब्रेरी की कंपाइल/रनटाइम क्लास के साथ कंपाइल और रन किया जाता है. इससे यूनिट टेस्ट, लाइब्रेरी का इस्तेमाल उसी तरह से करती है जिस तरह से बाहरी सबप्रोजेक्ट करते हैं. इस कॉन्फ़िगरेशन से आम तौर पर बेहतर टेस्टिंग होती है.
कुछ मामलों में, डेटा बाइंडिंग का इस्तेमाल करने वाली लाइब्रेरी की यूनिट टेस्ट में, DataBindingComponent
या BR
क्लास मौजूद नहीं हो सकती हैं. उन टेस्ट को androidTest
प्रोजेक्ट में इंस्ट्रुमेंटेड टेस्ट में पोर्ट करना होगा, क्योंकि यूनिट टेस्ट में उन क्लास के ख़िलाफ़ कंपाइल करने और चलाने से गलत आउटपुट मिल सकता है.
io.fabric Gradle प्लग-इन का इस्तेमाल बंद कर दिया गया है
io.fabric Gradle प्लग इन अब काम नहीं करता. साथ ही, यह Android Gradle प्लग इन के 4.1 वर्शन के साथ काम नहीं करता. Fabric SDK के बंद किए गए वर्शन और Firebase Crashlytics SDK पर माइग्रेट करने के बारे में ज़्यादा जानने के लिए, Firebase Crashlytics SDK पर अपग्रेड करना लेख पढ़ें.