Android বিল্ডে Java ভার্সন

আপনার সোর্স কোড Java, Kotlin বা দু'টি ভাষাতেই লেখা হোক না কেন, আপনার বিল্ডের জন্য JDK বা Java ল্যাঙ্গুয়েজ ভার্সন বেছে নেওয়ার জন্য একাধিক জায়গা আছে।

Gradle বিল্ডে JDK সম্পর্কের ওভারভিউ
ছবি ১. বিল্ডে JDK সম্পর্ক

শব্দকোষ

Java ডেভেলপমেন্ট কিট (JDK)
Java ডেভেলপমেন্ট কিট (JDK) এগুলি থাকে:
  • কম্পাইলার, প্রোফাইলার ও আর্কাইভ ক্রিয়েটরের মতো টুল। আপনার অ্যাপ্লিকেশন তৈরি করার জন্য এগুলি আপনার বিল্ডের সময় নেপথ্যে ব্যবহার করা হয়।
  • API সহ লাইব্রেরি যা আপনার Kotlin বা Java সোর্স কোড থেকে কল করতে পারবেন। মনে রাখবেন, Android-এ সব ফাংশন উপলভ্য নেই।
  • Java ভার্চুয়াল মেশিন (JVM), একটি ইন্টারপ্রেটার যা Java অ্যাপ্লিকেশন এক্সিকিউট করে। আপনি Android Studio IDE ও Gradle বিল্ড টুল চালানোর জন্য JVM ব্যবহার করেন। JVM Android ডিভাইস বা এমুলেটরে ব্যবহার করা হয় না।
JetBrains Runtime (JBR)
JetBrains Runtime (JBR) হল একটি উন্নত JDK যা Android Studio-এর সাথে ডিস্ট্রিবিউট করা হয়। এটি Studio এবং JetBrains সম্পর্কিত প্রোডাক্টে ব্যবহারের জন্য বিভিন্ন অপ্টিমাইজেশন অন্তর্ভুক্ত করে, তবে অন্যান্য Java অ্যাপ্লিকেশন চালানোর জন্যও ব্যবহার করা যেতে পারে।

Android Studio চালানোর জন্য আমি কীভাবে JDK বেছে নেব?

Android Studio চালানোর জন্য আমরা JBR ব্যবহার করার সাজেশন দিই। এটি Android Studio-এর সাথে ডেপ্লয় করা হয় এবং Android Studio পরীক্ষা করার জন্য ব্যবহার করা হয়। এতে Android Studio-র সর্বোত্তম ব্যবহারের জন্য উন্নত ফিচার রয়েছে। এটি নিশ্চিত করতে, STUDIO_JDK এনভায়রনমেন্ট ভেরিয়েবল সেট করবেন না।

Android Studio-র স্টার্ট-আপ স্ক্রিপ্ট নিম্নলিখিত ক্রম অনুসারে JVM খোঁজে:

  1. STUDIO_JDK এনভায়রনমেন্ট ভেরিয়েবল
  2. studio.jdk ডিরেক্টরি (Android Studio ডিস্ট্রিবিউশনে)
  3. jbr ডিরেক্টরি (JetBrains Runtime), Android Studio ডিস্ট্রিবিউশনে। সাজেস্ট করা হয়েছে।
  4. JDK_HOME এনভায়রনমেন্ট ভেরিয়েবল
  5. JAVA_HOME এনভায়রনমেন্ট ভেরিয়েবল
  6. java PATH এনভায়রনমেন্ট ভেরিয়েবলে এক্সিকিউট করা যায়

আমার Gradle বিল্ড কোন JDK-তে চলবে তা আমি কীভাবে বেছে নেব?

আপনি যদি Android Studio-তে বোতাম ব্যবহার করে Gradle চালান, তাহলে Android Studio সেটিংসের মধ্যে সেট করা JDK Gradle চালানোর জন্য ব্যবহার করা হয়। আপনি যদি Android Studio-এর ভিতরে বা বাইরে কোনও টার্মিনালে Gradle চালান, তাহলে JAVA_HOME এনভায়রনমেন্ট ভেরিয়েবল (সেট করা থাকলে) নির্ধারণ করে যে কোন JDK Gradle স্ক্রিপ্ট চালায়। JAVA_HOME সেট করা না থাকলে, এটি আপনার PATH এনভায়রনমেন্ট ভেরিয়েবলে java কমান্ড ব্যবহার করে।

সবচেয়ে ধারাবাহিক ফলাফল পেতে, JAVA_HOME এনভায়রনমেন্ট ভেরিয়েবল এবং Android Studio-তে Gradle JDK কনফিগারেশন একই JDK-তে সেট করেছেন কিনা তা নিশ্চিত করুন।

