Android Gradle प्लग इन 3.6.0 (फ़रवरी 2020)
Android प्लग इन के इस वर्शन के लिए, ये ज़रूरी हैं:
कम से कम वर्शन | डिफ़ॉल्ट वर्शन | नोट | |
---|---|---|---|
Gradle | 5.6.4 | 5.6.4 | ज़्यादा जानने के लिए, Gradle को अपडेट करना लेख पढ़ें. |
SDK टूल के लिए बिल्ड टूल | 28.0.3 | 28.0.3 | SDK Build Tools को इंस्टॉल या कॉन्फ़िगर करें. |
इस मामूली अपडेट में, नई डिफ़ॉल्ट सेटिंग और सुविधाओं के साथ काम करने की सुविधा जोड़ी गई है. ये सुविधाएं, Android 11 में पैकेज की दिखने की सुविधा के लिए हैं.
ज़्यादा जानकारी के लिए, 4.0.1 के रिलीज़ नोट देखें.
नई सुविधाएं
Android Gradle प्लग इन के इस वर्शन में ये नई सुविधाएं शामिल हैं.
व्यू बाइंडिंग
व्यू बाइंडिंग की मदद से, कोड में व्यू का रेफ़रंस देते समय, कंपाइल टाइम (कंपाइल का समय) में सुरक्षा मिलती है. अब findViewById()
को अपने-आप जनरेट हुई बिडिंग क्लास के रेफ़रंस से बदला जा सकता है. व्यू बाइंडिंग का इस्तेमाल शुरू करने के लिए,
हर मॉड्यूल की build.gradle
फ़ाइल में ये शामिल करें:
android { viewBinding.enabled = true }
android { viewBinding.enabled = true }
ज़्यादा जानने के लिए, व्यू के लिए बाइंडिंग का दस्तावेज़ पढ़ें.
Maven Publish प्लग इन के लिए सहायता
Android Gradle प्लग इन में, Maven Publish Gradle प्लग इन के लिए सहायता शामिल होती है. इसकी मदद से, Apache Maven रिपॉज़िटरी में बिल्ड आर्टफ़ैक्ट पब्लिश किए जा सकते हैं. Android Gradle प्लग इन, आपके ऐप्लिकेशन या लाइब्रेरी मॉड्यूल में मौजूद हर बिल्ड वैरिएंट आर्टफ़ैक्ट के लिए एक कॉम्पोनेंट बनाता है. इसका इस्तेमाल, Maven रिपॉज़िटरी में किसी पब्लिकेशन को पसंद के मुताबिक बनाने के लिए किया जा सकता है.
ज़्यादा जानने के लिए, Maven Publish प्लग इन का इस्तेमाल करने के तरीके के बारे में बताने वाले पेज पर जाएं.
पैकेजिंग के लिए नया डिफ़ॉल्ट टूल
आपके ऐप्लिकेशन का डीबग वर्शन बनाते समय, प्लग इन आपके APK को बनाने के लिए, zipflinger नाम के नए पैकेजिंग टूल का इस्तेमाल करता है. इस नए टूल से, बिल्ड की स्पीड में सुधार होगा. अगर पैकेजिंग वाला नया टूल आपकी उम्मीद के मुताबिक काम नहीं करता है, तो कृपया बग की शिकायत करें. अपनी gradle.properties
फ़ाइल में ये चीज़ें शामिल करके, पैकेजिंग के पुराने टूल का इस्तेमाल फिर से शुरू किया जा सकता है:
android.useNewApkCreator=false
नेटिव बिल्ड एट्रिब्यूशन
अब आपके पास यह तय करने का विकल्प है कि Clang को आपके प्रोजेक्ट में मौजूद हर C/C++ फ़ाइल को बनाने और लिंक करने में कितना समय लगेगा. Gradle, एक ऐसा Chrome ट्रेस आउटपुट कर सकता है जिसमें इन कंपाइलर इवेंट के टाइमस्टैंप शामिल होते हैं. इससे, आपको अपने प्रोजेक्ट को बनाने में लगने वाले समय को बेहतर तरीके से समझने में मदद मिलती है. इस एट्रिब्यूशन फ़ाइल को आउटपुट करने के लिए, ये करें:
-
Gradle बिल्ड को चलाते समय,
-Pandroid.enableProfileJson=true
फ़्लैग जोड़ें. उदाहरण के लिए:gradlew assembleDebug -Pandroid.enableProfileJson=true
-
Chrome ब्राउज़र खोलें और खोज बार में
chrome://tracing
टाइप करें. -
फ़ाइल ढूंढने के लिए, लोड करें बटन पर क्लिक करें और
<var>project-root</var>/build/android-profile
पर जाएं. फ़ाइल का नामprofile-<var>timestamp</var>.json.gz
है.
नेटिव बिल्ड एट्रिब्यूशन डेटा, व्यूअर के सबसे ऊपर वाले हिस्से के पास देखा जा सकता है:
उपयोगकर्ता के व्यवहार में बदलाव
प्लग इन के इस वर्शन का इस्तेमाल करने पर, आपको इसके व्यवहार में ये बदलाव दिख सकते हैं.
डिफ़ॉल्ट रूप से, कंप्रेस नहीं की गई नेटिव लाइब्रेरी
ऐप्लिकेशन बनाने पर, प्लगिन अब डिफ़ॉल्ट रूप से extractNativeLibs
को "false"
पर सेट करता है. इसका मतलब है कि आपकी नेटिव लाइब्रेरी, पेज के हिसाब से अलाइन की गई हैं और उन्हें बिना कंप्रेस किए पैकेज किया गया है. इससे अपलोड का साइज़ बड़ा हो जाता है. हालांकि, इससे आपके उपयोगकर्ताओं को ये फ़ायदे मिलते हैं:
- ऐप्लिकेशन इंस्टॉल करने के बाद उसका साइज़ कम हो जाता है. ऐसा इसलिए होता है, क्योंकि प्लैटफ़ॉर्म, लाइब्रेरी की कॉपी बनाए बिना, सीधे तौर पर इंस्टॉल किए गए APK से नेटिव लाइब्रेरी को ऐक्सेस कर सकता है.
- डाउनलोड करने के लिए कम जगह चाहिए, क्योंकि APK या Android ऐप्लिकेशन बंडल में बिना कंप्रेस की गई नेटिव लाइब्रेरी शामिल करने पर, आम तौर पर Play Store का कंप्रेस करने का तरीका बेहतर होता है.
अगर आपको Android Gradle प्लग इन से, कंप्रेस की गई नेटिव लाइब्रेरी को पैकेज कराना है, तो अपने ऐप्लिकेशन के मेनिफ़ेस्ट में ये चीज़ें शामिल करें:
<application
android:extractNativeLibs="true"
... >
</application>
ध्यान दें: extractNativeLibs
मेनिफ़ेस्ट एट्रिब्यूट की जगह useLegacyPackaging
डीएसएल विकल्प का इस्तेमाल किया गया है. ज़्यादा जानकारी के लिए, रिलीज़ नोट देखें
कंप्रेस की गई नेटिव लाइब्रेरी को पैकेज करने के लिए, डीएसएल का इस्तेमाल करना.
NDK का डिफ़ॉल्ट वर्शन
अगर NDK टूल के कई वर्शन डाउनलोड किए जाते हैं, तो Android Gradle प्लग इन अब आपके सोर्स कोड फ़ाइलों को कंपाइल करने के लिए, डिफ़ॉल्ट वर्शन चुनता है.
पहले, प्लग इन NDK का डाउनलोड किया गया नया वर्शन चुनता था.
प्लग इन की ओर से चुने गए डिफ़ॉल्ट विकल्प को बदलने के लिए, मॉड्यूल की
build.gradle
फ़ाइल में android.ndkVersion
प्रॉपर्टी का इस्तेमाल करें.
R क्लास को आसानी से जनरेट करना
Android Gradle प्लग इन, आपके प्रोजेक्ट में हर लाइब्रेरी मॉड्यूल के लिए सिर्फ़ एक R क्लास जनरेट करके और उन R क्लास को अन्य मॉड्यूल डिपेंडेंसी के साथ शेयर करके, क्लासपथ को कंपाइल करना आसान बनाता है. इस ऑप्टिमाइज़ेशन की वजह से, बिल्ड तेज़ी से होने चाहिए. हालांकि, इसके लिए आपको इन बातों का ध्यान रखना होगा:
- कंपाइलर, अपस्ट्रीम मॉड्यूल डिपेंडेंसी के साथ R क्लास शेयर करता है. इसलिए, यह ज़रूरी है कि आपके प्रोजेक्ट में हर मॉड्यूल, पैकेज के एक अलग नाम का इस्तेमाल करे.
- किसी लाइब्रेरी की R क्लास को प्रोजेक्ट की अन्य डिपेंडेंसी के लिए दिखने या न दिखने का फ़ैसला, लाइब्रेरी को डिपेंडेंसी के तौर पर शामिल करने के लिए इस्तेमाल किए गए कॉन्फ़िगरेशन से तय होता है. उदाहरण के लिए, अगर लाइब्रेरी A में लाइब्रेरी B को 'एपीआई' डिपेंडेंसी के तौर पर शामिल किया गया है, तो लाइब्रेरी A और लाइब्रेरी A पर निर्भर अन्य लाइब्रेरी के पास, लाइब्रेरी B की R क्लास का ऐक्सेस होता है. हालांकि, हो सकता है कि अन्य लाइब्रेरी के पास, लाइब्रेरी B की R क्लास का ऐक्सेस न हो. अगर लाइब्रेरी A,
implementation
डिपेंडेंसी कॉन्फ़िगरेशन का इस्तेमाल करती है. ज़्यादा जानने के लिए, डिपेंडेंसी कॉन्फ़िगरेशन के बारे में पढ़ें.
डिफ़ॉल्ट कॉन्फ़िगरेशन में मौजूद रिसॉर्स हटाना
लाइब्रेरी मॉड्यूल के लिए, अगर आपने किसी ऐसी भाषा के लिए संसाधन शामिल किया है जिसे आपने
संसाधनों के डिफ़ॉल्ट सेट में शामिल नहीं किया है—उदाहरण के लिए, अगर आपने
/values-es/strings.xml
में hello_world
को स्ट्रिंग संसाधन के तौर पर शामिल किया है, लेकिन आपने उस संसाधन को
/values/strings.xml
में तय नहीं किया है—तो Android Gradle प्लग इन अब आपके प्रोजेक्ट को संकलित करते समय उस संसाधन को शामिल नहीं करता. इस बदलाव की वजह से, Resource Not Found
रनटाइम एक्ससेप्शन कम होंगे और बिल्ड की स्पीड बेहतर होगी.
D8 अब एनोटेशन के लिए, क्लास के डेटा के रखरखाव की नीति का पालन करता है
आपके ऐप्लिकेशन को कंपाइल करते समय, D8 अब इस बात का ध्यान रखता है कि एनोटेशन, क्लास के डेटा को बनाए रखने की नीति लागू करते हैं या नहीं. साथ ही, वे एनोटेशन रनटाइम के दौरान उपलब्ध नहीं होते. ऐप्लिकेशन के टारगेट SDK टूल को एपीआई लेवल 23 पर सेट करने पर भी यह समस्या होती है. इससे पहले, Android Gradle प्लग इन और D8 के पुराने वर्शन का इस्तेमाल करके ऐप्लिकेशन को कंपाइल करते समय, रनटाइम के दौरान इन एनोटेशन को ऐक्सेस करने की अनुमति दी जाती थी.
व्यवहार में अन्य बदलाव
-
aaptOptions.noCompress
अब सभी प्लैटफ़ॉर्म पर केस-संवेदनशील नहीं है. यह एपीके और बंडल, दोनों के लिए है. साथ ही, यह अपरकेस वर्णों का इस्तेमाल करने वाले पाथ का भी सम्मान करता है. -
डेटा बाइंडिंग अब डिफ़ॉल्ट रूप से इंक्रीमेंटल है. ज़्यादा जानने के लिए, समस्या #110061530 देखें.
-
Roboelectric यूनिट टेस्ट के साथ-साथ, सभी यूनिट टेस्ट अब पूरी तरह से कैश मेमोरी में सेव किए जा सकते हैं. ज़्यादा जानने के लिए, समस्या #115873047 देखें.
बग समाधान
Android Gradle प्लग इन के इस वर्शन में, गड़बड़ी ठीक करने के ये उपाय शामिल हैं:
- Robolectric यूनिट टेस्ट, अब उन लाइब्रेरी मॉड्यूल में काम करते हैं जो डेटा बाइंडिंग का इस्तेमाल करते हैं. ज़्यादा जानने के लिए, समस्या #126775542 देखें.
- अब Gradle के एक साथ कई टास्क चलाने की सुविधा चालू होने पर, एक से ज़्यादा मॉड्यूल में
connectedAndroidTest
टास्क चलाए जा सकते हैं.
पहले से मालूम समस्याएं
इस सेक्शन में, Android Gradle प्लग इन के 3.6.0 वर्शन में मौजूद समस्याओं के बारे में बताया गया है.
Android Lint टास्क की धीमी परफ़ॉर्मेंस
Android Lint को कुछ प्रोजेक्ट पर काम पूरा करने में ज़्यादा समय लग सकता है. ऐसा, पार्स करने के इन्फ़्रास्ट्रक्चर में हुई गिरावट की वजह से होता है. इसकी वजह से, कुछ कोड कंस्ट्रक्ट में, लैम्ब्डा के लिए अनुमानित टाइप का हिसाब लगाने में ज़्यादा समय लगता है.
इस समस्या को IDEA में मौजूद गड़बड़ी के तौर पर रिपोर्ट किया गया है. इसे Android Gradle प्लग इन 4.0 में ठीक कर दिया जाएगा.
मेनिफ़ेस्ट क्लास {:#agp-missing-manifest} मौजूद नहीं है
अगर आपका ऐप्लिकेशन अपने मेनिफ़ेस्ट में कस्टम अनुमतियां तय करता है, तो Android Gradle प्लग इन आम तौर पर एक Manifest.java
क्लास जनरेट करता है. इसमें आपकी कस्टम अनुमतियां, स्ट्रिंग कॉन्स्टेंट के तौर पर शामिल होती हैं. प्लग इन इस क्लास को आपके ऐप्लिकेशन के साथ पैकेज करता है, ताकि रनटाइम के दौरान उन अनुमतियों का रेफ़रंस आसानी से दिया जा सके.
Android Gradle प्लग इन 3.6.0 में, मेनिफ़ेस्ट क्लास जनरेट करने की सुविधा काम नहीं कर रही है.
अगर आपने प्लग इन के इस वर्शन का इस्तेमाल करके अपना ऐप्लिकेशन बनाया है और इसमें मेनिफ़ेस्ट क्लास का रेफ़रंस दिया गया है, तो आपको ClassNotFoundException
अपवाद दिख सकता है. इस समस्या को हल करने के लिए, इनमें से कोई एक तरीका अपनाएं:
-
अपनी कस्टम अनुमतियों को उनके पूरी तरह से क्वालिफ़ाइड नाम से रेफ़र करें. उदाहरण के लिए,
"com.example.myapp.permission.DEADLY_ACTIVITY"
. -
नीचे दिए गए तरीके से, अपने कंसटेंट तय करें:
public final class CustomPermissions { public static final class permission { public static final String DEADLY_ACTIVITY="com.example.myapp.permission.DEADLY_ACTIVITY"; } }