Android Gradle प्लग इन 7.0.0 (जुलाई 2021)

'Android Gradle प्लग इन 7.0.0' एक मुख्य रिलीज़ है, जिसमें कई तरह के नए वर्शन शामिल हैं सुविधाओं और सुधारों के बारे में है.

7.0.1 (अगस्त, 2021)

इस छोटे से अपडेट में कई गड़बड़ियां ठीक की गई हैं. प्रमुख बग समाधानों की सूची देखने के लिए, इस पर संबंधित पोस्ट पढ़ें रिलीज़ से जुड़े अपडेट की जानकारी देने वाला ब्लॉग.

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

कम से कम वर्शन डिफ़ॉल्ट वर्शन
ग्रेडल 7.0.2 7.0.2
SDK टूल बनाने वाले टूल 30.0.2 30.0.2
एनडीके लागू नहीं 21.4.7075529
जेडीके 11 11

AGP 7.0 चलाने के लिए JDK 11 की ज़रूरत है

अपना ऐप्लिकेशन बनाने के लिए, 'Android Gradle प्लग इन 7.0' का इस्तेमाल करते समय, JDK 11 वर्शन अब Gradle चलाने के लिए ज़रूरी है. Android Studio Arctic Fox के बंडल में, JDK 11 और Gradle को डिफ़ॉल्ट रूप से इस्तेमाल करने के लिए कॉन्फ़िगर करता है, इसका मतलब है कि ज़्यादातर Android Studio उपयोगकर्ताओं को अपने प्रोजेक्ट के कॉन्फ़िगरेशन में कोई बदलाव करने की ज़रूरत नहीं है.

अगर आपको मैन्युअल रूप से सेट नहीं करना है, तो JDK वर्शन का इस्तेमाल करता है, तो आपको JDK 11 का इस्तेमाल करना होगा. या उससे ज़्यादा.

Android Studio के बिना AGP का इस्तेमाल करते समय, JDK वर्शन को इस तारीख तक अपग्रेड करें JAVA_HOME एनवायरमेंट वैरिएबल को सेट करना या -Dorg.gradle.java.home कमांड-लाइन का विकल्प को आपकी JDK 11 इंस्टॉलेशन डायरेक्ट्री में सेव करना होगा.

ध्यान दें कि SDK टूल के अब काम नहीं करने वाले टूल पैकेज में, SDK Manager और AVD मैनेजर JDK 11 वर्शन के साथ काम नहीं करता. SDK Manager और AVD Manager का इस्तेमाल जारी रखने के लिए एजीपी 7.0 और उसके बाद के वर्शन के साथ, आपको 'टूल' के नए वर्शन पर स्विच करना होगा मौजूदा Android SDK टूल के कमांड-लाइन टूल पैकेज भी शामिल है.

वैरिएंट एपीआई की स्टेबल

वैरिएंट एपीआई के नए वर्शन पर अब कोई बदलाव नहीं किया जा सकता. इसमें नए इंटरफ़ेस देखें com.android.build.api.variant और उदाहरण के तौर पर gradle-recipes GitHub प्रोजेक्ट. नई सदस्यता के हिस्से के रूप में वैरिएंट एपीआई के तौर पर, हमने कई इंटरमीडिएट फ़ाइलें उपलब्ध कराई हैं. इन्हें या आर्टफ़ैक्ट आर्टफ़ैक्ट इंटरफ़ेस पर कॉपी करने की सुविधा मिलती है. मर्ज किए गए मेनिफ़ेस्ट की तरह ये आर्टफ़ैक्ट सुरक्षित तरीके से हासिल किए जा सकते हैं और तीसरे पक्ष के प्लगिन और कोड का इस्तेमाल करके कस्टमाइज़ किया जा सकता है.

हम नई सुविधाएं जोड़कर, Variant API का इस्तेमाल जारी रखेंगे के लिए उपलब्ध कराए जाने वाले इंटरमीडिएट आर्टफ़ैक्ट की संख्या को बढ़ाना चाहते हैं पसंद के मुताबिक बनाने की सुविधा मिलती है.

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

यह सेक्शन, Android Gradle में एक से ज़्यादा लिंट के व्यवहार में होने वाले बदलावों के बारे में बताता है प्लगिन 7.0.0.