আপনার বিল্ড চালানোর সময়, Gradle একটি প্রসেস তৈরি করে যাকে ডিমোন বলা হয়। এটি প্রকৃত বিল্ড পারফর্ম করে। এই প্রসেসটি আবার ব্যবহার করা যেতে পারে, যতক্ষণ না বিল্ড একই JDK এবং Gradle ভার্সন ব্যবহার করছে। ডিমনের পুনর্ব্যবহার নতুন JVM চালু করা এবং বিল্ড সিস্টেম শুরু করার সময় কমিয়ে দেয়।

আপনি যদি আলাদা আলাদা JDK বা Gradle ভার্সন দিয়ে বিল্ড শুরু করেন, তাহলে অতিরিক্ত ডিমোন তৈরি হয়, যার ফলে আরও বেশি CPU ও মেমরি ব্যবহার হয়।

Android Studio-তে Gradle JDK কনফিগারেশন

আগে থেকে থাকা প্রজেক্টের Gradle JDK কনফিগারেশন পরিবর্তন করতে, ফাইল (বা macOS-এ Android Studio) থেকে Gradle সেটিংস খুলুন > সেটিংস > বিল্ড, এক্সিকিউশন, ডিপ্লয়মেন্ট > বিল্ড টুল > Gradle। Gradle JDK ড্রপ-ডাউনে বেছে নেওয়ার জন্য নিম্নলিখিত বিকল্পগুলি রয়েছে:

  • JAVA_HOME ও GRADLE_LOCAL_JAVA_HOME-এর মতো ম্যাক্রো
  • vendor-version ফর্ম্যাটে JDK টেবিল এন্ট্রি, যেমন jbr-17 যা Android কনফিগারেশন ফাইলে স্টোর করা থাকে
  • JDK ডাউনলোড করা
  • নির্দিষ্ট JDK যোগ করা
  • অপারেটিং সিস্টেমের ডিফল্ট JDK ইনস্টলেশন ডিরেক্টরি থেকে লোকালি শনাক্ত করা JDK

বেছে নেওয়া বিকল্পটি gradleJvm বিকল্পে সেভ করা হয় প্রোজেক্টের .idea/gradle.xml ফাইলে এবং Android Studio-র মাধ্যমে শুরু করা হলে Gradle চালানোর জন্য এর JDK পাথ রেজোলিউশন ব্যবহার করা হয়।

ছবি ২. Android Studio-তে Gradle JDK সেটিংস।

ম্যাক্রো, ডায়নামিক প্রোজেক্ট JDK পাথ বেছে নেওয়ার সুবিধা চালু করে:

  • JAVA_HOME: একই নামের এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করে
  • GRADLE_LOCAL_JAVA_HOME: .gradle/config.properties ফাইলে java.home প্রপার্টি ব্যবহার করে যা ডিফল্ট হিসেবে JetBrains Runtime-এ সেট করা থাকে।

আপনার Gradle বিল্ড রান করতে এবং আপনার বিল্ড স্ক্রিপ্ট ও সোর্স কোড এডিট করার সময় JDK API রেফারেন্স সমাধান করতে বেছে নেওয়া JDK ব্যবহার করা হয়। মনে রাখবেন যে, নির্দিষ্ট compileSdk আরও সীমাবদ্ধ করবে যে কোন Java চিহ্নগুলি আপনার সোর্স কোড এডিট এবং তৈরি করার সময় উপলভ্য হবে।

আপনার Gradle বিল্ডে ব্যবহৃত প্লাগ-ইন দ্বারা ব্যবহৃত JDK ভার্সনের সমান বা তার থেকে বেশি JDK ভার্সন বেছে নিতে ভুলবেন না। Android Gradle Plugin (AGP)-এর জন্য ন্যূনতম প্রয়োজনীয় JDK ভার্সন নির্ধারণ করতে, রিলিজ নোটে উপলভ্য মানানসই টেবিল দেখুন।

যেমন, Android Gradle Plugin ভার্সন 8.x-এর জন্য JDK 17 প্রয়োজন। আপনি যদি JDK-এর আগের কোনও ভার্সনের সাথে এটি ব্যবহার করে এমন একটি Gradle বিল্ড চালানোর চেষ্টা করেন, তাহলে এটি এই ধরনের একটি মেসেজ দেখায়:

An exception occurred applying plugin request [id: 'com.android.application']
> Failed to apply plugin 'com.android.internal.application'.
   > Android Gradle plugin requires Java 17 to run. You are currently using Java 11.
      Your current JDK is located in /usr/local/buildtools/java/jdk
      You can try some of the following options:
       - changing the IDE settings.
       - changing the JAVA_HOME environment variable.
       - changing `org.gradle.java.home` in `gradle.properties`.

