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

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

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

শব্দকোষ

Java Development Kit (JDK)
Java Development Kit (JDK)-এ এগুলি থাকে:
  • কম্পাইলার, প্রোফাইলার ও আর্কাইভ ক্রিয়েটরের মতো টুল। আপনার অ্যাপ্লিকেশন তৈরি করার জন্য আপনার বিল্ডের সময় এগুলি ব্যাকগ্রাউন্ডে ব্যবহার করা হয়।
  • API সহ লাইব্রেরি যা আপনি আপনার Kotlin বা Java সোর্স কোড থেকে কল করতে পারবেন। মনে রাখবেন যে Android-এ সব ফাংশন উপলভ্য নয়।
  • Java ভার্চুয়াল মেশিন (JVM), একটি ইন্টারপ্রেটার যা Java অ্যাপ্লিকেশন এক্সিকিউট করে। আপনি Android Studio IDE এবং Gradle বিল্ড টুল রান করার জন্য JVM ব্যবহার করেন। Android ডিভাইস বা এমুলেটরে JVM ব্যবহার করা হয় না।
JetBrains রানটাইম (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. Android Studio ডিস্ট্রিবিউশনে jbr ডিরেক্টরি (JetBrains Runtime)। সাজেস্ট করা হয়েছে।
  4. JDK_HOME এনভায়রনমেন্ট ভেরিয়েবল
  5. JAVA_HOME এনভায়রনমেন্ট ভেরিয়েবল
  6. PATH এনভায়রনমেন্ট ভেরিয়েবলে java এক্সিকিউটেবল

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

আপনি যদি Android Studio-তে বোতাম ব্যবহার করে Gradle চালান, তাহলে Gradle চালানোর জন্য Android Studio সেটিংসে সেট করা JDK ব্যবহার করা হয়। আপনি যদি 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

বেছে নেওয়া বিকল্পটি প্রোজেক্টের .idea/gradle.xml ফাইলের gradleJvm বিকল্পে স্টোর করা হয় এবং 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 আপনার সোর্স কোড এডিট ও তৈরি করার সময় কোন জাভা সিম্বল উপলভ্য হবে তা আরও সীমাবদ্ধ করবে।

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

যেমন, Android Gradle প্লাগ-ইন ভার্সন 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 লাইব্রেরি ফাংশনের ইমপ্লিমেন্টেশনকে সংজ্ঞায়িত করে। compileSdk প্রপার্টি নির্দিষ্ট করে যে আপনার Kotlin বা Java সোর্স কোড কম্পাইল করার সময় কোন Android SDK ভার্সন ব্যবহার করতে হবে।

Kotlin

android {
    ...
    compileSdk = 36
}

গ্ৰুভি

android {
    ...
    compileSdk 36
}

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

প্রতিটি Android API-এর সাথে কোন Java ভার্সন কাজ করে এবং কোন Java API উপলভ্য আছে সেই সম্পর্কে বিস্তারিত তথ্য কোথায় পাবেন তা নির্ধারণ করতে এই সারণী ব্যবহার করুন।

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

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

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 প্রপার্টি নির্ধারণ করে যে জাভা সোর্স কম্পাইল করার সময় কোন কোন জাভা ল্যাঙ্গুয়েজ ফিচার উপলভ্য থাকে। এটি 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
    }
}

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

Kotlin

android {
    kotlinOptions {
        jvmTarget = "17"
    }
}

গ্ৰুভি

android {
    kotlinOptions {
        jvmTarget = "17"
    }
}

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