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 एनडीके का कोई दूसरा वर्शन इंस्टॉल करें या कॉन्फ़िगर करें.
जेडीके 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-ऐल्फ़ा-2 कोड या तीन अंकों वाला UN_M.49 कोड इस्तेमाल करें.

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

        unqualifiedResLocale=en-US
        

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

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

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 के लिए, लाइब्रेरी के मुख्य कॉम्पोनेंट को अलग-अलग वर्शन में बदलने की सुविधा चालू कर सकते हैं. इससे, तैयार किए गए एएआर पर कोई असर नहीं पड़ता. उदाहरण के लिए, लिंटिंग के ज़रिए. हम आने वाले समय में, 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 Plugin
जब सबप्रोजेक्ट की क्लास को आर्टफ़ैक्ट ट्रांसफ़ॉर्म के ज़रिए पहले ही डेक्स किया जा चुका हो, तब उन पर डेक्सिंग टास्क न चलाएं

Android Gradle प्लग इन 8.1.3

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

Android Gradle प्लग इन 8.1.2

ठीक की गई समस्याएं
Android Gradle Plugin
androidResources, Android लाइब्रेरी मॉड्यूल में उपलब्ध नहीं है
[AGP 8.1.0] ./gradlew test fails with "Unable to find manifest output" if both splits.abi.isEnable and testOptions.unitTests.isIncludeAndroidResources are true
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.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 Plugin
कॉन्फ़िगरेशन कैश मेमोरी के साथ `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) 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()
लिंट
लिंट, सीधे तौर पर लागू किए गए इंटरफ़ेस के लिए सिर्फ़ सुरक्षित कास्ट की जांच करता है. यह इनहेरिट किए गए इंटरफ़ेस की जांच नहीं करता
लिंट, कॉल रिसीव करने वालों के लिए मान्य कास्ट की जांच नहीं करता
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 या इसके बाद के वर्शन पर, पुष्टि करने से जुड़ी गड़बड़ी की वजह से क्रैश होना