আমার Java বা Kotlin সোর্স কোডে কোন Java API ব্যবহার করতে পারি?

Android অ্যাপ্লিকেশন JDK-তে সংজ্ঞায়িত কিছু API ব্যবহার করতে পারে, তবে সবগুলি নয় । Android SDK-এর উপলভ্য API-এর অংশ হিসেবে অনেক Java লাইব্রেরি ফাংশনের প্রয়োগকে সংজ্ঞায়িত করে। আপনার Kotlin বা Java সোর্স কোড কম্পাইল করার সময় কোন Android SDK ভার্সন ব্যবহার করতে হবে তা compileSdk প্রপার্টি নির্দিষ্ট করে।

Kotlin

android {
    ...
    compileSdk = 36
}

গ্ৰুভি

android {
    ...
    compileSdk 36
}

Android-এর প্রতিটি ভার্সন JDK-এর একটি নির্দিষ্ট ভার্সন এবং উপলভ্য Java API-এর একটি সাবসেট সাপোর্ট করে। আপনি যদি এমন Java API ব্যবহার করেন যা নির্দিষ্ট করা minSdk-এ উপলভ্য নয় এমন compileSdk-এ উপলভ্য, তাহলে আপনি হয়ত ডিসেগারিং নামক একটি প্রক্রিয়ার মাধ্যমে Android-এর আগের ভার্সনে API ব্যবহার করতে পারবেন। সাপোর্ট করা API-এর জন্য desugaring-এর মাধ্যমে উপলভ্য Java 11+ API দেখুন।

কোন Android API কোন Java ভার্সনে কাজ করে এবং কোন Java API উপলভ্য, তা এই টেবিল থেকে জানতে পারবেন।

Android জাভা API ও ভাষা সংক্রান্ত ফিচার যা কাজ করে
14 (API 34) 17 কোর লাইব্রেরি
13 (API 33) 11 কোর লাইব্রেরি
12 (API 32) 11 Java API
১১ ও তার নিচে Android ভার্সন

কোন JDK আমার Java সোর্স কোড কম্পাইল করে?

Java টুলচেন JDK-তে যেকোনও Java সোর্স কোড কম্পাইল করার জন্য ব্যবহৃত Java কম্পাইলার থাকে। এছাড়াও, এই JDK বিল্ড করার সময় javadoc ও ইউনিট টেস্ট রান করে।

Gradle চালানোর জন্য ব্যবহৃত JDK-তে টুলচেন ডিফল্ট হিসেবে সেট করা থাকে। আপনি ডিফল্ট ব্যবহার করলে এবং আলাদা আলাদা মেশিনে বিল্ড রান করলে (যেমন, আপনার লোকাল মেশিন এবং আলাদা কন্টিনিউয়াস ইন্টিগ্রেশন সার্ভার), আলাদা আলাদা JDK ভার্সন ব্যবহার করা হলে, আপনার বিল্ডের ফলাফল আলাদা হতে পারে।

আরও বেশি সামঞ্জস্যপূর্ণ বিল্ড তৈরি করতে, আপনি স্পষ্টভাবে একটি Java টুলচেন ভার্সন নির্দিষ্ট করতে পারেন। এটি নির্দিষ্ট করা:

  • বিল্ড চলছে এমন সিস্টেমে মানানসই JDK খুঁজে নেয়।
    • কোনও মানানসই JDK না থাকলে (এবং টুলচেন রিজলভার নির্দিষ্ট করা থাকলে), একটি ডাউনলোড করে।
  • সোর্স কোড থেকে কল করার জন্য টুলচেন Java API প্রকাশ করে।
  • এর Java ভাষা ভার্সন ব্যবহার করে Java সোর্স কম্পাইল করে।
  • sourceCompatibility ও targetCompatibility-এর জন্য ডিফল্ট মান প্রদান করে।

আমরা সাজেস্ট করি যে আপনি সবসময় Java টুলচেন নির্দিষ্ট করুন এবং নিশ্চিত করুন যে নির্দিষ্ট JDK ইনস্টল করা আছে অথবা আপনার বিল্ডে টুলচেন রিজলভার যোগ করুন।

আপনার সোর্স কোড Java, Kotlin বা দু'টি ভাষাতেই লেখা হোক না কেন, আপনি টুলচেন নির্দিষ্ট করতে পারবেন। আপনার মডিউলের build.gradle(.kts) ফাইলের সবচেয়ে উপরের লেভেলে টুলচেন নির্দিষ্ট করুন।

Java টুলচেনের ভার্সন এইভাবে উল্লেখ করুন:

Kotlin

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17)
    }
}

