Java 8 ল্যাঙ্গুয়েজ ফিচার ও API ব্যবহার করুন

Android Gradle প্লাগ-ইন 3.0.0 এবং পরবর্তী ভার্সন সব Java 7 ল্যাঙ্গুয়েজ ফিচার এবং Java 8 ল্যাঙ্গুয়েজ ফিচারের সাবসেট সাপোর্ট করে যা প্ল্যাটফর্ম ভার্সন অনুযায়ী আলাদা হয়। Android Gradle প্লাগ-ইন 4.0.0 এবং তার পরবর্তী ভার্সন ব্যবহার করে আপনার অ্যাপ তৈরি করার সময়, আপনার অ্যাপের জন্য ন্যূনতম API লেভেলের প্রয়োজন ছাড়াই আপনি কিছু Java 8 ল্যাঙ্গুয়েজ API ব্যবহার করতে পারবেন।

এই পৃষ্ঠায় Java 8 ল্যাঙ্গুয়েজ ফিচারের বিবরণ দেওয়া হয়েছে, যা আপনি ব্যবহার করতে পারবেন। কীভাবে আপনার প্রোজেক্ট সঠিকভাবে কনফিগার করবেন এবং কোনও পরিচিত সমস্যা থাকলে তা কীভাবে সমাধান করবেন, তা এখানে উল্লেখ করা হয়েছে। Java 8 ল্যাঙ্গুয়েজ ফিচারের ওভারভিউ পেতে নিম্নলিখিত ভিডিওটি দেখুন।

Android Gradle প্লাগ-ইন নির্দিষ্ট Java 8 ভাষা ফিচার এবং সেগুলি ব্যবহার করে এমন থার্ড-পার্টি লাইব্রেরি ব্যবহার করার জন্য বিল্ট-ইন সহায়তা প্রদান করে। ডিফল্ট টুলচেন বাইটকোড ট্রান্সফর্মেশন, যাকে desugar বলা হয়, পারফর্ম করার মাধ্যমে নতুন ল্যাঙ্গুয়েজ ফিচার প্রয়োগ করে, যা ক্লাস ফাইলকে DEX কোডে D8/R8 কম্পাইলেশনের অংশ হিসেবে কাজ করে, যেমনটি চিত্র ১-এ দেখানো হয়েছে।

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

গ্ৰুভি

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 ল্যাঙ্গুয়েজ ফিচারকে সাপোর্ট করে না। যেকোনও API লেভেলে নিম্নলিখিত ভাষা ফিচার উপলভ্য:

Java 8 ল্যাঙ্গুয়েজ ফিচার নোট
ল্যাম্বডা এক্সপ্রেশন Android-এ ল্যাম্বডা এক্সপ্রেশনের সিরিয়ালাইজেশন কাজ করে না।
পদ্ধতির রেফারেন্স  
অ্যানোটেশন টাইপ করুন টাইপ অ্যানোটেশন সংক্রান্ত তথ্য শুধুমাত্র কম্পাইল টাইমে উপলভ্য, রানটাইমে নয়। API লেভেল ২৪ এবং তার নিচের ভার্সনে প্ল্যাটফর্মটি TYPE সাপোর্ট করে, কিন্তু ElementType.TYPE_USE বা ElementType.TYPE_PARAMETER নয়।
ডিফল্ট ও স্ট্যাটিক ইন্টারফেস পদ্ধতি  
অ্যানোটেশন রিপিট করা  

Java 8 ল্যাঙ্গুয়েজ ফিচারের পাশাপাশি, Android Gradle প্লাগ-ইন ভার্সন 3.0.0 এবং তার পরবর্তী ভার্সনগুলি সমস্ত Android API লেভেলে 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 রিলিজে ব্যবহারের জন্য কোনও অতিরিক্ত ক্লাস ও API (যেমন java.util.stream.*) উপলভ্য করে না। আংশিক Java API ডিসুগারিংয়ের জন্য সহায়তা Android Gradle প্লাগ-ইন 4.0.0 বা তার পরবর্তী ভার্সন থেকে উপলভ্য, যেমনটি নিম্নলিখিত বিভাগে বর্ণনা করা হয়েছে।

Java 8+ API ডিসুগারিং সংক্রান্ত সহায়তা (Android Gradle প্লাগ-ইন 4.0.0+)

