Android Gradle प्लगिन 4.1.0 (अगस्त 2020)

इनके साथ काम करता है

सबसे पुराना वर्शन डिफ़ॉल्ट वर्शन नोट
Gradle 6.5 लागू नहीं ज़्यादा जानकारी के लिए, Gradle को अपडेट करने का तरीका देखें.
एसडीके बिल्ड टूल 29.0.2 29.0.2 एसडीके बिल्ड टूल इंस्टॉल करें या कॉन्फ़िगर करें.
एनडीके (NDK) लागू नहीं 21.1.6352462 एनडीके का कोई दूसरा वर्शन इंस्टॉल करें या कॉन्फ़िगर करें.

<p>This version of the Android plugin requires the following:</p>
<ul>
  <li>
    <p><a href="https://docs.gradle.org/6.5.1/release-notes.html">Gradle 6.5</a>.
    To learn more, read the section about <a href="#updating-gradle">updating
    Gradle</a>.</p>
  </li>
  <li>
    <p><a href="/studio/releases/build-tools.html#notes">SDK Build Tools
    29.0.2</a> or higher.</p>
  </li>
</ul>
<p>The default NDK version in this release is 21.1.6352462. To install a
different NDK version, see <a href="/studio/projects/install-ndk#specific-version">Install a specific version of the NDK</a>.</p>

नई सुविधाएं

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

Kotlin Script DSL के साथ काम करता है

Kotlin buildscript का इस्तेमाल करने वाले लोगों के लिए, एडिटिंग के अनुभव को बेहतर बनाने के लिए, Android Gradle प्लगिन 4.1 के डीएसएल और एपीआई को अब Kotlin इंटरफ़ेस के सेट में, उनकी लागू करने वाली क्लास से अलग तौर पर तय किया गया है. इसका मतलब है कि:

  • Kotlin टाइप पर, वैल्यू न होने की स्थिति और बदले जा सकने की स्थिति के बारे में अब साफ़ तौर पर बताया गया है.
  • इन इंटरफ़ेस से जनरेट किया गया दस्तावेज़, Kotlin API Reference में पब्लिश किया जाता है.
  • Android Gradle प्लगिन के एपीआई को साफ़ तौर पर तय किया गया है, ताकि आने वाले समय में Android बिल्ड को कमज़ोर होने से बचाया जा सके.

अहम जानकारी: अगर आपने पहले से ही KTS बिल्ड स्क्रिप्ट का इस्तेमाल किया है या buildSrc में Kotlin का इस्तेमाल किया है, तो ऐसा हो सकता है कि कुछ गड़बड़ियों के लिए सोर्स कंपैटिबिलिटी टूट जाए. ये गड़बड़ियां, पिछली रिलीज़ में रन-टाइम गड़बड़ियों के तौर पर दिखती थीं.

डीएसएल में बदलाव करने के लिए डिज़ाइन किए गए कलेक्शन टाइप को अब एक जैसा इस तरह से तय किया गया है:

val collection: MutableCollectionType

इसका मतलब है कि अब Kotlin स्क्रिप्ट में, यहां दिया गया कोड नहीं लिखा जा सकता. हालांकि, पहले कुछ कलेक्शन के लिए यह कोड लिखा जा सकता था:

collection = collectionTypeOf(...)

हालांकि, कलेक्शन में बदलाव करने की सुविधा सभी के लिए उपलब्ध है. इसलिए, अब collection += … और collection.add(...) हर जगह काम करने चाहिए.

अगर आपको Android Gradle प्लगिन Kotlin API और DSL का इस्तेमाल करने वाले प्रोजेक्ट को अपग्रेड करते समय कोई समस्या आती है, तो कृपया बग की रिपोर्ट करें.

एएआर से C/C++ डिपेंडेंसी एक्सपोर्ट करना

Android Gradle प्लगिन 4.0 में, AAR डिपेंडेंसी में Prefab पैकेज इंपोर्ट करने की सुविधा जोड़ी गई है. AGP 4.1 में, अब Android लाइब्रेरी प्रोजेक्ट के लिए, अपने बाहरी नेटिव बिल्ड से लाइब्रेरी को AAR में एक्सपोर्ट किया जा सकता है.

अपनी नेटिव लाइब्रेरी एक्सपोर्ट करने के लिए, अपनी लाइब्रेरी प्रोजेक्ट की build.gradle फ़ाइल के android ब्लॉक में यह जोड़ें:

buildFeatures {
    prefabPublishing true
}

prefab { <var>mylibrary</var&;gt { headers "src/main/cpp/<var>mylibrary</var>/include" }

<var>myotherlibrary</var> {
    headers "src/main/cpp/<var>myotherlibrary</var>/include"
}

}

buildFeatures {
    prefabPublishing = true
}

