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

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

सबसे पुराना वर्शन डिफ़ॉल्ट वर्शन नोट
ग्रेडल 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 स्क्रिप्ट डीएसएल के लिए सहायता

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

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

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

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

val collection: MutableCollectionType

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

collection = collectionTypeOf(...)

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

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

AAR से 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 लाइब्रेरी और ऐप्लिकेशन को पूरी तरह से छोटा किया जा सके kotlin-reflect का इस्तेमाल करके.

Kotlin मेटाडेटा को बनाए रखने के लिए, ये कीप रूल जोड़ें:

-keep class kotlin.Metadata { *; }

-keepattributes RuntimeVisibleAnnotations

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

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

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

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

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

Android Gradle प्लगिन का बिल्ड कैश मेमोरी हटाना

AGP 4.1 में, AGP बिल्ड कैश मेमोरी हटा दी गई है. AGP बिल्ड कैश मेमोरी को पहले AGP 2.3 में, Gradle बिल्ड कैश मेमोरी के साथ जोड़ा गया था. हालांकि, 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+ API के लिए डिसुगरिंग की सुविधा (Android Gradle प्लगिन 4.0.0+) देखें.

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

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

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

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

एनडीके का पाथ सेट करना

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


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

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

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

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

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

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

io.fabric Gradle प्लगिन अब काम नहीं करता

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