Android Gradle प्लग इन 3.6.0 (फ़रवरी 2020)
Android प्लगिन के इस वर्शन के लिए, ये ज़रूरी हैं:
| कम से कम वर्शन | डिफ़ॉल्ट वर्शन | नोट | |
|---|---|---|---|
| Gradle | 5.6.4 | 5.6.4 | ज़्यादा जानने के लिए, Gradle को अपडेट करने का तरीका देखें. |
| एसडीके बिल्ड टूल | 28.0.3 | 28.0.3 | एसडीके बिल्ड टूल इंस्टॉल करें या कॉन्फ़िगर करें. |
इस छोटे से अपडेट में, 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 प्लगिन, आपके ऐप्लिकेशन या लाइब्रेरी मॉड्यूल में मौजूद हर बिल्ड वैरिएंट आर्टफ़ैक्ट के लिए एक component बनाता है. इसका इस्तेमाल, Maven रिपॉज़िटरी में publication को पसंद के मुताबिक बनाने के लिए किया जा सकता है.
ज़्यादा जानने के लिए, 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 से सीधे तौर पर नेटिव लाइब्रेरी को ऐक्सेस कर सकता है. इसके लिए, लाइब्रेरी की कॉपी बनाने की ज़रूरत नहीं होती.
- डाउनलोड करने के लिए कम साइज़, क्योंकि Play Store पर कंप्रेस करने की सुविधा आम तौर पर तब बेहतर होती है, जब आपने अपने APK या Android ऐप्लिकेशन बंडल में बिना कंप्रेस की गई नेटिव लाइब्रेरी शामिल की हों.
अगर आपको Android Gradle प्लगिन से, कंप्रेस की गई नेटिव लाइब्रेरी को पैकेज करने के लिए कहना है, तो अपने ऐप्लिकेशन के मेनिफ़ेस्ट में यह शामिल करें:
<application
android:extractNativeLibs="true"
... >
</application>
ध्यान दें: extractNativeLibs मेनिफ़ेस्ट एट्रिब्यूट की जगह useLegacyPackaging डीएसएल विकल्प का इस्तेमाल किया जाता है. ज़्यादा जानकारी के लिए, रिलीज़ नोट कंप्रेस की गई नेटिव लाइब्रेरी को पैकेज करने के लिए डीएसएल का इस्तेमाल करना देखें.
डिफ़ॉल्ट NDK वर्शन
अगर आपने NDK के कई वर्शन डाउनलोड किए हैं, तो Android Gradle प्लगिन अब आपके सोर्स कोड फ़ाइलों को कंपाइल करने के लिए, डिफ़ॉल्ट वर्शन चुनता है.
इससे पहले, प्लगिन NDK के डाउनलोड किए गए सबसे नए वर्शन को चुनता था.
प्लगिन के चुने गए डिफ़ॉल्ट को बदलने के लिए, मॉड्यूल की build.gradle फ़ाइल में android.ndkVersion प्रॉपर्टी का इस्तेमाल करें.
आसानी से आर क्लास जनरेट करना
Android Gradle प्लगिन, कंपाइल क्लासपाथ को आसान बनाता है. इसके लिए, यह आपके प्रोजेक्ट में मौजूद हर लाइब्रेरी मॉड्यूल के लिए सिर्फ़ एक R क्लास जनरेट करता है. साथ ही, उन R क्लास को अन्य मॉड्यूल डिपेंडेंसी के साथ शेयर करता है. इस ऑप्टिमाइज़ेशन से, बिल्ड तेज़ी से तैयार होने चाहिए. हालांकि, इसके लिए आपको इन बातों का ध्यान रखना होगा:
- कंपाइलर, R क्लास को अपस्ट्रीम मॉड्यूल डिपेंडेंसी के साथ शेयर करता है. इसलिए, यह ज़रूरी है कि आपके प्रोजेक्ट में मौजूद हर मॉड्यूल, पैकेज के एक यूनीक नाम का इस्तेमाल करे.
- लाइब्रेरी के R क्लास को अन्य प्रोजेक्ट डिपेंडेंसी के लिए दिखाने की सुविधा, इस बात पर निर्भर करती है कि लाइब्रेरी को डिपेंडेंसी के तौर पर शामिल करने के लिए किस कॉन्फ़िगरेशन का इस्तेमाल किया गया है. उदाहरण के लिए, अगर लाइब्रेरी A में लाइब्रेरी B को 'api' डिपेंडेंसी के तौर पर शामिल किया गया है, तो लाइब्रेरी A और उस पर निर्भर अन्य लाइब्रेरी के पास लाइब्रेरी B के R क्लास का ऐक्सेस होगा. हालांकि, अन्य लाइब्रेरी के पास लाइब्रेरी B के R क्लास का ऐक्सेस नहीं हो सकता. अगर लाइब्रेरी A,
implementationडिपेंडेंसी कॉन्फ़िगरेशन का इस्तेमाल करती है. ज़्यादा जानने के लिए, डिपेंडेंसी कॉन्फ़िगरेशन के बारे में पढ़ें.
डिफ़ॉल्ट कॉन्फ़िगरेशन में मौजूद नहीं हैं, उन्हें हटाएं
लाइब्रेरी मॉड्यूल के लिए, अगर आपने किसी ऐसी भाषा के लिए संसाधन शामिल किया है जिसे आपने संसाधनों के डिफ़ॉल्ट सेट में शामिल नहीं किया है, तो Android Gradle प्लगिन उस संसाधन को आपके प्रोजेक्ट को कंपाइल करते समय शामिल नहीं करेगा. उदाहरण के लिए, अगर आपने /values-es/strings.xml में स्ट्रिंग संसाधन के तौर पर hello_world को शामिल किया है, लेकिन आपने उस संसाधन को /values/strings.xml में तय नहीं किया है. इस बदलाव से, Resource Not Found रनटाइम अपवादों की संख्या कम हो जाएगी और बिल्ड की स्पीड बेहतर हो जाएगी.
D8 अब एनोटेशन के लिए, CLASS के रखरखाव की नीति का पालन करता है
ऐप्लिकेशन को कंपाइल करते समय, D8 अब इस बात का ध्यान रखता है कि एनोटेशन कब CLASS रिटेंशन पॉलिसी लागू करते हैं. साथ ही, ये एनोटेशन अब रनटाइम में उपलब्ध नहीं होते. ऐप्लिकेशन के टारगेट एसडीके को एपीआई लेवल 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 में ठीक कर दिया जाएगा.
Manifest क्लास {:#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"; } }