Java 8 भाषा सुविधाओं और API का उपयोग करें

'Android Gradle प्लग इन 3.0.0' और इसके बाद के वर्शन, Java 7 की सभी भाषाओं की सुविधाओं के साथ काम करते हैं और Java 8 भाषा सुविधाओं का एक सबसेट शामिल है, जो प्लैटफ़ॉर्म वर्शन के अनुसार अलग-अलग होती है. टास्क कब शुरू होगा Android Gradle प्लग इन 4.0.0 और इसके बाद के वर्शन का इस्तेमाल करके अपना ऐप्लिकेशन बनाना, कुछ Java 8 लैंग्वेज एपीआई हैं, जिन्हें आपके एपीआई लेवल के लिए कम से कम एपीआई लेवल की ज़रूरत नहीं होती है.

यह पृष्ठ Java 8 भाषा सुविधाओं का वर्णन करता है, जिनका आप ठीक से उपयोग कर सकते हैं अपने प्रोजेक्ट को कॉन्फ़िगर करें, ताकि उन्हें इस्तेमाल करने में कोई समस्या न आए. Java 8 भाषा सुविधाओं के ओवरव्यू के लिए निम्न वीडियो देखें.

'Android Gradle प्लग इन' कुछ Java 8 वर्शन का इस्तेमाल करने के लिए बिल्ट-इन सहायता देता है और उनका इस्तेमाल करने वाली तीसरे पक्ष की लाइब्रेरी शामिल कर सकें. डिफ़ॉल्ट टूलचेन भाषा की नई सुविधाओं को लागू करने के लिए D8/R8 कंपाइलेशन के हिस्से के तौर पर, बाइटकोड ट्रांसफ़ॉर्मेशन को desugar कहते हैं क्लास फ़ाइलों को DEX कोड में बदलना चाहिए, जैसा कि पहली इमेज में दिखाया गया है.

Java 8 लैंग्वेज फ़ीचर, `desugar` बाइटकोड का इस्तेमाल करके काम करता है
    बदलाव
पहली इमेज. desugar का उपयोग करने वाली Java 8 भाषा सुविधा बाइटकोड ट्रांसफ़ॉर्मेशन.

Java 8 भाषा सुविधा (Android Gradle प्लग इन 3.0.0+)

काम करने वाली Java 8 भाषा सुविधाओं का इस्तेमाल शुरू करने के लिए:

  1. Android Gradle प्लग इन अपडेट करना 3.0.0 या उससे ज़्यादा होना चाहिए.
  2. Java 8 का इस्तेमाल करने वाले हर मॉड्यूल के लिए भाषा संबंधी सुविधाएं (उसके सोर्स कोड में या डिपेंडेंसी के ज़रिए), मॉड्यूल की build.gradle या build.gradle.kts फ़ाइल को अपडेट करें, जैसा कि नीचे दिखाया गया है:

Kotlin

android {
    ...
    // Configure only for each module that uses Java 8
    // language features (either in its source code or
    // through dependencies).
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
    // For Kotlin projects
    kotlinOptions {
        jvmTarget = "1.8"
    }
}

ग्रूवी

android {
    ...
    // Configure only for each module that uses Java 8
    // language features (either in its source code or
    // through dependencies).
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    // For Kotlin projects
    kotlinOptions {
        jvmTarget = "1.8"
    }
}

'Android Gradle प्लग इन 3.0.0' और इसके बाद के वर्शन का इस्तेमाल करके अपना ऐप्लिकेशन बनाते समय, प्लगिन सभी Java 8 भाषा सुविधाओं का समर्थन नहीं करता है. इस भाषा में सुविधाएं किसी भी एपीआई लेवल पर उपलब्ध हैं:

Java 8 भाषा सुविधा नोट
लैम्बडा एक्सप्रेशन Android के क्रम से लगाने की सुविधा काम नहीं करती है लैम्डा एक्सप्रेशन.
तरीके  
एनोटेशन टाइप करना टाइप एनोटेशन की जानकारी, सिर्फ़ कंपाइल करने के समय उपलब्ध होती है, रनटाइम पर नहीं होता है. यह प्लैटफ़ॉर्म, TYPE एपीआई लेवल 24 और उससे पहले के लेवल में है, लेकिन ElementType.TYPE_USE या ElementType.TYPE_PARAMETER.
डिफ़ॉल्ट और स्टैटिक इंटरफ़ेस के तरीके  
एनोटेशन दोहराना  

