Java 8 ভাষা বৈশিষ্ট্য এবং API ব্যবহার করুন

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

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

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

জাভা 8 ভাষা বৈশিষ্ট্য সমর্থন `desugar` বাইটকোড রূপান্তর ব্যবহার করে
চিত্র 1. জাভা 8 ভাষা বৈশিষ্ট্য সমর্থন desugar বাইটকোড রূপান্তর ব্যবহার করে।

জাভা 8 ভাষা বৈশিষ্ট্য সমর্থন (অ্যান্ড্রয়েড গ্রেডল প্লাগইন 3.0.0+)

সমর্থিত জাভা 8 ভাষা বৈশিষ্ট্য ব্যবহার শুরু করতে:

  1. Android Gradle প্লাগইনটি 3.0.0 বা উচ্চতর সংস্করণে আপডেট করুন
  2. জাভা 8 ভাষার বৈশিষ্ট্য ব্যবহার করে এমন প্রতিটি মডিউলের জন্য (হয় তার সোর্স কোডে বা নির্ভরতার মাধ্যমে), মডিউলের build.gradle বা build.gradle.kts ফাইলটি নীচে দেখানো হিসাবে আপডেট করুন:

কোটলিন

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

অ্যান্ড্রয়েড গ্রেডল প্লাগইন 3.0.0 এবং উচ্চতর ব্যবহার করে আপনার অ্যাপ তৈরি করার সময়, প্লাগইনটি জাভা 8 ভাষার সমস্ত বৈশিষ্ট্য সমর্থন করে না। নিম্নলিখিত ভাষার বৈশিষ্ট্যগুলি যে কোনও API স্তরে উপলব্ধ:

জাভা 8 ভাষার বৈশিষ্ট্য মন্তব্য
ল্যাম্বডা এক্সপ্রেশন অ্যান্ড্রয়েড ল্যাম্বডা এক্সপ্রেশনের সিরিয়ালাইজেশন সমর্থন করে না।
পদ্ধতির উল্লেখ
টীকা টাইপ করুন টাইপ টীকা তথ্য শুধুমাত্র কম্পাইল সময়ে পাওয়া যায়, রানটাইমে নয়। প্ল্যাটফর্মটি API স্তর 24 এবং তার নীচে TYPE সমর্থন করে, কিন্তু ElementType.TYPE_USE বা ElementType.TYPE_PARAMETER নয়।
ডিফল্ট এবং স্ট্যাটিক ইন্টারফেস পদ্ধতি
পুনরাবৃত্তি করা টীকা

এই জাভা 8 ভাষার বৈশিষ্ট্যগুলি ছাড়াও, অ্যান্ড্রয়েড গ্রেডল প্লাগইন সংস্করণ 3.0.0 এবং উচ্চতর সমস্ত অ্যান্ড্রয়েড এপিআই স্তরে সম্পদের সাথে 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 বা তার নিচের লাইব্রেরি ব্যবহার করা চালিয়ে যেতে, অব্যবহৃত পদ্ধতিগুলি সরাতে কোড সঙ্কুচিত করা সক্ষম করুন । যদি এটি কাজ না করে, একটি বিকল্প লাইব্রেরি ব্যবহার করার কথা বিবেচনা করুন যা অসমর্থিত পদ্ধতিগুলি ব্যবহার করে না।

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

Java 8+ API desugaring সমর্থন (Android Gradle Plugin 4.0.0+)

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

পুরানো প্ল্যাটফর্ম সংস্করণগুলির জন্য এই অতিরিক্ত সমর্থন সম্ভব কারণ প্লাগইন 4.0.0 এবং উচ্চতর ডিসুগারিং ইঞ্জিনকে জাভা ল্যাঙ্গুয়েজ এপিআইগুলিকেও প্রসারিত করে। আপনি স্ট্যান্ডার্ড ল্যাঙ্গুয়েজ এপিআই অন্তর্ভুক্ত করতে পারেন যেগুলি শুধুমাত্র সাম্প্রতিক অ্যান্ড্রয়েড রিলিজে (যেমন 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-এর সম্পূর্ণ তালিকার জন্য, desugaring-এর মাধ্যমে উপলব্ধ Java 8+ API এবং desugaring-এর মাধ্যমে উপলব্ধ Java 11+ API-গুলি দেখুন।

এই ভাষা APIগুলিকে সমর্থন করার জন্য, প্লাগইনটি একটি পৃথক DEX ফাইল কম্পাইল করে যাতে অনুপস্থিত APIগুলির একটি বাস্তবায়ন থাকে এবং এটি আপনার অ্যাপে অন্তর্ভুক্ত করে৷ ডিসুগারিং প্রক্রিয়া রানটাইমে এই লাইব্রেরিটি ব্যবহার করার পরিবর্তে আপনার অ্যাপের কোড পুনরায় লিখবে।

Android প্ল্যাটফর্মের যেকোনো সংস্করণে এই ভাষা APIগুলির জন্য সমর্থন সক্ষম করতে:

  1. Android Gradle প্লাগইনটি 4.0.0 (বা উচ্চতর) তে আপডেট করুন
  2. আপনার অ্যাপ মডিউলের build.gradle বা build.gradle.kts ফাইলে নিম্নলিখিতগুলি অন্তর্ভুক্ত করুন:

কোটলিন

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গুলি ব্যবহার করে (হয় সরাসরি বা লাইব্রেরি মডিউল বা এর নির্ভরতার মাধ্যমে)। এটি যাতে অনুপস্থিত APIগুলি আপনার ইনস্ট্রুমেন্টেড টেস্ট APK এর জন্য প্রদান করা হয়।

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

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

সংস্করণ

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

সংস্করণ ন্যূনতম Android Gradle প্লাগইন সংস্করণ
1.1.9 4.0.0
1.2.3 7.3.0
2.0.3 7.4.0-আলফা10

জাভা 8+ এপিআই লাইব্রেরির সংস্করণগুলির বিশদ বিবরণের জন্য, desugar_jdk_libs GitHub সংগ্রহস্থলে CHANGELOG.md ফাইলটি দেখুন।