Android Gradle प्लग इन 3.6.0 (फ़रवरी 2020)

Android प्लगिन के इस वर्शन के लिए, ये ज़रूरी शर्तें पूरी होनी चाहिए:

कम से कम वर्शन डिफ़ॉल्ट वर्शन नोट
Gradle 5.6.4 5.6.4 ज़्यादा जानने के लिए, Gradle को अपडेट करना लेख पढ़ें.
एसडीके बिल्ड टूल 28.0.3 28.0.3 एसडीके बिल्ड टूल इंस्टॉल करें या कॉन्फ़िगर करें.

नई सुविधाएं

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

  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 से सीधे तौर पर नेटिव लाइब्रेरी ऐक्सेस कर सकता है. इसके लिए, लाइब्रेरी की कॉपी बनाने की ज़रूरत नहीं होती.
  • डाउनलोड करने के लिए कम साइज़, क्योंकि 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 में तय नहीं किया है, तो Android Gradle प्लगिन उस संसाधन को आपके प्रोजेक्ट को कंपाइल करते समय शामिल नहीं करेगा. इस बदलाव से, Resource Not Found रनटाइम अपवादों की संख्या कम हो जाएगी और बिल्ड की स्पीड बेहतर हो जाएगी.

D8 अब एनोटेशन के लिए, CLASS के रखरखाव की नीति का पालन करता है

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