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

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

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

नई सुविधाएं

Android Gradle प्लगिन के इस वर्शन में, ये नई सुविधाएं शामिल हैं.

View Binding

View binding की मदद से, कोड में व्यू रेफ़रंस करते समय, कंपाइल-टाइम सुरक्षा मिलती है. अब findViewById() की जगह, अपने-आप जनरेट हुई बाइंडिंग क्लास रेफ़रंस का इस्तेमाल किया जा सकता है. View binding का इस्तेमाल करने के लिए, हर मॉड्यूल की build.gradle फ़ाइल में यह शामिल करें:

      android {
          viewBinding.enabled = true
      }
      
      android {
          viewBinding.enabled = true
      }
      

ज़्यादा जानने के लिए, View Binding का दस्तावेज़ पढ़ें.

Maven Publish प्लगिन के लिए सहायता

Android Gradle प्लगिन में, Maven Publish Gradle प्लगिन के लिए सहायता शामिल है. इसकी मदद से, Apache Maven रिपॉज़िटरी में बिल्ड आर्टफ़ैक्ट पब्लिश किए जा सकते हैं. Android Gradle प्लगिन, आपके ऐप्लिकेशन या लाइब्रेरी मॉड्यूल में मौजूद हर बिल्ड वैरिएंट आर्टफ़ैक्ट के लिए एक कॉम्पोनेंट बनाता है. इसका इस्तेमाल, Maven रिपॉज़िटरी में पब्लिकेशन को पसंद के मुताबिक बनाने के लिए किया जा सकता है.

ज़्यादा जानने के लिए, Maven Publish प्लगिन का इस्तेमाल करने का तरीका पेज पर जाएं.

नया डिफ़ॉल्ट पैकेजिंग टूल

अपने ऐप्लिकेशन का डीबग वर्शन बनाते समय, प्लगिन एक नए पैकेजिंग टूल का इस्तेमाल करता है. इसे zipflinger कहा जाता है. इसकी मदद से, आपका APK बनाया जाता है. इस नए टूल से, बिल्ड की स्पीड बेहतर होनी चाहिए. अगर नया पैकेजिंग टूल आपकी उम्मीद के मुताबिक काम नहीं करता है, तो कृपया गड़बड़ी की शिकायत करें. `gradle.properties` फ़ाइल में यह शामिल करके, पुराने पैकेजिंग टूल का इस्तेमाल किया जा सकता है:

        android.useNewApkCreator=false
      

नेटिव बिल्ड एट्रिब्यूशन

अब यह पता लगाया जा सकता है कि आपके प्रोजेक्ट में मौजूद हर C/C++ फ़ाइल को बिल्ड और लिंक करने में Clang को कितना समय लगता है. 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 DSL विकल्प का इस्तेमाल किया जाता है. ज़्यादा जानकारी के लिए, कंप्रेस की गई नेटिव लाइब्रेरी को पैकेज करने के लिए DSL का इस्तेमाल करना लेख पढ़ें.

डिफ़ॉल्ट NDK वर्शन

अगर NDK के एक से ज़्यादा वर्शन डाउनलोड किए जाते हैं, तो Android Gradle प्लगिन अब आपके सोर्स कोड फ़ाइलों को कंपाइल करने के लिए, डिफ़ॉल्ट वर्शन चुनता है. पहले, प्लगिन NDK का सबसे नया डाउनलोड किया गया वर्शन चुनता था. प्लगिन की ओर से चुने गए डिफ़ॉल्ट वर्शन को बदलने के लिए, मॉड्यूल की android.ndkVersion प्रॉपर्टी का इस्तेमाल करेंbuild.gradle फ़ाइल में.

R क्लास जनरेट करने की प्रोसेस आसान बनाना

