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

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

नई सुविधाएं

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

बाइंडिंग देखें

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

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

ज़्यादा जानने के लिए, View ऐसा दस्तावेज़ जिसे मानना ज़रूरी है.

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

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

ज़्यादा जानने के लिए, होम पेज पर जाएं और Maven पब्लिश का इस्तेमाल करें प्लगिन.

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

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

        android.useNewApkCreator=false
      

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

अब यह तय किया जा सकता है कि Clang को बनाने में कितना समय लगता है और हर C/C++ फ़ाइल को अपने प्रोजेक्ट में लिंक कर सकता है. Gradle, एक Chrome ट्रेस का आउटपुट दे सकता है जिसमें इन कंपाइलर इवेंट के लिए टाइमस्टैंप शामिल हैं, ताकि आप इससे यह समझने में मदद मिलती है कि आपका प्रोजेक्ट बनाने में कितना समय लगता है. इस बिल्ड का आउटपुट देने के लिए एट्रिब्यूशन फ़ाइल का इस्तेमाल करके, ये काम करें:

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

    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 का इस्तेमाल करें नेटिव लाइब्रेरी.

डिफ़ॉल्ट एनडीके वर्शन

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

आसान R क्लास जनरेशन

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

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

उन संसाधनों को हटाएं जो डिफ़ॉल्ट रूप से उपलब्ध नहीं हैं कॉन्फ़िगरेशन

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

D8 अब क्लास के निजी डेटा के रखरखाव की नीति के हिसाब से काम करता है एनोटेशन के लिए

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

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

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

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

बग समाधान

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

  • Robolectric यूनिट टेस्ट अब उन लाइब्रेरी मॉड्यूल में काम करते हैं जिनका इस्तेमाल किया जाता है डेटा बाइंडिंग. इस बारे में ज़्यादा जानने के लिए, यह देखें समस्या #126775542 है.
  • अब आपके पास connectedAndroidTest टास्क चलाने का विकल्प है एक से ज़्यादा मॉड्यूल जोड़ें, जबकि Gradle समानांतर एक्ज़ीक्यूशन मोड चालू है.

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

इस सेक्शन में उन समस्याओं के बारे में बताया गया है जो 'Android Gradle प्लग इन' में मौजूद हैं 3.6.0.

Android लिंट टास्क की धीमी परफ़ॉर्मेंस

Android लिंट को कुछ प्रोजेक्ट को पूरा होने में ज़्यादा समय लग सकता है, क्योंकि अपने पार्सिंग इन्फ़्रास्ट्रक्चर में रिग्रेशन की वजह से, कैलकुलेशन करने में समय लग रहा है कुछ कोड कंस्ट्रक्शन में lambdas के लिए अनुमानित टाइप की वैल्यू.

समस्या को इस तौर पर रिपोर्ट किया गया है 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";
                  }
                }