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

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

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

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

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"
    }
}

Groovy

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 पर, लैम्ब्डा एक्सप्रेशन को सीरियलाइज़ नहीं किया जा सकता.
तरीके के रेफ़रंस  
टाइप एनोटेशन टाइप एनोटेशन की जानकारी सिर्फ़ कंपाइल के समय उपलब्ध होती है, रनटाइम के समय नहीं. यह प्लैटफ़ॉर्म, एपीआई लेवल 24 और उससे पहले के वर्शन में TYPE के साथ काम करता है. हालांकि, यह ElementType.TYPE_USE या ElementType.TYPE_PARAMETER के साथ काम नहीं करता.
डिफ़ॉल्ट और स्टैटिक इंटरफ़ेस के तरीके  
एनोटेशन दोहराना  

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

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

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

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

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

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

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

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")
}

Groovy

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 के लिए, मौजूद न होने वाले एपीआई उपलब्ध कराए जा सकें.

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

यह भी ध्यान रखें कि एपीआई को डी-सुगर करने की प्रोसेस को छोटा करने की प्रोसेस के साथ जोड़ा जा सकता है. हालांकि, ऐसा सिर्फ़ 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-alpha10

Java 8 और उसके बाद के वर्शन वाली एपीआई लाइब्रेरी के बारे में ज़्यादा जानने के लिए, desugar_jdk_libs GitHub डेटा स्टोर करने की जगह में CHANGELOG.md फ़ाइल देखें.