অ্যান্ড্রয়েড অ্যাপ্লিকেশনগুলি সাধারণত গ্রেডল বিল্ড সিস্টেম ব্যবহার করে তৈরি করা হয়। কীভাবে আপনার বিল্ড কনফিগার করবেন তার বিশদ বিবরণে ডুব দেওয়ার আগে, আমরা বিল্ডের পিছনের ধারণাগুলি অন্বেষণ করব যাতে আপনি সম্পূর্ণরূপে সিস্টেমটি দেখতে পারেন।
একটি বিল্ড কি?
একটি বিল্ড সিস্টেম আপনার সোর্স কোডকে একটি এক্সিকিউটেবল অ্যাপ্লিকেশনে রূপান্তরিত করে। আপনার অ্যাপ্লিকেশন বা লাইব্রেরি বিশ্লেষণ, কম্পাইল, লিঙ্ক এবং প্যাকেজ করার জন্য বিল্ডগুলিতে প্রায়শই একাধিক সরঞ্জাম জড়িত থাকে। গ্রেডল এই কমান্ডগুলি সংগঠিত এবং চালানোর জন্য একটি টাস্ক-ভিত্তিক পদ্ধতি ব্যবহার করে।
কার্যগুলি এমন কমান্ডগুলিকে এনক্যাপসুলেট করে যা তাদের ইনপুটগুলিকে আউটপুটে অনুবাদ করে৷ প্লাগইনগুলি কাজ এবং তাদের কনফিগারেশন সংজ্ঞায়িত করে। আপনার বিল্ডে একটি প্লাগইন প্রয়োগ করা তার কাজগুলিকে নিবন্ধিত করে, এবং তাদের ইনপুট এবং আউটপুটগুলি ব্যবহার করে সেগুলিকে একত্রিত করে।. উদাহরণস্বরূপ, আপনার বিল্ড ফাইলে অ্যান্ড্রয়েড গ্রেডল প্লাগইন (এজিপি) প্রয়োগ করা একটি APK বা একটি অ্যান্ড্রয়েড তৈরি করার জন্য প্রয়োজনীয় সমস্ত কাজ নিবন্ধন করবে লাইব্রেরি। java-library
প্লাগইন আপনাকে জাভা সোর্স কোড থেকে একটি জার তৈরি করতে দেয়। কোটলিন এবং অন্যান্য ভাষার জন্য অনুরূপ প্লাগইন বিদ্যমান, তবে অন্যান্য প্লাগইনগুলি প্লাগইনগুলিকে প্রসারিত করার জন্য। উদাহরণস্বরূপ, protobuf
প্লাগইনটি AGP বা java-library
এর মতো বিদ্যমান প্লাগইনগুলিতে প্রোটোবাফ সমর্থন যোগ করার জন্য বোঝানো হয়েছে।
গ্রেডল কনফিগারেশনের চেয়ে কনভেনশন পছন্দ করে তাই প্লাগইনগুলি বাক্সের বাইরে ভাল ডিফল্ট মান সহ আসবে, তবে আপনি একটি ঘোষণামূলক ডোমেন-স্পেসিফিক ল্যাঙ্গুয়েজ (DSL) এর মাধ্যমে বিল্ডটিকে আরও কনফিগার করতে পারেন। ডিএসএল ডিজাইন করা হয়েছে তাই আপনি কীভাবে এটি তৈরি করবেন তার পরিবর্তে কী তৈরি করবেন তা নির্দিষ্ট করতে পারেন। প্লাগইনগুলির যুক্তি "কিভাবে" পরিচালনা করে। সেই কনফিগারেশনটি আপনার প্রজেক্টে (এবং সাবপ্রজেক্ট) বিভিন্ন বিল্ড ফাইল জুড়ে নির্দিষ্ট করা আছে।
টাস্ক ইনপুটগুলি ফাইল এবং ডিরেক্টরির পাশাপাশি জাভা প্রকার (পূর্ণসংখ্যা, স্ট্রিং বা কাস্টম ক্লাস) হিসাবে এনকোড করা অন্যান্য তথ্য হতে পারে। আউটপুট শুধুমাত্র ডিরেক্টরি বা ফাইল হতে পারে কারণ সেগুলি ডিস্কে লিখতে হবে। একটি টাস্ক আউটপুটকে অন্য টাস্ক ইনপুটে ওয়্যারিং করে, টাস্কগুলিকে একসাথে লিঙ্ক করে যাতে একটিকে অন্যটির আগে চালাতে হয়।
যদিও Gradle আপনার বিল্ড ফাইলগুলিতে নির্বিচারে কোড এবং টাস্ক ডিক্লেয়ারেশন লেখার সমর্থন করে, এটি আপনার বিল্ড বোঝার জন্য এবং রক্ষণাবেক্ষণের জন্য টুলিংয়ের পক্ষে আরও কঠিন করে তুলতে পারে। উদাহরণস্বরূপ, আপনি প্লাগইনগুলির ভিতরে কোডের জন্য পরীক্ষা লিখতে পারেন কিন্তু বিল্ড ফাইলগুলিতে নয়। পরিবর্তে, আপনার বিল্ড লজিক এবং টাস্ক ডিক্লারেশনগুলি প্লাগইনগুলিতে সীমাবদ্ধ করা উচিত (যেটি আপনি বা অন্য কেউ সংজ্ঞায়িত করেছেন) এবং ঘোষণা করুন যে আপনি কীভাবে আপনার বিল্ড ফাইলগুলিতে সেই যুক্তিটি ব্যবহার করতে চান।
একটি Gradle বিল্ড রান যখন কি হবে?
গ্রেডল বিল্ডগুলি তিনটি পর্যায়ে চলে। এই পর্যায়গুলির প্রত্যেকটি কোডের বিভিন্ন অংশ কার্যকর করে যা আপনি আপনার বিল্ড ফাইলগুলিতে সংজ্ঞায়িত করেন।
- ইনিশিয়ালাইজেশন নির্ধারণ করে কোন প্রকল্প এবং সাবপ্রজেক্টগুলি বিল্ডে অন্তর্ভুক্ত করা হয়েছে এবং আপনার বিল্ড ফাইল এবং প্রয়োগকৃত প্লাগইন সমন্বিত ক্লাসপাথ সেট আপ করে। এই পর্বটি একটি সেটিংস ফাইলের উপর ফোকাস করে যেখানে আপনি নির্মাণের জন্য প্রকল্প ঘোষণা করেন এবং যে স্থানগুলি থেকে প্লাগইন এবং লাইব্রেরি আনতে হবে।
- কনফিগারেশন প্রতিটি প্রকল্পের জন্য কাজ নিবন্ধন করে, এবং ব্যবহারকারীর বিল্ড স্পেসিফিকেশন প্রয়োগ করতে বিল্ড ফাইল চালায়। এটি বোঝা গুরুত্বপূর্ণ যে আপনার কনফিগারেশন কোডটি কার্যকর করার সময় উত্পাদিত ডেটা বা ফাইলগুলিতে অ্যাক্সেস পাবে না৷
- এক্সিকিউশন আপনার আবেদনের প্রকৃত "বিল্ডিং" সম্পাদন করে। কনফিগারেশনের আউটপুট হল টাস্কগুলির একটি ডাইরেক্টেড অ্যাসাইক্লিক গ্রাফ (DAG) যা ব্যবহারকারীর দ্বারা অনুরোধ করা সমস্ত প্রয়োজনীয় বিল্ড পদক্ষেপগুলিকে প্রতিনিধিত্ব করে (কমান্ড লাইনে দেওয়া কাজগুলি বা বিল্ড ফাইলগুলিতে ডিফল্ট হিসাবে)। এই গ্রাফটি কার্যগুলির মধ্যে সম্পর্ককে প্রতিনিধিত্ব করে, হয় একটি টাস্কের ঘোষণায় স্পষ্ট, অথবা এর ইনপুট এবং আউটপুটগুলির উপর ভিত্তি করে৷ যদি একটি টাস্কের একটি ইনপুট থাকে যা অন্য টাস্কের আউটপুট, তবে এটি অবশ্যই অন্য টাস্কের পরে চালাতে হবে। এই পর্যায়টি গ্রাফে সংজ্ঞায়িত ক্রমে পুরানো কাজগুলি চালায়; যদি একটি টাস্কের ইনপুট শেষ সম্পাদনের পর থেকে পরিবর্তিত না হয়, Gradle এটি এড়িয়ে যাবে।
আরও তথ্যের জন্য গ্র্যাডল বিল্ড লাইফসাইকেল দেখুন।
কনফিগারেশন ডিএসএল
Gradle বিল্ড কনফিগার করার জন্য একটি ডোমেন-স্পেসিফিক ল্যাঙ্গুয়েজ (DSL) ব্যবহার করে। এই ঘোষণামূলক পদ্ধতি ধাপে ধাপে (অবশ্যকীয়) নির্দেশনা লেখার পরিবর্তে আপনার ডেটা নির্দিষ্ট করার উপর ফোকাস করে।
ডিএসএলগুলি প্রত্যেকের জন্য, ডোমেন বিশেষজ্ঞদের এবং প্রোগ্রামারদের জন্য একটি প্রকল্পে অবদান রাখা সহজ করার চেষ্টা করে, একটি ছোট ভাষা সংজ্ঞায়িত করে যা আরও প্রাকৃতিক উপায়ে ডেটা উপস্থাপন করে। গ্রেডল প্লাগইনগুলি তাদের কাজের জন্য প্রয়োজনীয় ডেটা কনফিগার করতে ডিএসএলকে প্রসারিত করতে পারে।
উদাহরণস্বরূপ, আপনার বিল্ডের অ্যান্ড্রয়েড অংশটি কনফিগার করা দেখতে এরকম হতে পারে:
কোটলিন
android { namespace = "com.example.app" compileSdk = 34 // ... defaultConfig { applicationId = "com.example.app" minSdk = 34 // ... } }
গ্রোভি
android { namespace 'com.example.myapplication' compileSdk 34 // ... defaultConfig { applicationId "com.example.myapplication" minSdk 24 // ... } }
পর্দার পিছনে, DSL কোড অনুরূপ:
fun Project.android(configure: ApplicationExtension.() -> Unit) {
...
}
interface ApplicationExtension {
var compileSdk: Int
var namespace: String?
val defaultConfig: DefaultConfig
fun defaultConfig(configure: DefaultConfig.() -> Unit) {
...
}
}
ডিএসএল-এর প্রতিটি ব্লক একটি ফাংশন দ্বারা উপস্থাপিত হয় যা এটিকে কনফিগার করতে একটি ল্যাম্বডা নেয় এবং এটি অ্যাক্সেস করতে একই নামের একটি সম্পত্তি। এটি আপনার বিল্ড ফাইলের কোডটিকে ডেটা স্পেসিফিকেশনের মতো মনে করে।
বাহ্যিক নির্ভরতা
মাভেন বিল্ড সিস্টেম একটি নির্ভরতা স্পেসিফিকেশন, স্টোরেজ এবং ম্যানেজমেন্ট সিস্টেম চালু করেছে। লাইব্রেরিগুলি রিপোজিটরিগুলিতে (সার্ভার বা ডিরেক্টরি) সংরক্ষণ করা হয়, মেটাডেটা সহ তাদের সংস্করণ এবং অন্যান্য লাইব্রেরির উপর নির্ভরতা। আপনি কোন রিপোজিটরিগুলি অনুসন্ধান করতে হবে তা নির্দিষ্ট করুন, আপনি যে নির্ভরতাগুলি ব্যবহার করতে চান তার সংস্করণগুলি এবং বিল্ড সিস্টেম বিল্ডের সময় সেগুলি ডাউনলোড করে।
মাভেন আর্টিফ্যাক্টগুলিকে গ্রুপের নাম (কোম্পানি, বিকাশকারী, ইত্যাদি), আর্টিফ্যাক্টের নাম (লাইব্রেরির নাম) এবং সেই আর্টিফ্যাক্টের সংস্করণ দ্বারা চিহ্নিত করা হয়। এটি সাধারণত group:artifact:version
হিসাবে উপস্থাপিত হয়।
এই পদ্ধতি উল্লেখযোগ্যভাবে বিল্ড ব্যবস্থাপনা উন্নত. আপনি প্রায়শই "ম্যাভেন রিপোজিটরি" নামক এই জাতীয় সংগ্রহস্থলগুলি শুনতে পাবেন, তবে এটি সমস্ত জিনিসপত্রগুলি প্যাকেজ করা এবং প্রকাশ করার উপায় সম্পর্কে। এই সংগ্রহস্থলগুলি এবং মেটাডেটাগুলি Gradle সহ বিভিন্ন বিল্ড সিস্টেমে পুনরায় ব্যবহার করা হয়েছে (এবং Gradle এই সংগ্রহস্থলগুলিতে প্রকাশ করতে পারে)। পাবলিক রিপোজিটরি সকলের জন্য শেয়ারিং ব্যবহার করার অনুমতি দেয় এবং কোম্পানির রিপোজিটরিগুলি অভ্যন্তরীণ নির্ভরতা রাখে।
আপনি আপনার প্রজেক্টকে সাবপ্রজেক্টে মডুলারাইজ করতে পারেন (এটি অ্যান্ড্রয়েড স্টুডিওতে "মডিউল" নামেও পরিচিত), যা নির্ভরতা হিসাবেও ব্যবহার করা যেতে পারে। প্রতিটি সাবপ্রজেক্ট আউটপুট তৈরি করে (যেমন জার) যা সাবপ্রজেক্ট বা আপনার শীর্ষ-স্তরের প্রকল্প দ্বারা গ্রাস করা যেতে পারে। এটি কোন অংশগুলিকে পুনর্নির্মাণ করতে হবে তা আলাদা করে বিল্ড টাইম উন্নত করতে পারে, সেইসাথে অ্যাপ্লিকেশনে আরও ভাল আলাদা দায়িত্বগুলি।
বিল্ড নির্ভরতা যোগ করুন -এ নির্ভরতাগুলি কীভাবে নির্দিষ্ট করা যায় সে সম্পর্কে আমরা আরও বিশদে যাব।
ভেরিয়েন্ট তৈরি করুন
আপনি যখন একটি অ্যান্ড্রয়েড অ্যাপ্লিকেশন তৈরি করেন, আপনি সাধারণত একাধিক ভেরিয়েন্ট তৈরি করতে চাইবেন। ভেরিয়েন্টে বিভিন্ন কোড থাকে বা বিভিন্ন বিকল্প দিয়ে তৈরি করা হয় এবং বিল্ডের ধরন এবং পণ্যের স্বাদের সমন্বয়ে গঠিত।
বিল্ডের প্রকারগুলি ঘোষিত বিল্ড বিকল্পগুলি পরিবর্তিত হয়। ডিফল্টরূপে, এজিপি "রিলিজ" এবং "ডিবাগ" বিল্ড প্রকার সেট আপ করে, তবে আপনি সেগুলি সামঞ্জস্য করতে এবং আরও যোগ করতে পারেন (সম্ভবত স্টেজিং বা অভ্যন্তরীণ পরীক্ষার জন্য)।
একটি ডিবাগ বিল্ড আপনার অ্যাপ্লিকেশানকে ছোট করে না বা অস্পষ্ট করে না, এটির বিল্ডকে দ্রুত করে এবং সমস্ত চিহ্নকে যেমন আছে তেমন সংরক্ষণ করে। এটি অ্যাপ্লিকেশানটিকে "ডিবাগযোগ্য" হিসাবে চিহ্নিত করে, এটি একটি জেনেরিক ডিবাগ কী দিয়ে স্বাক্ষর করে এবং ডিভাইসে ইনস্টল করা অ্যাপ্লিকেশন ফাইলগুলিতে অ্যাক্সেস সক্ষম করে৷ এটি অ্যাপ্লিকেশন চালানোর সময় ফাইল এবং ডাটাবেসে সংরক্ষিত ডেটা অন্বেষণ করা সম্ভব করে তোলে।
একটি রিলিজ বিল্ড অ্যাপ্লিকেশনটিকে অপ্টিমাইজ করে, আপনার রিলিজ কী দিয়ে স্বাক্ষর করে এবং ইনস্টল করা অ্যাপ্লিকেশন ফাইলগুলিকে সুরক্ষিত করে।
পণ্যের স্বাদ ব্যবহার করে, আপনি অ্যাপ্লিকেশনটির জন্য অন্তর্ভুক্ত উৎস এবং নির্ভরতা বৈকল্পিক পরিবর্তন করতে পারেন। উদাহরণস্বরূপ, আপনি আপনার অ্যাপ্লিকেশনের জন্য "ডেমো" এবং "সম্পূর্ণ" স্বাদ তৈরি করতে চাইতে পারেন, অথবা সম্ভবত "ফ্রি" এবং "পেইড" স্বাদগুলি তৈরি করতে চাইতে পারেন। আপনি একটি "প্রধান" উত্স সেট ডিরেক্টরিতে আপনার সাধারণ উত্সটি লিখুন এবং স্বাদের নামে নামকরণ করা একটি উত্স সেটে উত্সকে ওভাররাইড করুন বা যোগ করুন৷
এজিপি বিল্ড টাইপ এবং পণ্যের স্বাদের প্রতিটি সংমিশ্রণের জন্য বৈকল্পিক তৈরি করে। আপনি যদি স্বাদগুলিকে সংজ্ঞায়িত না করেন তবে রূপগুলি বিল্ড প্রকারের নামে নামকরণ করা হয়। যদি আপনি উভয়কে সংজ্ঞায়িত করেন, তাহলে বৈকল্পিকটির নাম <flavor><Buildtype>
। উদাহরণস্বরূপ, বিল্ড টাইপ release
এবং debug
, এবং ফ্লেভার demo
এবং full
সহ, AGP ভেরিয়েন্ট তৈরি করবে:
-
demoRelease
-
demoDebug
-
fullRelease
-
fullDebug
পরবর্তী পদক্ষেপ
এখন আপনি বিল্ড ধারণাগুলি দেখেছেন, আপনার প্রকল্পে অ্যান্ড্রয়েড বিল্ড কাঠামোটি একবার দেখুন।