গ্ৰুভি

java {
    toolchain {
        languageVersion = JavaLanguageVersion.of(17)
    }
}

আপনার সোর্স Kotlin, Java বা দুটির মিশ্রণ হলে এটি কাজ করে।

টুলচেন JDK ভার্সন, Gradle চালানোর জন্য ব্যবহৃত JDK-এর মতো হতে পারে, তবে মনে রাখবেন যে এগুলি আলাদা আলাদা উদ্দেশ্যে কাজ করে।

আমার Java সোর্স কোডে কোন Java ল্যাঙ্গুয়েজ সোর্স ফিচার ব্যবহার করতে পারি?

sourceCompatibility প্রপার্টি নির্ধারণ করে যে Java সোর্স কম্পাইল করার সময় কোন Java ভাষার ফিচার উপলভ্য থাকবে। এটি Kotlin সোর্সের উপর কোনও প্রভাব ফেলে না।

আপনার মডিউলের build.gradle(.kts) ফাইলে sourceCompatibility-কে এইভাবে নির্দিষ্ট করুন:

Kotlin

android {
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
    }
}

গ্ৰুভি

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
    }
}

নির্দিষ্ট করা না থাকলে, এই প্রপার্টি ডিফল্ট হিসেবে Java টুলচেন ভার্সন সেট করে। আপনি Java টুলচেন ব্যবহার না করলে, এটি ডিফল্ট হিসেবে Android Gradle প্লাগ-ইন (যেমন, Java 8 বা তার পরবর্তী যেকোনও ভার্সন) বেছে নেওয়া ভার্সনে সেট হয়ে যায়।

আমার Kotlin বা Java সোর্স কোড কম্পাইল করার সময় কোন Java বাইনারি ফিচার ব্যবহার করা যেতে পারে?

targetCompatibility প্রপার্টি থেকে কম্পাইল করা Java এবং Kotlin সোর্সের জন্য বাইটকোড জেনারেট করার সময় ব্যবহৃত Java ক্লাস-ফরম্যাট ভার্সন নির্ধারণ করা হয়।

সমতুল্য Java ফিচার যোগ করার আগে থেকেই কিছু Kotlin ফিচার ছিল। আগের Kotlin কম্পাইলারদের Kotlin-এর সেইসব ফিচার দেখানোর জন্য নিজস্ব উপায় তৈরি করতে হত। এইসব ফিচারের মধ্যে কিছু পরে Java-তে যোগ করা হয়েছে। পরবর্তী targetCompatibility লেভেলে, Kotlin কম্পাইলার সরাসরি Java ফিচার ব্যবহার করতে পারে, যার ফলে পারফর্ম্যান্স আরও ভালো হতে পারে।

Android-এর বিভিন্ন ভার্সনে Java-র বিভিন্ন ভার্সন কাজ করে। আপনি targetCompatibility বাড়ানোর মাধ্যমে অতিরিক্ত Java ফিচারের সুবিধা নিতে পারবেন, কিন্তু এটি নিশ্চিত করতে আপনাকে ন্যূনতম Android SDK ভার্সন বাড়াতেও বাধ্য করতে পারে যে ফিচারটি উপলভ্য আছে।

মনে রাখবেন, targetCompatibility অবশ্যই sourceCompatibility-এর থেকে বড় বা সমান হতে হবে। বাস্তবে, sourceCompatibility ও targetCompatibility-এর জন্য সাধারণত একই ভ্যালু ব্যবহার করা উচিত। আপনি এগুলি এইভাবে সেট করতে পারবেন:

Kotlin

android {
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
        targetCompatibility = JavaVersion.VERSION_17
    }
}

গ্ৰুভি

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
        targetCompatibility JavaVersion.VERSION_17
    }
}

আপনি 2.2-এর থেকে কম ভার্সনের Kotlin ব্যবহার করলে, আপনাকে এগুলিও সেট করতে হবে: kotlinOptions:

Kotlin

android {
    kotlinOptions {
        jvmTarget = "17"
    }
}

গ্ৰুভি

android {
    kotlinOptions {
        jvmTarget = "17"
    }
}

উল্লেখ করা না থাকলে, এইসব প্রপার্টি ডিফল্ট হিসেবে Java টুলচেন ভার্সন হয়ে যায়। আপনি Java টুলচেন ব্যবহার না করলে, ডিফল্ট ভ্যালু আলাদা হতে পারে এবং এর ফলে বিল্ড সংক্রান্ত সমস্যা হতে পারে। তাই, আমরা সাজেস্ট করি যে আপনি সবসময় এই ভ্যালুগুলি স্পষ্টভাবে উল্লেখ করুন অথবা Java টুলচেন ব্যবহার করুন।