আপনি যদি Android Gradle প্লাগ-ইন 4.0.0 বা তার পরবর্তী ভার্সন ব্যবহার করে আপনার অ্যাপ তৈরি করেন, তাহলে প্লাগ-ইনটি আপনার অ্যাপের জন্য ন্যূনতম API লেভেলের প্রয়োজন ছাড়াই বেশ কয়েকটি Java 8 ল্যাঙ্গুয়েজ API ব্যবহার করার জন্য সহায়তা প্রদান করে। Android Gradle প্লাগ-ইন 7.4.0 বা তার পরবর্তী ভার্সনের সাথে, বেশ কয়েকটি Java 11 ল্যাঙ্গুয়েজ API-ও ডিসুগার করা লাইব্রেরি 2.0.0 বা তার পরবর্তী ভার্সনের সাথে উপলভ্য।

পুরনো প্ল্যাটফর্ম ভার্সনের জন্য এই অতিরিক্ত সহায়তা সম্ভব কারণ প্লাগ-ইন 4.0.0 এবং তার পরবর্তী ভার্সন ডিসুগারিং ইঞ্জিনকে আরও প্রসারিত করে যাতে জাভা ল্যাঙ্গুয়েজ API-কেও ডিসুগার করা যায়। আপনি স্ট্যান্ডার্ড ল্যাঙ্গুয়েজ API অন্তর্ভুক্ত করতে পারেন যা শুধুমাত্র সাম্প্রতিক Android রিলিজে (যেমন java.util.streams) উপলভ্য ছিল, এমন অ্যাপে যা Android-এর পুরনো ভার্সনে কাজ করে।

Android Gradle প্লাগ-ইন 4.0.0 বা তার পরবর্তী যেকোনও ভার্সন ব্যবহার করে আপনার অ্যাপ তৈরি করার সময় নিম্নলিখিত API-এর সেট কাজ করে:

  • সিকোয়েন্সিয়াল স্ট্রিম (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 API কাজ করে, যেমন java.nio.file প্যাকেজের সাবসেট।

কাজ করে এমন API-এর সম্পূর্ণ তালিকা দেখতে, ডিসুগারিংয়ের মাধ্যমে উপলভ্য Java 8+ API এবং ডিসুগারিংয়ের মাধ্যমে উপলভ্য Java 11+ API দেখুন।

এইসব ল্যাঙ্গুয়েজ API-কে সাপোর্ট করতে, প্লাগ-ইন একটি আলাদা DEX ফাইল কম্পাইল করে যেটিতে অনুপস্থিত API-এর প্রয়োগ থাকে এবং এটি আপনার অ্যাপে অন্তর্ভুক্ত করে। ডিসুগারিং প্রসেস আপনার অ্যাপের কোড আবার লেখে যাতে রানটাইমে এই লাইব্রেরি ব্যবহার করা যায়। আলাদা DEX ফাইলে কম্পাইল করা সোর্স কোড desugar_jdk_libs GitHub রিপোজিটরিতে উপলভ্য।

Android প্ল্যাটফর্মের যেকোনও ভার্সনে এইসব ভাষার API-এর জন্য সহায়তা চালু করতে:

  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 ফাইলে যোগ করতে হতে পারে, যদি:

  • লাইব্রেরি মডিউলের ইন্সট্রুমেন্টেড টেস্ট এই ল্যাঙ্গুয়েজ API ব্যবহার করে (সরাসরি বা লাইব্রেরি মডিউল বা এর ডিপেন্ডেন্সির মাধ্যমে)। এটি করা হয় যাতে আপনার ইনস্ট্রুমেন্টেড টেস্ট APK-এর জন্য অনুপস্থিত API প্রদান করা যায়।

  • আপনি লাইব্রেরি মডিউলে আলাদাভাবে লিন্ট চালাতে চান। এটি লিন্টকে ভাষা API-এর সঠিক ব্যবহার শনাক্ত করতে এবং মিথ্যা সতর্কতা রিপোর্ট করা এড়াতে সাহায্য করে।

এছাড়াও মনে রাখবেন যে API ডিসুগারিং সঙ্কুচিত করার সাথে একত্রিত করা যেতে পারে, তবে শুধুমাত্র R8 সঙ্কুচিতকারী ব্যবহার করার সময়।

বিভিন্ন ভার্সন

নিচের সারণীতে Java 8+ API লাইব্রেরির ভার্সন এবং প্রতিটি ভার্সন কাজ করে এমন Android Gradle প্লাগ-ইনের ন্যূনতম ভার্সন দেখানো হয়েছে:

ভার্সন Android Gradle প্লাগ-ইনের ন্যূনতম ভার্সন
1.1.9 4.0.0
১.২.৩ 7.3.0
২.০.৩ 7.4.0-alpha10

Java 8+ API লাইব্রেরির ভার্সন সম্পর্কে বিস্তারিত জানতে, desugar_jdk_libs GitHub রিপোজিটরিতে CHANGELOG.md ফাইল দেখুন।