लाइब्रेरी डिपेंडेंसी के लिए बेहतर लिंट

checkDependencies = true के साथ लिंट चलाना अब और तेज़ हो गया है मुक़ाबले 71 % की बढ़ोतरी हुई. Android प्रोजेक्ट के लिए जिसमें लाइब्रेरी वाला ऐप्लिकेशन शामिल है डिपेंडेंसी के लिए, checkDependencies को true जैसा कि नीचे दिखाया गया है और लिंट के ज़रिए ./gradlew :app:lint, जो सभी डिपेंडेंसी का विश्लेषण करेगा मॉड्यूल साथ-साथ और एक रिपोर्ट तैयार करते हैं. इस रिपोर्ट में, ऐप और इसकी सभी डिपेंडेंसी.

ग्रूवी

// build.gradle
android {
  ...
  lintOptions {
    checkDependencies true
  }
}

Kotlin

// build.gradle.kts
android {
  ...
  lint {
    isCheckDependencies = true
  }
}

लिंट टास्क अब UP-TO-DATE हो सकते हैं

अगर किसी मॉड्यूल के सोर्स और संसाधनों में बदलाव नहीं हुआ है, तो लिंट विश्लेषण तो मॉड्यूल के लिए काम को फिर से चलाने की ज़रूरत नहीं है. ऐसा होने पर, कार्य का निष्पादन "UP-TO-DATE" के रूप में दिखाई देता है Gradle में आउटपुट. इस बदलाव से, checkDependencies = true वाले किसी ऐप्लिकेशन मॉड्यूल पर लिंट चलाने पर सिर्फ़ वे मॉड्यूल बदल जाएंगे जिनमें बदलाव हुआ है उनका विश्लेषण करना ज़रूरी है. इस वजह से, लिंट और भी तेज़ी से दौड़ सकता है.

