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

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

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

Java 8+ API के लिए डिशुगरिंग की सुविधा (Android Gradle प्लगिन 4.0.0+)

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

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

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

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

वर्शन

यहां दी गई टेबल में, Java 8+ एपीआई लाइब्रेरी के वर्शन और Android Gradle प्लगिन के कम से कम वर्शन की जानकारी दी गई है. साथ ही, यह भी बताया गया है कि Android Gradle प्लगिन का कौनसा वर्शन, Java 8+ एपीआई लाइब्रेरी के किस वर्शन के साथ काम करता है:

वर्शन 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 फ़ाइल देखें.