Android Gradle प्लग इन 8.1.0 (जुलाई 2023)

Android Gradle प्लगिन 8.1.0 एक मुख्य रिलीज़ है. इसमें कई नई सुविधाएं और सुधार शामिल हैं.

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

कम से कम वर्शन डिफ़ॉल्ट वर्शन नोट
Gradle 8.0 8.0 ज़्यादा जानने के लिए, Gradle को अपडेट करने का तरीकादेखें.
एसडीके बिल्ड टूल 33.0.1 33.0.1 एसडीके बिल्ड टूल इंस्टॉल करें या कॉन्फ़िगर करें.
एनडीके (NDK) लागू नहीं 25.1.8937393 एनडीके का कोई दूसरा वर्शन इंस्टॉल करें या कॉन्फ़िगर करें.
जेडीके 17 17 ज़्यादा जानने के लिए, जेडीके वर्शन सेट करना लेख पढ़ें.

बिल्ड कॉन्फ़िगरेशन के लिए, Kotlin DSL डिफ़ॉल्ट रूप से उपलब्ध होता है

नए प्रोजेक्ट के लिए, बिल्ड कॉन्फ़िगरेशन के लिए अब Kotlin DSL (build.gradle.kts) का इस्तेमाल डिफ़ॉल्ट रूप से किया जाता है. यह Groovy DSL (build.gradle) की तुलना में, बदलाव करने का बेहतर अनुभव देता है. इसमें सिंटैक्स हाइलाइटिंग, कोड पूरा करने की सुविधा, और डिक्लेरेशन पर नेविगेट करने की सुविधा मिलती है. ध्यान दें कि अगर AGP 8.1 और बिल्ड कॉन्फ़िगरेशन के लिए Kotlin DSL का इस्तेमाल किया जा रहा है, तो बेहतर अनुभव के लिए Gradle 8.1 का इस्तेमाल करें. ज़्यादा जानने के लिए, Kotlin DSL माइग्रेशन गाइड देखें.

हर ऐप्लिकेशन के हिसाब से भाषा की सेटिंग अपने-आप लागू होने की सुविधा

Android Studio Giraffe Canary 7 और AGP 8.1.0-alpha07 से, अपने ऐप्लिकेशन को इस तरह कॉन्फ़िगर किया जा सकता है कि वह हर ऐप्लिकेशन के लिए भाषा की सेटिंग को अपने-आप सपोर्ट करे. आपके प्रोजेक्ट के संसाधनों के आधार पर, Android Gradle प्लगिन LocaleConfig फ़ाइल जनरेट करता है. साथ ही, इसे फ़ाइनल मेनिफ़ेस्ट फ़ाइल में जोड़ता है. इसलिए, अब आपको इसे मैन्युअल तरीके से नहीं जोड़ना पड़ता. AGP, आपके ऐप्लिकेशन मॉड्यूल के res फ़ोल्डर और किसी भी लाइब्रेरी मॉड्यूल की डिपेंडेंसी में मौजूद रिसॉर्स का इस्तेमाल करता है. इससे यह तय किया जाता है कि LocaleConfig फ़ाइल में कौनसी स्थान-भाषाएं शामिल करनी हैं.

ध्यान दें कि हर ऐप्लिकेशन के लिए भाषा अपने-आप सेट होने की सुविधा, Android 13 (एपीआई लेवल 33) या उसके बाद के वर्शन पर काम करने वाले ऐप्लिकेशन के साथ काम करती है. इस सुविधा का इस्तेमाल करने के लिए, आपको compileSdkVersion को 33 या इससे ज़्यादा पर सेट करना होगा. Android के पुराने वर्शन के लिए, हर ऐप्लिकेशन की भाषा की सेटिंग कॉन्फ़िगर करने के लिए, आपको अब भी एपीआई और ऐप्लिकेशन में भाषा चुनने की सुविधा का इस्तेमाल करना होगा.

