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

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

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

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

बिल्ड कॉन्फ़िगरेशन के लिए, 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 फ़ोल्डर और किसी भी लाइब्रेरी मॉड्यूल डिपेंडेंसी में मौजूद संसाधनों का इस्तेमाल करता है. इससे यह तय किया जाता है कि 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 फ़ाइल (अगर Groovy का इस्तेमाल किया जा रहा है, तो build.gradle फ़ाइल) के androidResources {} ब्लॉक में मौजूद generateLocaleConfig सेटिंग का इस्तेमाल करें:

Kotlin

android {
  androidResources {
    generateLocaleConfig = true
  }
}

ग्रूवी

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 अपग्रेड असिस्टेंट का इस्तेमाल करें. इसके लिए, Tools > AGP Upgrade Assistant पर जाएं.

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

Kotlin

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

ग्रूवी

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 के लिए, मुख्य लाइब्रेरी के डेसुगरिंग की सुविधा चालू कर सकते हैं. इससे, तैयार किए गए एएआर पर कोई असर नहीं पड़ता. उदाहरण के लिए, लिंटिंग के ज़रिए. हम आने वाले समय में, 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.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, टेस्ट वैरिएंट के लिए मेनिफ़ेस्ट प्लेसहोल्डर के साथ काम नहीं कर रहा है
namespace प्रॉपर्टी शायद HasAndroidResources से जुड़ी है
"Gradle files have changed since last project sync" मैसेज को बंद नहीं किया जा सकता
जब Android Gradle प्लगिन का नया वर्शन उपलब्ध नहीं होता है, तब भी "हमारा सुझाव है कि 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) has a cache miss because `proguard.txt` has changed
ऐप्लिकेशन के मर्ज किए गए मेनिफ़ेस्ट में, डिपेंडेंसी से extractNativeLibs और useEmbeddedDex एट्रिब्यूट शामिल हैं
AGP: AIDL टूल और फ़्रेमवर्क AIDL फ़ाइल के पाथ को सार्वजनिक एपीआई के तौर पर दिखाएं
अनुरोध: IDE को "PermittedSubclasses requires ASM9" समस्या को ठीक करने का सुझाव देने दें
बग: "Enable KSP and use the KSP processor for this dependency instead" सिर्फ़ एक वेबसाइट पर जाता है
.gradle/.android/analytics.settings की वजह से, Gradle 8.1 में कॉन्फ़िगरेशन कैश मेमोरी काम नहीं करती
agp 8.1.0 में generateLocaleConfig, नॉन-डिटरमिनिस्टिक ऑर्डरिंग का इस्तेमाल करता है. इससे, दोबारा बनाए जा सकने वाले बिल्ड काम नहीं करते
Dexer (D8)
हाल ही के अपडेट के बाद, कोर लाइब्रेरी डिसुगरिंग की वजह से ऐप्लिकेशन क्रैश हो रहा है.
agp 8.1.0 में API 21 के साथ रिग्रेशन - F/dex2oat ( 4176): art/compiler/driver/compiler_driver.cc:1181] Check failed: !method->IsAbstract()
Lint
लिंट, सीधे तौर पर लागू किए गए इंटरफ़ेस के लिए सिर्फ़ सुरक्षित कास्ट की जांच करता है. यह इनहेरिट किए गए इंटरफ़ेस की जांच नहीं करता
लिंट, कॉल रिसीवर के लिए मान्य कास्ट की जांच नहीं करता
TypedArray#close (API 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 को बढ़ाने वाले इंटरफ़ेस को गलत तरीके से फ़्लैग करता है
सिर्फ़ बदले गए कोड को फिर से फ़ॉर्मैट करना
लिंट: ReplaceStringQuickFix के लिए, इंटेंशन प्रीव्यू में अपवाद दिखता है
Shrinker (R8)
VerifyError: Verifier rejected class when using R8 with Kotlin 1.8.20
AGP 8 पर R8, Google Fit की सेवा को बंद कर देता है
इनपुट नामों से मिलते-जुलते नामों वाली सोर्स फ़ाइल की जानकारी को सही तरीके से नहीं दिखाया गया है
ArrayIndexOutOfBoundsException की वजह से, कंपोज़ बिल्ड के दौरान R8 काम नहीं करता
Simple StringBuilder से जुड़े कोड में, रिलीज़ या debuggable=false मोड में append के लिए टेल कॉल मौजूद नहीं है
VirtualDispatchMethodArgumentPropagator.shouldActivateMethodStateGuardedByBounds() तरीके में कॉर्नर केस
dex-startup-optimization से java.lang.VerifyError मिलता है: Rejecting class
Android 12 या इसके बाद के वर्शन पर, पुष्टि करने से जुड़ी गड़बड़ी की वजह से क्रैश होना

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.2

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

Android Gradle प्लग इन 8.1.3

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

Android Gradle प्लग इन 8.1.4

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