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 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 ट्रेस आउटपुट कर सकता है जिसमें इन कंपाइलर इवेंट के टाइमस्टैंप शामिल होते हैं. इससे, आपको अपने प्रोजेक्ट को बनाने में लगने वाले समय को बेहतर तरीके से समझने में मदद मिलती है. इस एट्रिब्यूशन फ़ाइल को आउटपुट करने के लिए, ये करें:

  1. Gradle बिल्ड को चलाते समय, -Pandroid.enableProfileJson=true फ़्लैग जोड़ें. उदाहरण के लिए:

    gradlew assembleDebug -Pandroid.enableProfileJson=true

  2. Chrome ब्राउज़र खोलें और खोज बार में chrome://tracing टाइप करें.

  3. फ़ाइल ढूंढने के लिए, लोड करें बटन पर क्लिक करें और <var>project-root</var>/build/android-profile पर जाएं. फ़ाइल का नाम profile-<var>timestamp</var>.json.gz है.

नेटिव बिल्ड एट्रिब्यूशन डेटा, व्यूअर के सबसे ऊपर वाले हिस्से के पास देखा जा सकता है:

Chrome में नेटिव बिल्ड एट्रिब्यूशन ट्रेस

उपयोगकर्ता के व्यवहार में बदलाव

प्लग इन के इस वर्शन का इस्तेमाल करने पर, आपको इसके व्यवहार में ये बदलाव दिख सकते हैं.

डिफ़ॉल्ट रूप से, कंप्रेस नहीं की गई नेटिव लाइब्रेरी

ऐप्लिकेशन बनाने पर, प्लगिन अब डिफ़ॉल्ट रूप से 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 अब उन एनोटेशन का सम्मान करता है जिनमें CLASS के लिए, डेटा को बनाए रखने की नीति लागू की गई है. साथ ही, वे एनोटेशन अब रनटाइम के दौरान उपलब्ध नहीं होते. ऐप्लिकेशन के टारगेट 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";
                  }
                }