हर ऐप्लिकेशन के लिए, भाषा की सुविधा अपने-आप चालू होने की सुविधा को चालू करने के लिए, डिफ़ॉल्ट स्थान-भाषा सेट करें:

  1. ऐप्लिकेशन मॉड्यूल के res फ़ोल्डर में, resources.properties नाम की एक नई फ़ाइल बनाएं.
  2. resources.properties फ़ाइल में, unqualifiedResLocale लेबल का इस्तेमाल करके डिफ़ॉल्ट स्थान-भाषा सेट करें. लोकल के नाम बनाने के लिए, भाषा कोड को स्क्रिप्ट और क्षेत्र के वैकल्पिक कोड के साथ मिलाएं. हर कोड को डैश से अलग करें:

    • भाषा: दो या तीन अक्षरों वाले ISO 639-1 कोड का इस्तेमाल करें.
    • स्क्रिप्ट (ज़रूरी नहीं): ISO 15924 कोड का इस्तेमाल करें.
    • क्षेत्र (ज़रूरी नहीं): दो अक्षर वाला ISO 3166-1-alpha-2 कोड या तीन अंकों वाला UN_M.49 कोड इस्तेमाल करें.

    उदाहरण के लिए, अगर आपकी डिफ़ॉल्ट स्थान-भाषा अमेरिकन इंग्लिश है, तो:

        unqualifiedResLocale=en-US
        

AGP, इस डिफ़ॉल्ट भाषा और आपके तय किए गए किसी भी वैकल्पिक स्थानीय भाषा को, अपने-आप जनरेट होने वाली LocaleConfig फ़ाइल में जोड़ता है. इसके लिए, वह res फ़ोल्डर में मौजूद values-* डायरेक्ट्री का इस्तेमाल करता है.

हर ऐप्लिकेशन के लिए भाषा की अपने-आप पहचान होने की सुविधा डिफ़ॉल्ट रूप से बंद होती है. इस सुविधा को चालू करने के लिए, मॉड्यूल-लेवल की build.gradle.kts फ़ाइल के androidResources {} ब्लॉक में मौजूद generateLocaleConfig सेटिंग का इस्तेमाल करें. अगर Groovy का इस्तेमाल किया जा रहा है, तो build.gradle फ़ाइल का इस्तेमाल करें:

Kotlin

android {
  androidResources {
    generateLocaleConfig = true
  }
}

Groovy

android {
  androidResources {
    generateLocaleConfig true
  }
}

Android Lint में JVM 17 को टारगेट करने वाला बाइटकोड शामिल है

AGP 8.1.0-alpha04 और इसके बाद के वर्शन में, Android Lint में JVM 17 को टारगेट करने वाला बाइटकोड होता है. अगर आपको कस्टम लिंट चेक लिखने हैं, तो आपको JDK 17 या इसके बाद के वर्शन के साथ कंपाइल करना होगा. साथ ही, Kotlin कंपाइलर के विकल्पों में jvmTarget = '17' को सेट करना होगा.

लिंट टूल के बारे में ज़्यादा जानने के लिए, लिंट की जांच की मदद से अपने कोड को बेहतर बनाना लेख पढ़ें.

नेटिव लाइब्रेरी को कंप्रेस करने की सेटिंग को डीएसएल में ले जाया गया

AGP 8.1.0-alpha10 या इसके बाद के वर्शन में, अगर मेनिफ़ेस्ट के बजाय डीएसएल का इस्तेमाल करके नेटिव लाइब्रेरी कंप्रेस करने की सुविधा कॉन्फ़िगर नहीं की जाती है, तो आपको एक चेतावनी मिलेगी. नीचे दिए गए निर्देशों में, डीएसएल का इस्तेमाल करने के लिए कॉन्फ़िगरेशन अपडेट करने का तरीका बताया गया है. इन अपडेट को लागू करने से जुड़ी मदद पाने के लिए, AGP अपग्रेड असिस्टेंट (टूल > AGP अपग्रेड असिस्टेंट) का इस्तेमाल करें.

बिना कंप्रेस की गई नेटिव लाइब्रेरी का इस्तेमाल करने के लिए, मेनिफ़ेस्ट से android::extractNativeLibs एट्रिब्यूट हटाएं. इसके बाद, मॉड्यूल-लेवल की build.gradle.kts फ़ाइल में यह कोड जोड़ें. अगर Groovy का इस्तेमाल किया जा रहा है, तो build.gradle फ़ाइल में यह कोड जोड़ें:

Kotlin

android {
  packagingOptions {
    jniLibs {
      useLegacyPackaging = false
    }
  }
}

Groovy

android {
  packagingOptions {
    jniLibs {
      useLegacyPackaging false
    }
  }
}

एक्सपेरिमेंटल बिल्ड फ़्लैग

ये एक्सपेरिमेंट के तौर पर उपलब्ध फ़्लैग हैं. इनका इस्तेमाल, AGP 8.1 में उपलब्ध अपनी बिल्ड को कॉन्फ़िगर करने के लिए किया जा सकता है.