prefab { create("<var>mylibrary</var>") { headers = "src/main/cpp/<var>mylibrary</var>/include" }

create("<var>myotherlibrary</var>") {
    headers = "src/main/cpp/<var>myotherlibrary</var>/include"
}

}

इस उदाहरण में, ndk-build या CMake के बाहरी नेटिव बिल्ड से मिली mylibrary और myotherlibrary लाइब्रेरी को आपके बिल्ड से बनाए गए AAR में पैकेज किया जाएगा. साथ ही, हर लाइब्रेरी, तय की गई डायरेक्ट्री से हेडर को अपने डिपेंडेंट में एक्सपोर्ट करेगी.

ध्यान दें: Android Gradle प्लगइन 4.0 और उसके बाद के वर्शन का इस्तेमाल करने वाले लोगों के लिए, पहले से बनी नेटिव लाइब्रेरी इंपोर्ट करने की कॉन्फ़िगरेशन सेटिंग बदल गई हैं. ज़्यादा जानकारी के लिए, 4.0 वर्शन की जानकारी देखें.

Kotlin मेटाडेटा के लिए R8 की सुविधा

Kotlin, Java क्लास फ़ाइलों में कस्टम मेटाडेटा का इस्तेमाल करता है, ताकि Kotlin लैंग्वेज कंस्ट्रक्ट की पहचान की जा सके. R8 अब Kotlin मेटाडेटा को बनाए रखने और फिर से लिखने की सुविधा के साथ काम करता है. इससे kotlin-reflect का इस्तेमाल करके, Kotlin लाइब्रेरी और ऐप्लिकेशन को पूरी तरह से छोटा किया जा सकता है.

Kotlin मेटाडेटा को सुरक्षित रखने के लिए, कीप के ये नियम जोड़ें:

-keep class kotlin.Metadata { *; }

-keepattributes RuntimeVisibleAnnotations

इससे R8 को उन सभी क्लास के लिए Kotlin मेटाडेटा को बनाए रखने का निर्देश मिलेगा जिन्हें सीधे तौर पर बनाए रखा गया है.

ज़्यादा जानकारी के लिए, Medium पर R8 के साथ Kotlin रिफ़्लेक्शन का इस्तेमाल करके, Kotlin लाइब्रेरी और ऐप्लिकेशन का साइज़ कम करना{:.external} लेख पढ़ें.

डीबग बिल्ड में दावे

Android Gradle plugin 4.1.0 और इसके बाद के वर्शन का इस्तेमाल करके, अपने ऐप्लिकेशन का डीबग वर्शन बनाने पर, बिल्ट-इन कंपाइलर (D8) आपके ऐप्लिकेशन के कोड को फिर से लिखेगा. इससे कंपाइल टाइम पर असर्शन चालू हो जाएंगे, ताकि असर्शन की जांच हमेशा चालू रहे.

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

Android Gradle प्लगिन का बिल्ड कैश हटा दिया गया है

AGP 4.1 में, AGP की बिल्ड कैश मेमोरी को हटा दिया गया था. AGP 2.3 में, Gradle बिल्ड कैश मेमोरी के साथ काम करने के लिए AGP बिल्ड कैश मेमोरी को पेश किया गया था. हालांकि, AGP 4.1 में AGP बिल्ड कैश मेमोरी को पूरी तरह से Gradle बिल्ड कैश मेमोरी से बदल दिया गया था. इस बदलाव से, ऐप्लिकेशन बनाने में लगने वाले समय पर कोई असर नहीं पड़ता.

cleanBuildCache टास्क और android.enableBuildCache और android.buildCacheDir प्रॉपर्टी अब काम नहीं करती हैं. इन्हें AGP 7.0 में हटा दिया जाएगा. फ़िलहाल, android.enableBuildCache प्रॉपर्टी का कोई असर नहीं पड़ता. वहीं, android.buildCacheDir प्रॉपर्टी और cleanBuildCache टास्क, AGP 7.0 तक काम करेंगे. इनका इस्तेमाल, AGP की किसी मौजूदा बिल्ड कैश मेमोरी के कॉन्टेंट को मिटाने के लिए किया जा सकता है.

कोड छोटा करने की सुविधा का इस्तेमाल करने वाले ऐप्लिकेशन के साइज़ में काफ़ी कमी आई है

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

android.namespacedRClass प्रॉपर्टी का नाम बदलकर android.nonTransitiveRClass कर दिया गया है

एक्सपेरिमेंट के तौर पर उपलब्ध फ़्लैग android.namespacedRClass का नाम बदलकर android.nonTransitiveRClass कर दिया गया है.