Java 8 भाषा की इन सुविधाओं के अलावा, Android Gradle प्लग इन वर्शन 3.0.0 और उसके बाद के वर्शन Android के सभी एपीआई लेवल के लिए, try संसाधन के साथ.

Desugar इस्तेमाल नहीं किया जा सकता MethodHandle.invoke या MethodHandle.invokeExact. अगर आपका सोर्स कोड या आपके कोई मॉड्यूल डिपेंडेंसी, इनमें से किसी एक तरीके का इस्तेमाल करती है, तो आपको minSdkVersion 26 या उससे बाद के वर्शन को तय करना होगा. ऐसा न करने पर, आपको निम्न गड़बड़ी:

Dex: Error converting bytecode to dex:
Cause: signature-polymorphic method called without --min-sdk-version >= 26

कुछ मामलों में, हो सकता है कि आपका मॉड्यूल invoke या invokeExact का इस्तेमाल न कर रहा हो तरीकों का इस्तेमाल करना होगा, चाहे वे किसी लाइब्रेरी डिपेंडेंसी में शामिल हों. इस्तेमाल जारी रखने के लिए minSdkVersion 25 या इससे पहले के वर्शन वाली लाइब्रेरी में से, हटाने के लिए, कोड छोटा करने की सुविधा चालू करें इस्तेमाल नहीं हुआ है. अगर यह काम नहीं करता है, तो किसी ऐसी वैकल्पिक लाइब्रेरी का इस्तेमाल करें जो काम न करने वाले तरीकों का इस्तेमाल नहीं करता है.

Android Gradle पर Java 8 और इसके बाद के वर्शन वाली भाषा की सुविधाएं प्लगिन 3.0.0 और उसके बाद के वर्शन का इस्तेमाल करता है. साथ ही, यह कोई अतिरिक्त क्लास और एपीआई नहीं बनाता है (जैसे कि java.util.stream.*), Android के पुराने वर्शन पर इस्तेमाल के लिए उपलब्ध है. Android Gradle से, आंशिक Java API (एपीआई) डी-यूगरिंग के लिए सहायता उपलब्ध है प्लगिन 4.0.0 या उसके बाद वाले वर्शन का इस्तेमाल करना चाहिए, जैसा कि नीचे बताया गया है.

Java 8+ एपीआई डिज़ाइन करने की सुविधा (Android Gradle प्लग इन 4.0.0 और इसके बाद वाले वर्शन)

अगर 'Android Gradle प्लग इन 4.0.0' या इसके बाद वाले वर्शन का इस्तेमाल करके अपना ऐप्लिकेशन बनाया जा रहा है, तो प्लगिन, बिना किसी रुकावट के Java 8 लैंग्वेज API का इस्तेमाल करने में मदद करता है आपके ऐप्लिकेशन के लिए कम से कम एपीआई लेवल ज़रूरी हो. 'Android Gradle प्लग इन 7.4.0' या इसके बाद, कई Java 11 लैंग्वेज एपीआई भी उपलब्ध हैं, जो पुराने वर्शन के साथ काम करते हैं लाइब्रेरी 2.0.0 या इसके बाद का वर्शन होना चाहिए.

पुराने प्लैटफ़ॉर्म वर्शन के लिए यह अतिरिक्त सहायता, प्लगिन की वजह से मिल पाती है 4.0.0 और उसके बाद के वर्शन, डिसुगरिंग इंजन को Java की खराब लैंग्वेज के साथ भी उपलब्ध कराते हैं एपीआई. आपके पास उन स्टैंडर्ड लैंग्वेज एपीआई को शामिल करने का विकल्प होता है जो सिर्फ़ पुराने वर्शन के साथ काम करने वाले ऐप्लिकेशन में हाल ही की Android रिलीज़ (जैसे कि java.util.streams) Android के वर्शन हैं.

Android का इस्तेमाल करके ऐप्लिकेशन बनाते समय, इन एपीआई का इस्तेमाल किया जा सकता है Gradle प्लग इन 4.0.0 या इसके बाद वाला वर्शन:

  • क्रम से लगाई जाने वाली स्ट्रीम (java.util.stream)
  • java.time का एक सबसेट
  • java.util.function
  • java.util.{Map,Collection,Comparator} में हाल ही में जोड़े गए
  • ज़रूरी नहीं (java.util.Optional, java.util.OptionalInt, और java.util.OptionalDouble) और कुछ नई क्लास
  • java.util.concurrent.atomic में कुछ जानकारी जोड़ी गई है (ये नए तरीके इस्तेमाल किए जा रहे हैं AtomicInteger, AtomicLong, और AtomicReference)
  • ConcurrentHashMap (Android 5.0 के लिए गड़बड़ी को ठीक किया गया)