Android Gradle प्लगिन, कंपाइल क्लासपाथ को आसान बनाता है. इसके लिए, आपके प्रोजेक्ट में मौजूद हर लाइब्रेरी मॉड्यूल के लिए सिर्फ़ एक R क्लास जनरेट की जाती है. साथ ही, उन R क्लास को अन्य मॉड्यूल डिपेंडेंसी के साथ शेयर किया जाता है. इस ऑप्टिमाइज़ेशन से, बिल्ड की स्पीड बेहतर होनी चाहिए. हालांकि, इसके लिए आपको इन बातों का ध्यान रखना होगा:

  • कंपाइलर, R क्लास को अपस्ट्रीम मॉड्यूल डिपेंडेंसी के साथ शेयर करता है. इसलिए, यह ज़रूरी है कि आपके प्रोजेक्ट में मौजूद हर मॉड्यूल, पैकेज के लिए अलग नाम का इस्तेमाल करे.
  • प्रोजेक्ट की अन्य डिपेंडेंसी के लिए, लाइब्रेरी की R क्लास की जानकारी देखने की अनुमति, लाइब्रेरी को डिपेंडेंसी के तौर पर शामिल करने के लिए इस्तेमाल किए गए कॉन्फ़िगरेशन से तय होती है. उदाहरण के लिए, अगर लाइब्रेरी A में लाइब्रेरी B को 'api' डिपेंडेंसी के तौर पर शामिल किया जाता है, तो लाइब्रेरी A और लाइब्रेरी A पर निर्भर अन्य लाइब्रेरी के पास, लाइब्रेरी B की R क्लास को ऐक्सेस करने की अनुमति होती है. हालांकि, अन्य लाइब्रेरी के पास, लाइब्रेरी B की R क्लास को ऐक्सेस करने की अनुमति नहीं हो सकती. अगर लाइब्रेरी A, implementation डिपेंडेंसी कॉन्फ़िगरेशन का इस्तेमाल करती है. ज़्यादा जानने के लिए, ज़्यादा जानने के लिए, डिपेंडेंसी कॉन्फ़िगरेशन के बारे में पढ़ें.

डिफ़ॉल्ट कॉन्फ़िगरेशन से गायब संसाधन हटाना

लाइब्रेरी मॉड्यूल के लिए, अगर किसी ऐसी भाषा के लिए कोई संसाधन शामिल किया जाता है जो संसाधनों के डिफ़ॉल्ट सेट में शामिल नहीं है, तो Android Gradle प्लगिन उस संसाधन को शामिल नहीं करता. उदाहरण के लिए, अगर hello_world में स्ट्रिंग संसाधन के तौर पर /values-es/strings.xml शामिल किया जाता है, लेकिन उस संसाधन को /values/strings.xml में तय नहीं किया जाता है, तो Android Gradle प्लगिन आपके प्रोजेक्ट को कंपाइल करते समय उस संसाधन को शामिल नहीं करता. व्यवहार में हुए इस बदलाव से, रनटाइम में Resource Not Found से जुड़ी गड़बड़ियां कम होनी चाहिए और बिल्ड की स्पीड बेहतर होनी चाहिए.

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

अब D8, आपके ऐप्लिकेशन को कंपाइल करते समय, CLASS रिटेंशन पॉलिसी लागू करने वाले एनोटेशन का पालन करता है. साथ ही, रनटाइम में ये एनोटेशन उपलब्ध नहीं होते. ऐप्लिकेशन के टारगेट एसडीके को एपीआई लेवल 23 पर सेट करने पर भी, ऐसा ही होता है. पहले, Android Gradle प्लगिन और D8 के पुराने वर्शन का इस्तेमाल करके, आपके ऐप्लिकेशन को कंपाइल करते समय, रनटाइम के दौरान इन एनोटेशन को ऐक्सेस किया जा सकता था.

व्यवहार में हुए अन्य बदलाव

  • aaptOptions.noCompress अब सभी प्लैटफ़ॉर्म (APK और बंडल, दोनों के लिए) पर, केस-सेंसिटिव नहीं है. साथ ही, यह उन पाथ का पालन करता है जिनमें अंग्रेज़ी के बड़े अक्षरों का इस्तेमाल किया गया है.
  • डेटा बाइंडिंग अब डिफ़ॉल्ट रूप से इंक्रीमेंटल है. ज़्यादा जानने के लिए, समस्या #110061530 देखें.

  • Roboelectric यूनिट टेस्ट सहित, सभी यूनिट टेस्ट अब पूरी तरह से कैश किए जा सकते हैं. ज़्यादा जानने के लिए, समस्या #115873047 देखें.

गड़बड़ियां ठीक की गईं

Android Gradle प्लगिन के इस वर्शन में, ये गड़बड़ियां ठीक की गई हैं:

पहले से मालूम समस्याएं

इस सेक्शन में, 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";
                  }
                }