gradle.properties फ़ाइल में सेट किया गया यह फ़्लैग, हर लाइब्रेरी के R क्लास के नेमस्पेस को चालू करता है. इससे, लाइब्रेरी के R क्लास में सिर्फ़ वे संसाधन शामिल होते हैं जिन्हें लाइब्रेरी में ही एलान किया गया है. इसमें लाइब्रेरी की डिपेंडेंसी से कोई संसाधन शामिल नहीं होता. इससे, उस लाइब्रेरी के R क्लास का साइज़ कम हो जाता है.

Kotlin DSL: coreLibraryDesugaringEnabled का नाम बदला गया

Kotlin DSL के कंपाइल विकल्प coreLibraryDesugaringEnabled को बदलकर isCoreLibraryDesugaringEnabled कर दिया गया है. इस फ़्लैग के बारे में ज़्यादा जानने के लिए, Java 8 या इसके बाद के वर्शन के एपीआई के लिए, डिसुगरिंग की सुविधा (Android Gradle प्लगिन 4.0.0 या इसके बाद के वर्शन) लेख पढ़ें.

लाइब्रेरी प्रोजेक्ट में BuildConfig क्लास से वर्शन प्रॉपर्टी हटा दी गई हैं

सिर्फ़ लाइब्रेरी प्रोजेक्ट के लिए, जनरेट की गई BuildConfig क्लास से BuildConfig.VERSION_NAME और BuildConfig.VERSION_CODE प्रॉपर्टी हटा दी गई हैं. ऐसा इसलिए किया गया है, क्योंकि ये स्टैटिक वैल्यू, ऐप्लिकेशन के वर्शन कोड और नाम की फ़ाइनल वैल्यू को नहीं दिखाती थीं. इसलिए, ये गुमराह करने वाली थीं. इसके अलावा, मेनिफ़ेस्ट मर्ज करने के दौरान इन वैल्यू को खारिज कर दिया गया था.

Android Gradle प्लगिन के आने वाले वर्शन में, लाइब्रेरी के लिए डीएसएल से versionName और versionCode प्रॉपर्टी भी हटा दी जाएंगी. फ़िलहाल, लाइब्रेरी के सब-प्रोजेक्ट से ऐप्लिकेशन के वर्शन कोड/नाम को अपने-आप ऐक्सेस करने का कोई तरीका नहीं है.

ऐप्लिकेशन मॉड्यूल के लिए, कोई बदलाव नहीं किया गया है. डीएसएल में अब भी versionCode और versionName को वैल्यू असाइन की जा सकती हैं. ये वैल्यू, ऐप्लिकेशन के मेनिफ़ेस्ट और BuildConfig फ़ील्ड में दिखेंगी.

NDK पाथ सेट करना

अपने मॉड्यूल की build.gradle फ़ाइल में android.ndkPath प्रॉपर्टी का इस्तेमाल करके, अपने लोकल NDK इंस्टॉलेशन का पाथ सेट किया जा सकता है.


android {
  ndkPath "your-custom-ndk-path"
}

android {
  ndkPath = "your-custom-ndk-path"
}

अगर इस प्रॉपर्टी का इस्तेमाल android.ndkVersion प्रॉपर्टी के साथ किया जाता है, तो इस पाथ में ऐसा NDK वर्शन होना चाहिए जो android.ndkVersion से मेल खाता हो.

लाइब्रेरी की यूनिट टेस्ट के व्यवहार में बदलाव

हमने लाइब्रेरी की यूनिट टेस्ट को कंपाइल और रन करने के तरीके में बदलाव किया है. अब लाइब्रेरी के यूनिट टेस्ट, लाइब्रेरी की कंपाइल/रनटाइम क्लास के साथ कंपाइल और रन किए जाते हैं. इससे यूनिट टेस्ट, लाइब्रेरी का इस्तेमाल उसी तरह करता है जिस तरह बाहरी सबप्रोजेक्ट करते हैं. इस कॉन्फ़िगरेशन से आम तौर पर बेहतर टेस्टिंग होती है.

कुछ मामलों में, डेटा बाइंडिंग का इस्तेमाल करने वाली लाइब्रेरी की यूनिट टेस्ट में, DataBindingComponent या BR क्लास मौजूद नहीं हो सकती हैं. उन टेस्ट को androidTest प्रोजेक्ट में इंस्ट्रुमेंटेड टेस्ट में पोर्ट करना होगा, क्योंकि यूनिट टेस्ट में उन क्लास के ख़िलाफ़ कंपाइल करने और चलाने से गलत आउटपुट मिल सकता है.

io.fabric Gradle प्लगिन का इस्तेमाल बंद कर दिया गया है

io.fabric Gradle प्लग इन अब काम नहीं करता. साथ ही, यह Android Gradle प्लग इन के 4.1 वर्शन के साथ काम नहीं करता. Fabric SDK के बंद किए गए वर्शन और Firebase Crashlytics SDK पर माइग्रेट करने के बारे में ज़्यादा जानने के लिए, Firebase Crashlytics SDK पर अपग्रेड करना लेख पढ़ें.