'Android Gradle प्लग इन 7.4.0 या इसके बाद के वर्शन' के साथ, अतिरिक्त Java 11 एपीआई जैसे, java.nio.file पैकेज का सबसेट.

इस्तेमाल किए जा सकने वाले एपीआई की पूरी सूची देखने के लिए, यहां जाएं Java 8 के बाद के वर्शन वाले एपीआई को डीयूगरिंग सिस्टम के ज़रिए इस्तेमाल किया जा सकता है और Java 11 के बाद के वर्शन वाले एपीआई को डीयूगरिंग सिस्टम के ज़रिए इस्तेमाल किया जा सकता है.

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

Android के किसी भी वर्शन पर इन लैंग्वेज एपीआई का इस्तेमाल करने के लिए प्लैटफ़ॉर्म:

  1. Android Gradle प्लग इन अपडेट करना 4.0.0 (या उससे ज़्यादा) तक.
  2. अपने ऐप्लिकेशन मॉड्यूल में, यहां दी गई जानकारी को शामिल करें build.gradle या build.gradle.kts फ़ाइल:

Kotlin

android {
    defaultConfig {
        // Required when setting minSdkVersion to 20 or lower
        multiDexEnabled = true
    }

    compileOptions {
        // Flag to enable support for the new language APIs

        // For AGP 4.1+
        isCoreLibraryDesugaringEnabled = true
        // For AGP 4.0
        // coreLibraryDesugaringEnabled = true

        // Sets Java compatibility to Java 8
        sourceCompatibility = JavaVersion.VERSION_1_8
        targetCompatibility = JavaVersion.VERSION_1_8
    }
}

dependencies {
    // For AGP 7.4+
    coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.0.3")
    // For AGP 7.3
    // coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.2.3")
    // For AGP 4.0 to 7.2
    // coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.1.9")
}

ग्रूवी

android {
    defaultConfig {
        // Required when setting minSdkVersion to 20 or lower
        multiDexEnabled true
    }

    compileOptions {
        // Flag to enable support for the new language APIs
        coreLibraryDesugaringEnabled true
        // Sets Java compatibility to Java 8
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
    // For AGP 7.4+
    coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.3'
    // For AGP 7.3
    // coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.2.3'
    // For AGP 4.0 to 7.2
    // coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.1.9'
}

ध्यान दें कि आपको लाइब्रेरी में पिछले कोड स्निपेट को भी शामिल करना पड़ सकता है मॉड्यूल की build.gradle या build.gradle.kts फ़ाइल में, अगर:

  • लाइब्रेरी मॉड्यूल के इंस्ट्रुमेंट वाले टेस्ट इन लैंग्वेज एपीआई का इस्तेमाल करते हैं (या तो सीधे लाइब्रेरी मॉड्यूल या इसकी डिपेंडेंसी के ज़रिए). ऐसा इसलिए कि गायब एपीआई आपके इंस्ट्रुमेंट्ड टेस्ट APK के लिए दिए जाते हैं.

  • आपको लाइब्रेरी मॉड्यूल पर, लिंट को अलग से चलाना है. यह मदद के लिए है लिंट, भाषा एपीआई के सही इस्तेमाल की पहचान करता है और गलत जानकारी की रिपोर्टिंग से बचाता है चेतावनियां.

यह भी ध्यान रखें कि एपीआई डिसुगरिंग को श्रिंकिंग के साथ जोड़ा जा सकता है, लेकिन सिर्फ़ जब R8 श्रिंकर का इस्तेमाल किया जा रहा हो.

वर्शन

नीचे दी गई टेबल में, Java 8+ एपीआई लाइब्रेरी के वर्शन और हर वर्शन के साथ काम करने वाला कम से कम Android Gradle प्लग इन वर्शन:

वर्शन Android Gradle प्लग इन का कम से कम वर्शन
1.1.9 4.0.0
1.2.3 7.3.0
2.0.3 7.4.0-ऐल्फ़ा10

Java 8+ API लाइब्रेरी के वर्शन के बारे में जानकारी के लिए, CHANGELOG.md फ़ाइल desugar_jdk_libs GitHub रिपॉज़िटरी में.