चिह्नित करें इसमें जोड़ा गया डिफ़ॉल्ट मान नोट
android.experimental.useDefaultDebugSigningConfigForProfileableBuildtypes AGP 8.0 false इस सुविधा को चालू करने पर, अगर कोई साइनिंग कॉन्फ़िगरेशन नहीं दिया जाता है, तो AGP, प्रोफ़ाइल बनाने या डीबग करने लायक बिल्ड को चलाने के लिए, डिफ़ॉल्ट डीबग साइनिंग कॉन्फ़िगरेशन का इस्तेमाल करता है. यह फ़्लैग डिफ़ॉल्ट रूप से बंद होता है, ताकि बिल्ड के लेखकों को खास प्रोफ़ाइलिंग साइनिंग कॉन्फ़िगरेशन के बारे में बताने के लिए बढ़ावा दिया जा सके.
android.experimental.library.desugarAndroidTest AGP 8.0 false इस फ़्लैग की मदद से, लाइब्रेरी बनाने वाले लोग टेस्ट APK के लिए, कोर लाइब्रेरी के डिसुगरिंग की सुविधा चालू कर सकते हैं. इससे, बनाई गई AAR पर कोई असर नहीं पड़ता. उदाहरण के लिए, लिंटिंग के ज़रिए. हम आने वाले समय में, Variant API में इस सुविधा को उपलब्ध कराने के लिए काम कर रहे हैं.
android.experimental.testOptions.managedDevices.customDevice AGP 8.0 false इस सेटिंग के चालू होने पर, Gradle Managed Devices की मदद से उपयोगकर्ता के तय किए गए कस्टम डिवाइस टाइप का इस्तेमाल किया जा सकता है. यह टाइप, प्लगिन के ज़रिए उपलब्ध कराया जा सकता है. अगर आपको Firebase Test Lab प्लगिन का इस्तेमाल करना है, तो इस फ़्लैग को चालू करना होगा.
android.lint.printStackTrace AGP 8.0 false अगर यह विकल्प चालू है, तो Android Lint क्रैश होने पर स्टैकट्रेस प्रिंट करता है. इस फ़्लैग में, LINT_PRINT_STACKTRACE एनवायरमेंट वैरिएबल जैसी ही सुविधाएं होती हैं.
android.experimental.testOptions.managedDevices.maxConcurrentDevices AGP 8.0 कोई नहीं इससे यह तय किया जाता है कि किसी भी समय, एक साथ ज़्यादा से ज़्यादा कितने Gradle मैनेज किए गए डिवाइस (एवीडी) चालू हो सकते हैं. अगर वैल्यू 0 या नेगेटिव है, तो डिवाइसों की ज़्यादा से ज़्यादा संख्या तय नहीं की जाती.
android.experimental.testOptions.installApkTimeout AGP 8.0 कोई नहीं किसी APK को इंस्टॉल करने के लिए, टाइम आउट की अवधि (सेकंड में). अगर वैल्यू 0 या नेगेटिव है, तो UTP इसे डिफ़ॉल्ट वैल्यू पर सेट कर देगा.

ठीक की गई समस्याएं

Android Gradle प्लगिन 8.1.4

ठीक की गई समस्याएं
Android Gradle प्लगिन
जब सबप्रोजेक्ट की क्लास को आर्टफ़ैक्ट ट्रांसफ़ॉर्म के ज़रिए पहले ही डेक्स किया जा चुका हो, तब उन पर डेक्सिंग टास्क न चलाएं

Android Gradle प्लगिन 8.1.3

ठीक की गई समस्याएं
Android Gradle प्लगिन
[AGP 8.1.0] splits.abi.isEnable और testOptions.unitTests.isIncludeAndroidResources, दोनों के सही होने पर ./gradlew test में "Unable to find manifest output" गड़बड़ी होती है
AGP 8.1 पर अपडेट करने के बाद, बिल्ड नहीं हो सका

Android Gradle प्लगिन 8.1.2

ठीक की गई समस्याएं
Android Gradle प्लगिन
androidResources, Android लाइब्रेरी मॉड्यूल में उपलब्ध नहीं है
[AGP 8.1.0] splits.abi.isEnable और testOptions.unitTests.isIncludeAndroidResources, दोनों के सही होने पर ./gradlew test में "Unable to find manifest output" गड़बड़ी होती है
Shrinker (R8)
Kotlin 1.9 में, अगर नलचेक हटा दिए जाते हैं, तो R8 की वजह से Kotlin लैम्डा डिस्ट्रॉय हो जाते हैं
R8 में गड़बड़ी हुई है. गड़बड़ी का मैसेज यह है: "संकलन के दौरान, play-services-measurement-21.3.0-runtime.jar के लिए, तय नहीं की गई वैल्यू मिली"

