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

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

একটি Gradle বিল্ডে JDK সম্পর্কের ওভারভিউ

শব্দকোষ

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

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

আমরা আপনাকে Android স্টুডিও চালানোর জন্য JBR ব্যবহার করার পরামর্শ দিই। এটি অ্যান্ড্রয়েড স্টুডিও পরীক্ষা করার জন্য নিয়োজিত এবং ব্যবহার করা হয়েছে এবং সর্বোত্তম অ্যান্ড্রয়েড স্টুডিও ব্যবহারের জন্য বর্ধিতকরণ অন্তর্ভুক্ত করে। এটি নিশ্চিত করতে, STUDIO_JDK পরিবেশ পরিবর্তনশীল সেট করবেন না।

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

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

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

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

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

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

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

Android স্টুডিওতে Gradle JDK কনফিগারেশন

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

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

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

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

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

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

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

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

উদাহরণস্বরূপ, অ্যান্ড্রয়েড গ্রেডল প্লাগইন সংস্করণ 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/jdk11
      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`.

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

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

কোটলিন

android {
    ...
    compileSdk = 33
}

গ্রোভি

android {
    ...
    compileSdk 33
}

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

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

অ্যান্ড্রয়েড জাভা API এবং ভাষা বৈশিষ্ট্য সমর্থিত
14 (API 34) 17 মূল লাইব্রেরি
13 (API 33) 11 মূল লাইব্রেরি
12 (API 32) 11 জাভা API
11 এবং নিম্ন অ্যান্ড্রয়েড সংস্করণ

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

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

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 প্রপার্টি নির্ধারণ করে জাভা সোর্স সংকলনের সময় কোন জাভা ভাষার বৈশিষ্ট্যগুলি উপলব্ধ। এটি কোটলিন উত্সকে প্রভাবিত করে না।

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

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

কোটলিন

android {
    compileOptions {
        sourceCompatibility = JavaVersion.VERSION_17
    }
}

গ্রোভি

android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_17
    }
}

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

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

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

targetCompatibility ডিফল্ট sourceCompatibility এর মতো একই মান, কিন্তু যদি নির্দিষ্ট করা হয়, তাহলে অবশ্যই sourceCompatibility এর থেকে বেশি বা সমান হতে হবে।

jvmTarget টুলচেইন সংস্করণে ডিফল্ট।

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

কোটলিন

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

গ্রোভি

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