अगर लिंट रिपोर्ट टास्क के इनपुट नहीं हैं, तो भी उसे चलाने की ज़रूरत नहीं है बदल दिया गया है. इससे मिलती-जुलती एक समस्या यह है कि कोई लिंट नहीं है लिंट टास्क के UP-TO-DATE होने पर, stdout पर प्रिंट किया गया टेक्स्ट आउटपुट (समस्या #191897708).

डाइनैमिक-सुविधा वाले मॉड्यूल पर लिंट चलाना

AGP, अब डाइनैमिक-सुविधा मॉड्यूल से चलने वाले लिंट के साथ काम नहीं करता. संबंधित ऐप्लिकेशन मॉड्यूल से चलने वाले लिंट पर, लिंट चलेगा इसके डाइनैमिक-सुविधा मॉड्यूल और ऐप्लिकेशन के लिंट की सभी समस्याओं को शामिल करती है रिपोर्ट. इससे मिलती-जुलती एक जानी-पहचानी समस्या यह है कि लिंट चलाते समय किसी ऐप्लिकेशन मॉड्यूल से checkDependencies = true लिए, डाइनैमिक-सुविधा लाइब्रेरी डिपेंडेंसी की जांच तब तक नहीं की जाती, जब तक वे ऐप्लिकेशन डिपेंडेंसी (समस्या #191977888) है.

लिंट सिर्फ़ डिफ़ॉल्ट वैरिएंट पर चल रहा है

./gradlew :app:lint को चलाने पर अब सिर्फ़ डिफ़ॉल्ट वैरिएंट. AGP के पिछले वर्शन में, यह सभी अलग-अलग वर्शन का इस्तेमाल करें.

R8 श्रिंकर में क्लास से जुड़ी चेतावनियां नहीं दिख रही हैं

R8 ज़्यादा सटीक और छूटी हुई क्लास और -dontwarn विकल्प को लगातार मैनेज करता है. इसलिए, आपको क्लास में शामिल न होने से जुड़ी चेतावनियों का आकलन करना शुरू करना चाहिए R8 तक.

जब R8 को कोई ऐसा क्लास रेफ़रंस मिलता है जिसके बारे में आपके ऐप्लिकेशन में नहीं बताया गया है या तो वह एक चेतावनी देगा जो आपके बिल्ड में दिखेगी आउटपुट. उदाहरण के लिए:

R8: Missing class: java.lang.instrument.ClassFileTransformer

इस चेतावनी का मतलब है कि क्लास की परिभाषा java.lang.instrument.ClassFileTransformer नहीं मिल सका आपके ऐप्लिकेशन के कोड का विश्लेषण करते समय. आम तौर पर इसका मतलब है कि कोई गड़बड़ी हुई है, ऐसा भी हो सकता है कि आप इस चेतावनी को अनदेखा करना चाहें. दो सामान्य वजहें इन्हें अनदेखा करने के लिए:

  1. जेवीएम और छूटी हुई क्लास को टारगेट करने वाली लाइब्रेरी जेवीएम की हैं (जैसा कि ऊपर दिए गए उदाहरण में बताया गया है).

  2. आपकी कोई एक डिपेंडेंसी, कंपाइल-टाइम एपीआई का इस्तेमाल करती है.

-dontwarn को जोड़कर, क्लास के मौजूद न होने की चेतावनी को अनदेखा किया जा सकता है नियम को अपनी proguard-rules.pro फ़ाइल में अपलोड करें. उदाहरण के लिए:

-dontwarn java.lang.instrument.ClassFileTransformer

आपकी सुविधा के लिए, AGP एक ऐसी फ़ाइल जनरेट करेगा जिसमें सभी कीवर्ड शामिल होंगे नियम मौजूद नहीं है, तो उन्हें फ़ाइल पाथ पर इस तरह लिखें: app/build/outputs/mapping/release/missing_rules.txt. जोड़ें चेतावनियों को अनदेखा करने के लिए, अपनी proguard-rules.pro फ़ाइल पर नियम बनाएं.

AGP 7.0 में, क्लास में शामिल न होने वाले मैसेज चेतावनी के तौर पर दिखेंगे. इसके अलावा, इस वर्शन में नीचे दिए गए काम किए जा सकते हैं सेट करके, उन्हें गड़बड़ियों में बदलें android.r8.failOnMissingClasses = true इंच gradle.properties. AGP 8.0 में, ये चेतावनियां आपके बिल्ड को तोड़ने वाली गड़बड़ियां. AGP 7.0 के व्यवहार को अपने-ignorewarnings proguard-rules.pro फ़ाइल का इस्तेमाल करें, लेकिन इसका सुझाव नहीं दिया जाता है.

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

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

AGP 7.0 में, android.enableBuildCache प्रॉपर्टी, android.buildCacheDir प्रॉपर्टी और cleanBuildCache टास्क हटा दिया गया है.

अपने प्रोजेक्ट में Java 11 सोर्स कोड का इस्तेमाल करना

अब आप अपने ऐप्लिकेशन के प्रोजेक्ट में, Java 11 सोर्स कोड तक को कंपाइल कर सकते हैं आपको निजी इंटरफ़ेस विधियों, डायमंड जैसी नई भाषा सुविधाओं का उपयोग करने अनाम क्लास के लिए ऑपरेटर और Lambda पैरामीटर के लिए लोकल वैरिएबल सिंटैक्स.

इस सुविधा को चालू करने के लिए, compileOptions को अपनी पसंद के हिसाब से सेट करें Java वर्शन और compileSdkVersion को 30 या उससे बाद वाले वर्शन पर सेट करें:

// build.gradle
android {
  compileSdkVersion 30
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_11
    targetCompatibility JavaVersion.VERSION_11
  }
  // For Kotlin projects
  kotlinOptions {
    jvmTarget = "11"
  }
}
// build.gradle.kts
android {
  compileSdkVersion(30)
  compileOptions {
    sourceCompatibility(JavaVersion.VERSION_11)
    targetCompatibility(JavaVersion.VERSION_11)
  }
  kotlinOptions {
    jvmTarget = "11"
  }
}

डिपेंडेंसी कॉन्फ़िगरेशन हटाए गए

एजीपी 7.0 में, ये कॉन्फ़िगरेशन (या डिपेंडेंसी के दायरे) दिए गए हैं निकाला गया:


  • compile इस्तेमाल के उदाहरण के आधार पर, इसे api से बदल दिया गया है या implementation.
    अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है यह *कंपाइल वैरिएंट पर भी लागू होता है, उदाहरण के लिए: debugCompile.

  • provided इसे compileOnly से बदल दिया गया है.
    अभी तक किसी भी व्यक्ति ने चेक इन नहीं किया है यह *उपलब्ध वैरिएंट पर भी लागू होता है. उदाहरण के लिए: releaseProvided.

  • apk इसे runtimeOnly से बदल दिया गया है.

  • publish इसे runtimeOnly से बदल दिया गया है.

ज़्यादातर मामलों में, एजीपी अपग्रेड असिस्टेंट की मदद से, आपका प्रोजेक्ट अपने-आप 'Google मैप' पर माइग्रेट हो जाएगा कॉन्फ़िगरेशन.

Android के लिए कंपाइल करते समय क्लासपाथ में बदलाव Gradle प्लग इन

अगर आप 'Android Gradle प्लग इन' के साथ कंपाइल कर रहे हैं, तो आपकी कंपाइल क्लासपाथ बदल सकता है. क्योंकि AGP अब api/implementation का इस्तेमाल करता है कॉन्फ़िगरेशन आंतरिक रूप से कॉन्फ़िगर करता है, तो कुछ आर्टफ़ैक्ट आपके संग्रह से निकाले जा सकते हैं क्लासपाथ का इस्तेमाल करें. अगर कंपाइल करते समय एजीपी की डिपेंडेंसी इस्तेमाल की जाती है, तो इसे साफ़ तौर पर डिपेंडेंसी के तौर पर जोड़ें.

Java के संसाधनों में स्थानीय लाइब्रेरी को जोड़ना फ़ोल्डर मौजूद नहीं है

पहले, आपके पास Java रिसॉर्स फ़ोल्डर में एक नेटिव लाइब्रेरी जोड़ने का विकल्प होता था और android.sourceSets.main.resources.srcDirs का इस्तेमाल करके फ़ोल्डर को रजिस्टर करें, ताकि नेटिव लाइब्रेरी को एक्सट्रैक्ट करके फ़ाइनल में जोड़ा जा सके APK के साथ काम करता है. AGP 7.0 और इसके बाद के वर्शन में, यह Java के रिसॉर्स फ़ोल्डर को अनदेखा किया जाता है. इसके बजाय, डीएसएल वाले तरीके का इस्तेमाल करें, नेटिव लाइब्रेरी, android.sourceSets.main.jniLibs.srcDirs. इसके लिए ज़्यादा जानकारी के लिए, देखें कॉन्फ़िगर करने का तरीका सोर्स सेट.

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

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

1.4.x Kotlin मल्टीप्लैटफ़ॉर्म प्लगिन के साथ काम नहीं करता

Android Gradle प्लग इन 7.0.0, इनके साथ काम करता है कोटलिन मल्टीप्लैटफ़ॉर्म प्लगिन 1.5.0 और इसके बाद के वर्शन. Kotlin का इस्तेमाल करने वाले प्रोजेक्ट Android Gradle का इस्तेमाल करने के लिए, मल्टीप्लैटफ़ॉर्म की सुविधा को Kotlin 1.5.0 में अपडेट करना होगा प्लग इन 7.0.0. समाधान के तौर पर, 'Android Gradle प्लग इन' को डाउनग्रेड किया जा सकता है 4.2.x तक करें, हालांकि इसकी सलाह नहीं दी जाती है.

ज़्यादा जानकारी के लिए, यह देखें KT-43944.

लिंट आउटपुट मौजूद नहीं है

लिंट टास्क के होने पर, stdout पर कोई लिंट टेक्स्ट आउटपुट प्रिंट नहीं होगा अप-टू-डेट (समस्या #191897708). ज़्यादा जानकारी के लिए, यह देखें लिंट के व्यवहार में बदलाव. यह समस्या को 'Android Gradle प्लग इन 7.1' में ठीक किया जाएगा.

सभी डाइनैमिक-सुविधा लाइब्रेरी डिपेंडेंसी की लिंट की जांच नहीं की जाती

किसीcheckDependencies = true ऐप मॉड्यूल, डाइनैमिक-सुविधा लाइब्रेरी डिपेंडेंसी का इस्तेमाल तब तक नहीं किया जाता, जब तक कि ये ऐप्लिकेशन डिपेंडेंसी भी होती हैं (समस्या #191977888). वर्कअराउंड के रूप में, लिंट टास्क को उन लाइब्रेरी पर चलाया जा सकता है. ज़्यादा जानकारी के लिए, लिंट के व्यवहार में बदलाव देखें.