বিল্ড ডিপেন্ডেন্সি হল এক্সটার্নাল কম্পোনেন্ট যা আপনার প্রোজেক্ট সফলভাবে বিল্ড করার জন্য প্রয়োজন। একটি বিল্ড লাইব্রেরি, প্লাগ-ইন, সাবপ্রোজেক্ট, Android SDK, Kotlin ও Java কম্পাইলারের মতো টুলিং, Android Studio-এর মতো ডেভেলপমেন্ট এনভায়রনমেন্ট এবং Gradle-এর উপর নির্ভর করতে পারে।
প্রতিটি ডিপেন্ডেন্সির জন্য অন্যান্য ডিপেন্ডেন্সি প্রয়োজন হতে পারে। আমরা এগুলিকে ট্রানজিটিভ ডিপেন্ডেন্সি বলি এবং আপনার অ্যাপ্লিকেশনের ব্যবহার করা সামগ্রিক ডিপেন্ডেন্সি দ্রুত বাড়াতে পারি। আপনি যখন কোনও ডিপেন্ডেন্সি আপগ্রেড করতে চান, সেটি লাইব্রেরি, টুল বা Android SDK যাই হোক না কেন, সেই আপগ্রেড ক্যাসকেড করতে পারে, আরও অনেক ডিপেন্ডেন্সি আপগ্রেড করতে পারে।
প্রায়ই, এর ফলে কোনও সমস্যা হয় না, কারণ অনেক লাইব্রেরি সিম্যান্টিক ভার্সনিং নামে পরিচিত একটি স্কিম অনুসরণ করে। এইসব লাইব্রেরি, তাদের পুরনো ভার্সনের সাথে মানানসই করার জন্য পরিবর্তনের ধরন সীমাবদ্ধ করে।
সেম্যান্টিক ভার্সনিং major.minor.patch ফর্ম্যাট অনুসরণ করে। যেমন, ভার্সন নম্বর 4.8.3-এ, 4 হল major ভার্সন, 8 হল minor ভার্সন এবং 3
হল patch নম্বর। major অংশটি পরিবর্তন হলে, লাইব্রেরিতে API বা আচরণে
ব্রেকিং পরিবর্তন হতে পারে। এটি আপনার বিল্ড বা অ্যাপ্লিকেশনের আচরণকে প্রভাবিত করতে পারে।
minor (নতুন ফিচার) বা patch (ত্রুটি সমাধান) অংশ পরিবর্তন হলে, লাইব্রেরি ডেভেলপাররা
আপনাকে জানান যে লাইব্রেরি এখনও মানানসই এবং আপনার অ্যাপ্লিকেশনে
প্রভাব ফেলবে না।
আপনার বিল্ডে সম্পর্ক
Android বিল্ডে নিম্নলিখিতগুলির মধ্যে সম্পর্ক থাকে:
- সোর্স কোড - যে কোড ও রিসোর্স আপনি নিয়ন্ত্রণ করেন
- লাইব্রেরি ডিপেন্ডেন্সি - এক্সটার্নাল লাইব্রেরি বা মডিউল যা আপনার প্রোজেক্ট এবং সাবপ্রোজেক্টে বিল্ড করার সময় অন্তর্ভুক্ত থাকে
- টুল - কম্পাইলার, প্লাগ-ইন এবং SDK যা আপনার সোর্সকে অ্যাপ্লিকেশন বা লাইব্রেরিতে অনুবাদ করে
সোর্স কোড
আপনার সোর্স কোড হল Kotlin বা Java কোড যা আপনি নিজের অ্যাপ্লিকেশন বা লাইব্রেরিতে লেখেন। (C++ ব্যবহার করার ব্যাপারে বিস্তারিত জানতে, Android NDK দেখুন।)
সোর্স কোড লাইব্রেরি (Kotlin ও Java রানটাইম লাইব্রেরি সহ) এবং Android SDK-এর উপর নির্ভর করে এবং এর জন্য সংশ্লিষ্ট Kotlin বা Java কম্পাইলার প্রয়োজন।
কিছু সোর্স কোডে অ্যানোটেশন থাকে যার জন্য অতিরিক্ত প্রসেসিং প্রয়োজন হয়। যেমন,
আপনি Jetpack Compose কোড লেখার সময় @Composable-এর মতো অ্যানোটেশন যোগ করেন যা Compose Kotlin কম্পাইলার
প্লাগ-ইন দ্বারা প্রসেস করা প্রয়োজন। অন্যান্য অ্যানোটেশন Kotlin Symbol
Processor (KSP) বা আলাদা অ্যানোটেশন-প্রসেসিং টুল দ্বারা প্রসেস করা হতে পারে।
লাইব্রেরি ডিপেন্ডেন্সি
আপনার অ্যাপ্লিকেশনের অংশ হিসেবে লাইব্রেরিতে বাইটকোড থাকে। এটি Java JAR, Android লাইব্রেরি (AAR) বা আপনার বিল্ডের সাবপ্রোজেক্ট হতে পারে। অনেক লাইব্রেরি সিম্যান্টিক ভার্সনিং অনুসরণ করে, যা আপনাকে আপগ্রেড করার সময় সেগুলি মানানসই (বা না) থাকে কিনা তা বুঝতে সাহায্য করতে পারে।
লাইব্রেরির প্রায়ই অন্যান্য লাইব্রেরির উপর ট্রানজিটিভ ডিপেন্ডেন্সি থাকে। এটি আপনাকে স্পষ্টভাবে যা ম্যানেজ করতে হবে তা কমিয়ে দেয়; আপনি সরাসরি নির্ভরতা নির্দিষ্ট করেন এবং Gradle ট্রানজিটিভের সাথে সেগুলি টেনে আনে। ডাইরেক্ট ডিপেন্ডেন্সি আপগ্রেড করলে, ট্রানজিটিভ ডিপেন্ডেন্সিও আপগ্রেড হতে পারে।
কখনও কখনও কোনও লাইব্রেরির রানটাইম (minSdk) বা কম্পাইল টাইমে (compileSdk) Android SDK-এর ন্যূনতম ভার্সন প্রয়োজন হতে পারে।
এটি তখনই প্রয়োজন হয় যখন কোনও লাইব্রেরি Android SDK বা তার প্রদান করা JDK API-তে অন্তর্ভুক্ত ফাংশন ব্যবহার করে। আপনার
অ্যাপ্লিকেশনের কার্যকর minSdk হল আপনার অ্যাপ্লিকেশন এবং এর সমস্ত ডাইরেক্ট ও ট্রানজিটিভ লাইব্রেরি ডিপেন্ডেন্সি দ্বারা অনুরোধ করা সর্বোচ্চ minSdk।
কিছু লাইব্রেরি ব্যবহার করার জন্য নির্দিষ্ট Gradle প্লাগ-ইন ব্যবহার করতে হতে পারে। এই সহায়ক প্লাগ-ইনগুলি প্রায়শই Kotlin সিম্বল প্রসেসর বা অন্যান্য অ্যানোটেশন প্রসেসর ইনস্টল করে যা কোড জেনারেট করে বা আপনার সোর্সের কম্পাইলেশন পরিবর্তন করে যাতে আপনি লাইব্রেরি ফিচার ব্যবহার করতে পারেন। যেমন, Jetpack Room-এ অ্যানোটেশন এবং একটি KSP থাকে যা ডেটাবেসে ডেটা ফিরিয়ে আনতে এবং পরিবর্তন করতে সেগুলিকে জেনারেট করা কোডে রূপান্তরিত করে। Jetpack Compose-এর জন্য Compose কম্পাইলার প্লাগ-ইন প্রয়োজন যাতে অ্যানোটেট করা ফাংশন পরিবর্তন করে সেই ফাংশন কীভাবে এবং কখন আবার রান করবে তা ম্যানেজ করা যায়।
টুল
Gradle |
Gradle হল বিল্ড টুল যা আপনার বিল্ড ফাইল পড়ে এবং আপনার অ্যাপ্লিকেশন বা লাইব্রেরি তৈরি করে এবং প্লাগ-ইনের জন্য একটি API প্রকাশ করে যাতে এর ক্ষমতা বাড়ানো যায়। Gradle এক বা একাধিক Java ভার্চুয়াল মেশিনে একাধিক প্রসেস রান করে এবং এর Java প্লাগ-ইন JDK-এর মধ্যে Java টুলিং কল করে। |
Gradle প্লাগ-ইন |
Gradle প্লাগ-ইন নতুন টাস্ক ও কনফিগারেশন নির্ধারণ করে Gradle-এর ক্ষমতা বাড়ায়। আপনার বিল্ডে প্লাগ-ইন প্রয়োগ করলে নির্দিষ্ট বিল্ড ক্ষমতা চালু হয়, যা আপনার বিল্ড স্ক্রিপ্টে ডেটা হিসেবে কনফিগার করা থাকে। Android বিল্ডের জন্য, সবচেয়ে গুরুত্বপূর্ণ Gradle প্লাগ-ইন হল Android Gradle প্লাগ-ইন (AGP)। |
কম্পাইলার |
Kotlin বা Java কম্পাইলার আপনার সোর্স কোডকে এক্সিকিউটেবল বাইটকোডে রূপান্তরিত করে। Kotlin কম্পাইলার একটি প্লাগ-ইন API প্রকাশ করে যা পার্স করা কোড স্ট্রাকচার অ্যাক্সেস করে সরাসরি কম্পাইলারের মধ্যে এক্সটার্নাল বিশ্লেষণ এবং কোড জেনারেশন রান করতে সক্ষম করে। |
কম্পাইলার প্লাগ-ইন |
Kotlin কম্পাইলার আপনার কোড বিশ্লেষণ করার সময়, কম্পাইলার প্লাগ-ইন Kotlin কম্পাইলারের মধ্যে বিশ্লেষণ ও কোড জেনারেশন করে এবং আপনি যখন বিল্ডে তাদের Gradle প্লাগ-ইন প্রয়োগ করেন তখন ইনস্টল করা হয়। |
Android SDK |
Android SDK-তে Android-এর নির্দিষ্ট ভার্সনের জন্য Android প্ল্যাটফর্ম ও Java API এবং এর সাথে সম্পর্কিত টুল থাকে। এইসব টুল আপনাকে SDK ম্যানেজ করতে, আপনার অ্যাপ্লিকেশন তৈরি করতে এবং Android ডিভাইসের সাথে যোগাযোগ ও এমুলেট করতে সাহায্য করে। Android SDK-এর প্রতিটি ভার্সন নির্দিষ্ট Java API প্রদান করে যা আপনার সোর্স কোড অ্যাক্সেস করতে পারে এবং Android-এর আগের ভার্সনে সেইসব API ব্যবহার করার জন্য ডিসুগারিং সংক্রান্ত সহায়তা প্রদান করে। |
JDK |
Java ডেভেলপমেন্ট কিট, যাতে Java সোর্স কম্পাইল ও Java অ্যাপ্লিকেশন চালানোর জন্য Java লাইব্রেরি ও এক্সিকিউটেবল থাকে। Android বিল্ডে একাধিক JDK কাজ করে। আরও তথ্যের জন্য Android বিল্ডে Java ভার্সন দেখুন। |
Gradle স্কোপ
Gradle বিভিন্ন স্কোপে (Gradle API-তে কনফিগারেশন বলা হয়) লাইব্রেরি ডিপেন্ডেন্সি গ্রুপ করে, যা আপনাকে আপনার বিল্ডের বিভিন্ন অংশে ব্যবহার করার জন্য লাইব্রেরি ডিপেন্ডেন্সির বিভিন্ন সেট নির্দিষ্ট করার অনুমতি দেয়। যেমন, আপনি হয়ত JUnit-এর মতো টেস্ট লাইব্রেরি আপনার প্রকাশিত অ্যাপ্লিকেশন বা লাইব্রেরিতে অন্তর্ভুক্ত করতে চান না, কিন্তু আপনার ইউনিট টেস্ট তৈরি ও এক্সিকিউট করার সময় সেগুলি চান। এছাড়াও, আপনার কোড বিশ্লেষণ করার জন্য সিম্বল বা অ্যানোটেশন প্রসেসর যোগ করতে আপনি স্কোপ ব্যবহার করেন।
যেমন, AGP implementation এবং api স্কোপ নির্ধারণ করে, আপনার সাবপ্রজেক্টের ব্যবহারকারীদের কাছে কোনও ডিপেন্ডেন্সি প্রকাশ করা উচিত কিনা তা নির্দিষ্ট করার আপনার উপায়।
Android বিল্ডে ব্যবহৃত এই এবং অন্যান্য স্কোপের বিবরণের জন্য ডিপেন্ডেন্সি কনফিগার করুন দেখুন।
আপনার বিল্ড ফাইলের dependencies ব্লকে লাইব্রেরি ডিপেন্ডেন্সি যোগ করুন, হয়
group:artifact:version স্ট্রিং হিসেবে:
Kotlin
// In a module-level build script // explicit dependency strings ("group:artifact:version") dependencies { implementation("com.example:library1:1.2.3") api("com.example:library2:1.1.1") }
গ্ৰুভি
// In a module-level build script // explicit dependency strings ("group:artifact:version") dependencies { implementation 'com.example:library1:1.2.3' api 'com.example:library2:1.1.1' }
অথবা ভার্সন ক্যাটালগ-এ:
# Version catalog - gradle/libs.versions.toml
[versions]
exampleLib = "1.2.3"
examplePlugin = "2.3.4"
[libraries]
example-library = { group = "com.example", name = "library", version.ref = "exampleLib" }
[plugins]
example-plugin = { id = "com.example.plugin", version.ref = "examplePlugin" }
এবং আপনার বিল্ড ফাইলে জেনারেট করা ভেরিয়েবল নির্দিষ্ট করুন:
Kotlin
// In a module-level build script // Using a version catalog plugins { alias(libs.plugins.example.plugin) } dependencies { implementation(libs.example.library) }
গ্ৰুভি
// In a module-level build script // Using a version catalog plugins { alias(libs.plugins.example.plugin) } dependencies { implementation libs.example.library }