আপনার সোর্স কোড জাভা, কোটলিন বা উভয়টিতেই লেখা হোক না কেন, বিল্ডের জন্য আপনাকে বেশ কয়েকটি জায়গায় একটি জেডিকে (JDK) বা জাভা ভাষার সংস্করণ বেছে নিতে হবে।
শব্দকোষ
- জাভা ডেভেলপমেন্ট কিট (JDK)
- জাভা ডেভেলপমেন্ট কিট (JDK) -তে রয়েছে:
- কম্পাইলার, প্রোফাইলার এবং আর্কাইভ ক্রিয়েটরের মতো টুলগুলো আপনার অ্যাপ্লিকেশন তৈরি করার জন্য বিল্ডের সময় নেপথ্যে ব্যবহৃত হয়।
- লাইব্রেরিগুলোতে এমন সব এপিআই (API) রয়েছে যা আপনি আপনার কোটলিন বা জাভা সোর্স কোড থেকে কল করতে পারেন। উল্লেখ্য যে, সব ফাংশন অ্যান্ড্রয়েডে উপলব্ধ নয়।
- জাভা ভার্চুয়াল মেশিন (JVM) হলো একটি ইন্টারপ্রেটার যা জাভা অ্যাপ্লিকেশনগুলো চালায়। অ্যান্ড্রয়েড স্টুডিও আইডিই (IDE) এবং গ্রেডল বিল্ড টুল (Gradle build tool) চালানোর জন্য জেভিএম ব্যবহার করা হয়। অ্যান্ড্রয়েড ডিভাইস বা এমুলেটরে জেভিএম ব্যবহৃত হয় না।
- জেটব্রেইনস রানটাইম (জেবিআর)
- জেটব্রেইনস রানটাইম (JBR) হলো একটি উন্নত JDK, যা অ্যান্ড্রয়েড স্টুডিওর সাথে বিতরণ করা হয়। এতে স্টুডিও এবং সংশ্লিষ্ট জেটব্রেইনস পণ্যগুলিতে ব্যবহারের জন্য বেশ কিছু অপ্টিমাইজেশন অন্তর্ভুক্ত রয়েছে, তবে এটি অন্যান্য জাভা অ্যাপ্লিকেশন চালানোর জন্যও ব্যবহার করা যেতে পারে।
অ্যান্ড্রয়েড স্টুডিও চালানোর জন্য আমি কীভাবে একটি JDK নির্বাচন করব?
আমরা অ্যান্ড্রয়েড স্টুডিও চালানোর জন্য JBR ব্যবহার করার পরামর্শ দিই। এটি অ্যান্ড্রয়েড স্টুডিওর সাথেই ডেপ্লয় করা হয় এবং এটি পরীক্ষা করার জন্য ব্যবহৃত হয়, এবং অ্যান্ড্রয়েড স্টুডিওর সর্বোত্তম ব্যবহারের জন্য এতে উন্নত বৈশিষ্ট্য অন্তর্ভুক্ত রয়েছে। এটি নিশ্চিত করতে, STUDIO_JDK এনভায়রনমেন্ট ভেরিয়েবলটি সেট করবেন না।
অ্যান্ড্রয়েড স্টুডিওর স্টার্টআপ স্ক্রিপ্টগুলো নিম্নলিখিত ক্রমে একটি JVM খুঁজে থাকে:
-
STUDIO_JDKপরিবেশ ভেরিয়েবল -
studio.jdkডিরেক্টরি (অ্যান্ড্রয়েড স্টুডিও ডিস্ট্রিবিউশনে) - অ্যান্ড্রয়েড স্টুডিও ডিস্ট্রিবিউশনের
jbrডিরেক্টরি (জেটব্রেইনস রানটাইম)। এটি ব্যবহার করার পরামর্শ দেওয়া হয়। -
JDK_HOMEপরিবেশ ভেরিয়েবল -
JAVA_HOMEপরিবেশ ভেরিয়েবল -
PATHএনভায়রনমেন্ট ভেরিয়েবলেjavaএক্সিকিউটেবল
আমার গ্রেডল বিল্ডগুলো চালানোর জন্য কোন জেডিকে (JDK) ব্যবহার করব, তা কীভাবে নির্বাচন করব?
আপনি যদি অ্যান্ড্রয়েড স্টুডিওর বাটনগুলো ব্যবহার করে গ্রেডল চালান, তাহলে অ্যান্ড্রয়েড স্টুডিও সেটিংসে সেট করা জেডিকে (JDK) গ্রেডল চালানোর জন্য ব্যবহৃত হয়। আপনি যদি অ্যান্ড্রয়েড স্টুডিওর ভেতরে বা বাইরে কোনো টার্মিনালে গ্রেডল চালান, তাহলে JAVA_HOME এনভায়রনমেন্ট ভেরিয়েবল (যদি সেট করা থাকে) নির্ধারণ করে কোন জেডিকে গ্রেডল স্ক্রিপ্টগুলো চালাবে। যদি JAVA_HOME সেট করা না থাকে, তবে এটি আপনার PATH এনভায়রনমেন্ট ভেরিয়েবলে থাকা java কমান্ডটি ব্যবহার করে।
সবচেয়ে সামঞ্জস্যপূর্ণ ফলাফলের জন্য, নিশ্চিত করুন যে আপনি আপনার JAVA_HOME এনভায়রনমেন্ট ভেরিয়েবল এবং অ্যান্ড্রয়েড স্টুডিওতে Gradle JDK কনফিগারেশন একই JDK-তে সেট করেছেন।
আপনার বিল্ড চালানোর সময়, গ্রেডল প্রকৃত বিল্ডটি সম্পাদন করার জন্য ডেমন নামক একটি প্রসেস তৈরি করে। এই প্রসেসটি পুনরায় ব্যবহার করা যেতে পারে, যতক্ষণ পর্যন্ত বিল্ডগুলোতে একই জেডিকে (JDK) এবং গ্রেডল সংস্করণ ব্যবহৃত হয়। একটি ডেমন পুনরায় ব্যবহার করলে নতুন জেভিএম (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 পাথ রেজোলিউশন ব্যবহার করা হয়।

ম্যাক্রোগুলি ডায়নামিক প্রজেক্ট JDK পাথ নির্বাচন সক্ষম করে:
-
JAVA_HOME: একই নামের এনভায়রনমেন্ট ভেরিয়েবল ব্যবহার করে -
GRADLE_LOCAL_JAVA_HOME: এটি.gradle/config.propertiesফাইলেরjava.homeপ্রপার্টি ব্যবহার করে, যা ডিফল্টভাবে JetBrains Runtime-এ সেট করা থাকে।
আপনার গ্রেডল বিল্ড চালানোর জন্য এবং আপনার বিল্ড স্ক্রিপ্ট ও সোর্স কোড সম্পাদনা করার সময় জেডিকে এপিআই রেফারেন্সগুলো সমাধান করার জন্য নির্বাচিত জেডিকে ব্যবহৃত হয়। উল্লেখ্য যে, নির্দিষ্ট compileSdk আপনার সোর্স কোড সম্পাদনা ও বিল্ড করার সময় কোন জাভা সিম্বলগুলো উপলব্ধ থাকবে, তা আরও সীমাবদ্ধ করে দেবে।
আপনার গ্রেডল বিল্ডে ব্যবহৃত প্লাগইনগুলোর JDK ভার্সনের চেয়ে উচ্চতর বা সমান একটি JDK ভার্সন বেছে নেওয়া নিশ্চিত করুন। অ্যান্ড্রয়েড গ্রেডল প্লাগইন (AGP)-এর জন্য ন্যূনতম প্রয়োজনীয় JDK ভার্সন জানতে, রিলিজ নোটে থাকা কম্প্যাটিবিলিটি টেবিলটি দেখুন।
উদাহরণস্বরূপ, অ্যান্ড্রয়েড গ্রেডল প্লাগইন সংস্করণ 8.x-এর জন্য JDK 17 প্রয়োজন। আপনি যদি 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`.
আমার জাভা বা কোটলিন সোর্স কোডে আমি কোন কোন জাভা এপিআই ব্যবহার করতে পারি?
একটি অ্যান্ড্রয়েড অ্যাপ্লিকেশন জেডিকে-তে সংজ্ঞায়িত কিছু এপিআই ব্যবহার করতে পারে, কিন্তু সবগুলো নয়। অ্যান্ড্রয়েড এসডিকে তার উপলব্ধ এপিআই-এর অংশ হিসেবে অনেক জাভা লাইব্রেরি ফাংশনের ইমপ্লিমেন্টেশন সংজ্ঞায়িত করে। আপনার কোটলিন বা জাভা সোর্স কোড কম্পাইল করার সময় কোন অ্যান্ড্রয়েড এসডিকে সংস্করণটি ব্যবহার করতে হবে, তা compileSdk প্রপার্টি দ্বারা নির্দিষ্ট করা হয়।
কোটলিন
android {
...
compileSdk = 36
}
গ্রুভি
android {
...
compileSdk 36
}
অ্যান্ড্রয়েডের প্রতিটি সংস্করণ JDK-এর একটি নির্দিষ্ট সংস্করণ এবং এর উপলব্ধ জাভা এপিআই-গুলোর একটি উপসেট সমর্থন করে। আপনি যদি এমন কোনো জাভা এপিআই ব্যবহার করেন যা নির্দিষ্ট minSdk তে উপলব্ধ নয় এমন একটি compileSdk তে রয়েছে, তাহলে আপনি desugaring নামে পরিচিত একটি প্রক্রিয়ার মাধ্যমে অ্যান্ড্রয়েডের পূর্ববর্তী সংস্করণে সেই এপিআইটি ব্যবহার করতে সক্ষম হতে পারেন। সমর্থিত এপিআই-গুলোর জন্য “Java 11+ APIs available through desugaring” দেখুন।
প্রতিটি অ্যান্ড্রয়েড এপিআই কোন জাভা সংস্করণ সমর্থন করে এবং কোন জাভা এপিআইগুলো উপলব্ধ, সে সম্পর্কে বিস্তারিত তথ্য কোথায় পাওয়া যাবে তা জানতে এই সারণিটি ব্যবহার করুন।
| অ্যান্ড্রয়েড | জাভা | এপিআই এবং ভাষার বৈশিষ্ট্য সমর্থিত |
|---|---|---|
| ১৪ (এপিআই ৩৪) | ১৭ | কোর লাইব্রেরি |
| ১৩ (এপিআই ৩৩) | ১১ | কোর লাইব্রেরি |
| ১২ (এপিআই ৩২) | ১১ | জাভা এপিআই |
| ১১ এবং তার কম | অ্যান্ড্রয়েড সংস্করণগুলি |
কোন JDK আমার জাভা সোর্স কোড কম্পাইল করে?
জাভা টুলচেইন JDK-তে জাভা কম্পাইলার থাকে, যা যেকোনো জাভা সোর্স কোড কম্পাইল করতে ব্যবহৃত হয়। এই JDK বিল্ড চলাকালীন জাভাডক এবং ইউনিট টেস্টও চালায়।
টুলচেইনটি ডিফল্টরূপে গ্রেডল চালানোর জন্য ব্যবহৃত জেডিকে (JDK) ব্যবহার করে। আপনি যদি ডিফল্টটি ব্যবহার করেন এবং বিভিন্ন মেশিনে (উদাহরণস্বরূপ, আপনার স্থানীয় মেশিন এবং একটি পৃথক কন্টিনিউয়াস ইন্টিগ্রেশন সার্ভার) একটি বিল্ড চালান, তাহলে ভিন্ন ভিন্ন জেডিকে সংস্করণ ব্যবহৃত হলে আপনার বিল্ডের ফলাফল ভিন্ন হতে পারে।
আরও সামঞ্জস্যপূর্ণ বিল্ড তৈরি করতে, আপনি স্পষ্টভাবে একটি জাভা টুলচেইন সংস্করণ নির্দিষ্ট করে দিতে পারেন। এটি নির্দিষ্ট করলে:
- যে সিস্টেমে বিল্ডটি চালানো হচ্ছে, সেখানে একটি সামঞ্জস্যপূর্ণ JDK খুঁজে বের করে।
- যদি কোনো সামঞ্জস্যপূর্ণ JDK না থাকে (এবং একটি টুলচেইন রিজলভার সংজ্ঞায়িত থাকে), তাহলে একটি ডাউনলোড করা হয়।
- সোর্স কোড থেকে কল করার জন্য টুলচেইন জাভা এপিআইগুলো উন্মুক্ত করে।
- জাভা ভাষার সংস্করণ ব্যবহার করে জাভা সোর্স কম্পাইল করে।
-
sourceCompatibilityএবংtargetCompatibilityএর জন্য ডিফল্ট মান সরবরাহ করে।
আমরা সুপারিশ করি যে আপনি সর্বদা জাভা টুলচেইন নির্দিষ্ট করুন এবং হয় নির্দিষ্ট JDK ইনস্টল করা আছে কিনা তা নিশ্চিত করুন, অথবা আপনার বিল্ডে একটি টুলচেইন রিজলভার যোগ করুন।
আপনার সোর্স কোড জাভা, কোটলিন বা উভয়টিতেই লেখা হোক না কেন, আপনি টুলচেইন নির্দিষ্ট করে দিতে পারেন। আপনার মডিউলের build.gradle(.kts) ফাইলের শীর্ষ স্তরে টুলচেইনটি নির্দিষ্ট করুন।
জাভা টুলচেইন সংস্করণটি এইভাবে নির্দিষ্ট করুন:
কোটলিন
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
গ্রুভি
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
আপনার সোর্স কোড কোটলিন, জাভা বা উভয়ের মিশ্রণ হলেও এটি কাজ করবে।
টুলচেইন জেডিকে ভার্সনটি গ্রেডল চালানোর জন্য ব্যবহৃত জেডিকে-র মতোই হতে পারে, কিন্তু মনে রাখবেন যে এগুলোর উদ্দেশ্য ভিন্ন।
আমার জাভা সোর্স কোডে আমি জাভা ল্যাঙ্গুয়েজের কোন কোন সোর্স ফিচার ব্যবহার করতে পারি?
sourceCompatibility প্রপার্টিটি নির্ধারণ করে যে জাভা সোর্স কম্পাইল করার সময় কোন কোন জাভা ল্যাঙ্গুয়েজ ফিচার উপলব্ধ থাকবে। এটি কোটলিন সোর্সকে প্রভাবিত করে না।
আপনার মডিউলের build.gradle(.kts) ফাইলে sourceCompatibility নিম্নরূপে নির্দিষ্ট করুন:
কোটলিন
android {
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
}
}
গ্রুভি
android {
compileOptions {
sourceCompatibility JavaVersion.VERSION_17
}
}
নির্দিষ্ট করে না দেওয়া হলে, এই প্রপার্টিটি ডিফল্টভাবে জাভা টুলচেইন ভার্সন ব্যবহার করে। আপনি যদি কোনো জাভা টুলচেইন ব্যবহার না করেন, তাহলে এটি ডিফল্টভাবে অ্যান্ড্রয়েড গ্রেডল প্লাগইন দ্বারা নির্বাচিত একটি ভার্সন ব্যবহার করে (উদাহরণস্বরূপ, জাভা ৮ বা তার উচ্চতর সংস্করণ)।
আমার কোটলিন বা জাভা সোর্স কম্পাইল করার সময় কোন জাভা বাইনারি বৈশিষ্ট্যগুলো ব্যবহার করা যেতে পারে?
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'
}
}
নির্দিষ্ট করে না দেওয়া হলে, এই প্রোপার্টিগুলো ডিফল্টভাবে জাভা টুলচেইন ভার্সন অনুযায়ী সেট হয়ে যায়। আপনি যদি জাভা টুলচেইন ব্যবহার না করেন, তাহলে ডিফল্ট মানগুলো ভিন্ন হতে পারে এবং বিল্ডে সমস্যা সৃষ্টি করতে পারে। তাই, আমরা সুপারিশ করি যে আপনি সর্বদা এই মানগুলো স্পষ্টভাবে উল্লেখ করুন অথবা একটি জাভা টুলচেইন ব্যবহার করুন।