Android Gradle प्लगिन 8.1.1

ठीक की गई समस्याएं
Dexer (D8)
Java 16 रिकॉर्ड: equals(null) से NullPointerException मिलता है
Shrinker (R8)
java.lang.VerifyError: Verifier rejected class
Apache POI लाइब्रेरी का इस्तेमाल करते समय, बिल्ड :minifyReleaseWithR8 पर अटक जाता है
r8 ऑप्टिमाइज़ेशन चालू होने पर, इनवोकेशन को अस्वीकार करना
java.lang.reflect.Executable के लिए NoClassDefFoundError

Android Gradle प्लगिन 8.1.0

ठीक की गई समस्याएं
Android Gradle प्लगिन
कॉन्फ़िगरेशन कैश मेमोरी के साथ `com.android.build.gradle.tasks.ShaderCompile` से जुड़ी समस्याएं
AGP API का इस्तेमाल करके Java संसाधनों में जोड़ने से कॉन्फ़िगरेशन कैश टूट जाता है
[Android Studio : Flamingo | 2022.2.1 Canary 8] liblog.so को APK में पैकेज किया गया है
कॉन्फ़िगरेशन के दौरान KGP, मेनिफ़ेस्ट को पढ़ता है. इससे मेनिफ़ेस्ट में बदलाव होने पर, कॉन्फ़िगरेशन कैश अमान्य हो जाता है
मर्ज किए गए मेनिफ़ेस्ट में समस्या होने पर, बिल्ड की चेतावनी वाला मैसेज समझ में नहीं आता
AGP 7.4 पर अपग्रेड करने से StackOverflowError होता है
डाइनैमिक फ़ीचर में ClassNotFoundException, जो सीधे तौर पर Kotlin लाइब्रेरी के सबप्रोजेक्ट पर निर्भर करता है
processDebugUnitTestManifest, टेस्ट वैरिएंट के लिए मेनिफ़ेस्ट प्लेसहोल्डर के साथ काम नहीं कर रहा है
processDebugUnitTestManifest, टेस्ट वैरिएंट के लिए मेनिफ़ेस्ट प्लेसहोल्डर के साथ काम नहीं कर रहा है
नेमस्पेस प्रॉपर्टी शायद HasAndroidResources से जुड़ी है
"Gradle files have changed since last project sync" मैसेज को बंद नहीं किया जा सकता
"हमारा सुझाव है कि Android Gradle प्लगिन के नए वर्शन का इस्तेमाल करें" मैसेज तब दिखता है, जब कोई नया वर्शन उपलब्ध नहीं होता
processDebugUnitTestManifest, टेस्ट वैरिएंट के लिए मेनिफ़ेस्ट प्लेसहोल्डर के साथ काम नहीं कर रहा है
CheckAarMetadataTask में कंपाइल एसडीके की जांच को बंद करने के लिए बूलियन फ़्लैग
बिल्ड की गड़बड़ी से मतलब एपीआई लेवल 34 से है, जो मौजूद नहीं है
JVM टूलचेन सेट करने से, JavaCompile targetCompatibility वैल्यू पर कोई असर नहीं पड़ता
वाइल्डकार्ड डोमेन वाली नेविगेशन डीपलिंक एंट्री के लिए, मर्ज किए गए मेनिफ़ेस्ट में `android:host` एट्रिब्यूट मौजूद नहीं है
Android Gradle प्लगिन 8.1 के बाद से, processDebugMainManifest टास्क पूरा नहीं हो सका
क्या हम AnalyticsRecordingTask को हटा सकते हैं?
output-metadata.json का कॉन्टेंट एक जैसा नहीं है
क्या हम AnalyticsRecordingTask को हटा सकते हैं?
output-metadata.json का कॉन्टेंट एक जैसा नहीं है
JVM टूलचेन सेट करने से, JavaCompile targetCompatibility वैल्यू पर कोई असर नहीं पड़ता
वाइल्डकार्ड डोमेन वाली नेविगेशन डीपलिंक एंट्री के लिए, मर्ज किए गए मेनिफ़ेस्ट में `android:host` एट्रिब्यूट मौजूद नहीं है
Android Gradle प्लगिन 8.1 के बाद से, processDebugMainManifest टास्क पूरा नहीं हो सका
Android Studio, STUDIO_GRADLE_JDK एनवायरमेंट वैरिएबल का इस्तेमाल नहीं करता
कस्टम सोर्स टाइप को कई फ़्लेवर वाले सोर्ससेट बनाने चाहिए
DependenciesInfoBuilder को एपीआई अपडेट और दस्तावेज़ की ज़रूरत है
नेस्ट मेंबर मौजूद न होने की वजह से, Java 11 को टारगेट करने वाला DexingNoClasspathTransform (minSdk >= 24) फ़ेल हो जाता है
Groovy में DslExtension.Builder.extendProjectWith() बताए गए तरीके से काम नहीं कर रहा है
VariantSelector.withFlavor API जोड़ें, जो kotlin.Pair का इस्तेमाल नहीं करता
AndroidLintAnalysisTask (:lintAnalyzeExternalRelease) की कैश मेमोरी में मौजूद डेटा नहीं मिला, क्योंकि `proguard.txt` बदल गया है
ऐप्लिकेशन के मर्ज किए गए मेनिफ़ेस्ट में, डिपेंडेंसी से extractNativeLibs और useEmbeddedDex एट्रिब्यूट शामिल हैं
AGP: AIDL टूल और फ़्रेमवर्क AIDL फ़ाइल के पाथ को सार्वजनिक एपीआई के तौर पर दिखाएं
अनुरोध: IDE को "PermittedSubclasses requires ASM9" के लिए सुधार का सुझाव देने दें
बग: "केएसपी चालू करें और इस डिपेंडेंसी के लिए केएसपी प्रोसेसर का इस्तेमाल करें" सिर्फ़ एक वेबसाइट पर जाता है
.gradle/.android/analytics.settings की वजह से, Gradle 8.1 में कॉन्फ़िगरेशन कैश मेमोरी काम नहीं करती
agp 8.1.0 में generateLocaleConfig, नॉन-डिटरमिनिस्टिक ऑर्डरिंग का इस्तेमाल करता है. इससे, दोबारा बनाए जा सकने वाले बिल्ड नहीं बन पाते
Dexer (D8)
हाल ही के अपडेट के बाद, कोर लाइब्रेरी डिसुगरिंग की वजह से ऐप्लिकेशन क्रैश हो रहा है.
agp 8.1.0 में एपीआई 21 के साथ रिग्रेशन - F/dex2oat ( 4176): art/compiler/driver/compiler_driver.cc:1181] Check failed: !method->IsAbstract()
लिंट
लिंट, सीधे तौर पर लागू किए गए इंटरफ़ेस के लिए सिर्फ़ सुरक्षित कास्ट की जांच करता है. यह इनहेरिट किए गए इंटरफ़ेस की जांच नहीं करता
लिंट, कॉल रिसीव करने वालों के लिए मान्य कास्ट की जांच नहीं करता
TypedArray#close (एपीआई 31) को डीसुगर नहीं किया गया है, लेकिन try-with-resources में इस्तेमाल किए जाने पर AS चेतावनी नहीं दिखाता है
बग: "The 'BC' provider is deprecated and as of Android P..." की गलत चेतावनी
Kotlin को 1.8.0 पर अपग्रेड करने के बाद, remember के बारे में Lint का गलत पॉज़िटिव नतीजा
एनम पैरामीटर वाले किसी तरीके के अंदर SDK_INT की जांच करने पर, Lint की गलत चेतावनी मिली
TypographyQuotes लिंट चेक, एस्केप किए गए कोटेशन पर काम नहीं करता
TrustAllX509TrustManager लिंट चेक, X509TrustManager को बढ़ाने वाले इंटरफ़ेस को गलत तरीके से फ़्लैग करता है
सिर्फ़ बदले गए कोड को फिर से फ़ॉर्मैट करना
Lint: ReplaceStringQuickFix के लिए, इंटेंशन प्रीव्यू में अपवाद दिखता है
Shrinker (R8)
VerifyError: Verifier rejected class when using R8 with Kotlin 1.8.20
AGP 8 पर R8, Google Fit की सेवा को बंद कर देता है
इनपुट नामों से मिलते-जुलते नामों वाली सोर्स फ़ाइल की जानकारी को सही तरीके से नहीं दिखाया गया है
Compose बिल्ड के दौरान R8 में ArrayIndexOutOfBoundsException की गड़बड़ी हुई
Simple StringBuilder से जुड़े कोड में, रिलीज़ या debuggable=false मोड में append के लिए टेल कॉल मौजूद नहीं है
VirtualDispatchMethodArgumentPropagator.shouldActivateMethodStateGuardedByBounds() तरीके में कॉर्नर केस
dex-startup-optimization results in java.lang.VerifyError: Rejecting class
Android 12 और इसके बाद के वर्शन पर, पुष्टि करने से जुड़ी गड़बड़ी की वजह से क्रैश होना