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

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

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

3.6.4 (जुलाई 2020)

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

  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 डिपेंडेंसी कॉन्फ़िगरेशन का इस्तेमाल करती है. ज़्यादा जानने के लिए, डिपेंडेंसी कॉन्फ़िगरेशन के बारे में पढ़ें.

डिफ़ॉल्ट कॉन्फ़िगरेशन में मौजूद नहीं हैं, उन्हें हटाएं

लाइब्रेरी मॉड्यूल के लिए, अगर आपने किसी ऐसी भाषा के लिए कोई संसाधन शामिल किया है जिसे आपने संसाधनों के डिफ़ॉल्ट सेट में शामिल नहीं किया है (उदाहरण के लिए, अगर आपने /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";
                  }
                }