অ্যান্ড্রয়েডে জাভা সংস্করণ তৈরি করে

আপনার সোর্স কোড জাভা, কোটলিন, অথবা উভয় ভাষাতেই লেখা হোক না কেন, আপনার বিল্ডের জন্য আপনাকে বেশ কয়েকটি জায়গায় JDK বা জাভা ভাষার সংস্করণ বেছে নিতে হবে।

গ্রেডল বিল্ডে JDK সম্পর্কের সংক্ষিপ্তসার
চিত্র ১. একটি বিল্ডে JDK সম্পর্ক

শব্দকোষ

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

অ্যান্ড্রয়েড স্টুডিও চালানোর জন্য আমি কীভাবে একটি JDK নির্বাচন করব?

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

অ্যান্ড্রয়েড স্টুডিওর স্টার্টআপ স্ক্রিপ্টগুলি নিম্নলিখিত ক্রমে একটি JVM খোঁজে:

  1. STUDIO_JDK পরিবেশ পরিবর্তনশীল
  2. studio.jdk ডিরেক্টরি (অ্যান্ড্রয়েড স্টুডিও বিতরণে)
  3. অ্যান্ড্রয়েড স্টুডিও ডিস্ট্রিবিউশনে jbr ডিরেক্টরি (জেটব্রেইনস রানটাইম)। প্রস্তাবিত।
  4. JDK_HOME পরিবেশ পরিবর্তনশীল
  5. JAVA_HOME পরিবেশ পরিবর্তনশীল
  6. PATH এনভায়রনমেন্ট ভেরিয়েবলে java এক্সিকিউটেবল

আমার গ্র্যাডেল বিল্ড কোন JDK চালাবে তা আমি কীভাবে নির্বাচন করব?

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

সবচেয়ে সামঞ্জস্যপূর্ণ ফলাফলের জন্য, নিশ্চিত করুন যে আপনি আপনার JAVA_HOME এনভায়রনমেন্ট ভেরিয়েবল এবং Android স্টুডিওতে Gradle JDK কনফিগারেশনটি একই JDK তে সেট করেছেন।

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

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

অ্যান্ড্রয়েড স্টুডিওতে গ্র্যাডেল জেডিকে কনফিগারেশন

বিদ্যমান প্রকল্পের Gradle JDK কনফিগারেশন পরিবর্তন করতে, File (অথবা macOS-এ Android Studio ) > Settings > Build, Execution, Deployment > Build Tools > Gradle থেকে Gradle সেটিংস খুলুন। Gradle JDK ড্রপ-ডাউন মেনুতে নিম্নলিখিত বিকল্পগুলি নির্বাচন করার জন্য রয়েছে:

  • JAVA_HOME এবং GRADLE_LOCAL_JAVA_HOME এর মতো ম্যাক্রোগুলি
  • jbr-17 মতো vendor-version বিন্যাসে JDK টেবিল এন্ট্রিগুলি যা অ্যান্ড্রয়েড কনফিগারেশন ফাইলগুলিতে সংরক্ষণ করা হয়
  • একটি JDK ডাউনলোড করা হচ্ছে
  • একটি নির্দিষ্ট JDK যোগ করা হচ্ছে
  • অপারেটিং সিস্টেমের ডিফল্ট JDK ইনস্টলেশন ডিরেক্টরি থেকে স্থানীয়ভাবে সনাক্ত করা JDK গুলি

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

চিত্র ২। অ্যান্ড্রয়েড স্টুডিওতে গ্র্যাডেল জেডিকে সেটিংস।

ম্যাক্রোগুলি গতিশীল প্রকল্প JDK পথ নির্বাচন সক্ষম করে:

  • JAVA_HOME : একই নামের পরিবেশ পরিবর্তনশীল ব্যবহার করে
  • GRADLE_LOCAL_JAVA_HOME : .gradle/config.properties ফাইলে java.home প্রপার্টি ব্যবহার করে যা JetBrains রানটাইমে ডিফল্ট।

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

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

উদাহরণস্বরূপ, Android Gradle Plugin সংস্করণ 8.x এর জন্য JDK 17 প্রয়োজন। যদি আপনি এমন একটি Gradle বিল্ড চালানোর চেষ্টা করেন যা JDK এর পূর্ববর্তী সংস্করণের সাথে এটি ব্যবহার করে, তাহলে এটি একটি বার্তা রিপোর্ট করে যেমন:

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`.

আমার জাভা বা কোটলিন সোর্স কোডে আমি কোন জাভা এপিআই ব্যবহার করতে পারি?

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

কোটলিন

android {
    ...
    compileSdk = 33
}

খাঁজকাটা

android {
    ...
    compileSdk 33
}

অ্যান্ড্রয়েডের প্রতিটি সংস্করণ JDK-এর একটি নির্দিষ্ট সংস্করণ এবং এর উপলব্ধ জাভা API-এর একটি উপসেট সমর্থন করে। যদি আপনি এমন একটি জাভা API ব্যবহার করেন যা একটি compileSdk এ উপলব্ধ যা নির্দিষ্ট minSdk তে উপলব্ধ নয়, তাহলে আপনি desugaring নামে পরিচিত একটি প্রক্রিয়ার মাধ্যমে অ্যান্ড্রয়েডের পূর্ববর্তী সংস্করণে API ব্যবহার করতে সক্ষম হতে পারেন। সমর্থিত API-এর জন্য desugaring-এর মাধ্যমে উপলব্ধ জাভা 11+ API দেখুন।

প্রতিটি অ্যান্ড্রয়েড এপিআই কোন জাভা সংস্করণ সমর্থিত তা নির্ধারণ করতে এবং কোন জাভা এপিআইগুলি উপলব্ধ তার বিশদ কোথায় পাবেন তা নির্ধারণ করতে এই টেবিলটি ব্যবহার করুন।

অ্যান্ড্রয়েড জাভা API এবং ভাষা বৈশিষ্ট্য সমর্থিত
১৪ (এপিআই ৩৪) ১৭ মূল লাইব্রেরি
১৩ (এপিআই ৩৩) ১১ মূল লাইব্রেরি
১২ (এপিআই ৩২) ১১ জাভা এপিআই
১১ এবং তার কম অ্যান্ড্রয়েড সংস্করণ

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

জাভা টুলচেইন JDK-তে জাভা সোর্স কোড কম্পাইল করার জন্য ব্যবহৃত জাভা কম্পাইলার থাকে। এই JDK বিল্ডের সময় জাভাডোক এবং ইউনিট পরীক্ষাও চালায়।

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

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

  • বিল্ডটি চলমান সিস্টেমে একটি সামঞ্জস্যপূর্ণ JDK সনাক্ত করে।
    • যদি কোনও সামঞ্জস্যপূর্ণ JDK না থাকে (এবং একটি টুলচেইন রেজলভার সংজ্ঞায়িত করা থাকে), তাহলে একটি ডাউনলোড করে।
  • সোর্স কোড থেকে কলের জন্য টুলচেইন জাভা API গুলি প্রকাশ করে।
  • জাভা ভাষার সংস্করণ ব্যবহার করে জাভা উৎস কম্পাইল করে।
  • sourceCompatibility এবং targetCompatibility এর জন্য ডিফল্ট সরবরাহ করে।

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

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

জাভা টুলচেইন সংস্করণটি এভাবে নির্দিষ্ট করুন:

কোটলিন

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

খাঁজকাটা

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

আপনার উৎস যদি কোটলিন, জাভা, অথবা উভয়ের মিশ্রণ হয় তবে এটি কাজ করে।

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

আমার জাভা সোর্স কোডে আমি কোন জাভা ভাষার সোর্স বৈশিষ্ট্য ব্যবহার করতে পারি?

জাভা সোর্স কম্পাইলেশনের সময় কোন জাভা ভাষার বৈশিষ্ট্যগুলি উপলব্ধ থাকবে তা sourceCompatibility বৈশিষ্ট্য নির্ধারণ করে। এটি কোটলিন সোর্সকে প্রভাবিত করে না।

আপনার মডিউলের build.gradle(.kts) ফাইলে sourceCompatibility নিম্নরূপ উল্লেখ করুন:

কোটলিন

android {
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
    }
}

খাঁজকাটা

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
    }
}

যদি নির্দিষ্ট না করা থাকে, তাহলে এই বৈশিষ্ট্যটি জাভা টুলচেইন সংস্করণে ডিফল্টভাবে ব্যবহৃত হয়। যদি আপনি জাভা টুলচেইন ব্যবহার না করেন, তাহলে এটি অ্যান্ড্রয়েড গ্র্যাডেল প্লাগইন দ্বারা নির্বাচিত একটি সংস্করণে ডিফল্টভাবে ব্যবহৃত হয় (উদাহরণস্বরূপ, জাভা 8 বা উচ্চতর)।

আমার কোটলিন বা জাভা সোর্স কম্পাইল করার সময় কোন জাভা বাইনারি বৈশিষ্ট্যগুলি ব্যবহার করা যেতে পারে?

কম্পাইল করা জাভা এবং কোটলিন সোর্সের জন্য বাইটকোড তৈরি করার সময় যথাক্রমে targetCompatibility এবং jvmTarget বৈশিষ্ট্যগুলি জাভা ক্লাস-ফরম্যাট সংস্করণ নির্ধারণ করে।

সমতুল্য জাভা বৈশিষ্ট্য যুক্ত হওয়ার আগে কিছু কোটলিন বৈশিষ্ট্য বিদ্যমান ছিল। প্রাথমিক কোটলিন কম্পাইলারদের সেই কোটলিন বৈশিষ্ট্যগুলি উপস্থাপন করার জন্য নিজস্ব উপায় তৈরি করতে হত। এই বৈশিষ্ট্যগুলির মধ্যে কিছু পরে জাভাতে যুক্ত করা হয়েছিল। পরবর্তী jvmTarget স্তরগুলির সাথে, কোটলিন কম্পাইলার সরাসরি জাভা বৈশিষ্ট্যটি ব্যবহার করতে পারে, যার ফলে আরও ভাল কর্মক্ষমতা পাওয়া যেতে পারে।

অ্যান্ড্রয়েডের বিভিন্ন সংস্করণ জাভার বিভিন্ন সংস্করণ সমর্থন করে। আপনি targetCompatibility এবং jvmTarget বৃদ্ধি করে অতিরিক্ত জাভা বৈশিষ্ট্যগুলির সুবিধা নিতে পারেন, তবে এটি আপনাকে বৈশিষ্ট্যটি উপলব্ধ কিনা তা নিশ্চিত করার জন্য আপনার ন্যূনতম অ্যান্ড্রয়েড SDK সংস্করণও বাড়াতে বাধ্য করতে পারে।

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

কোটলিন

android {
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
        targetCompatibility = JavaVersion.VERSION_17
    }
    kotlinOptions {
        jvmTarget = "17"
    }
}

খাঁজকাটা

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
        targetCompatibility JavaVersion.VERSION_17
    }
    kotlinOptions {
        jvmTarget '17'
    }
}

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