অ্যান্ড্রয়েড গ্র্যাডল প্লাগইন (AGP) হলো অ্যান্ড্রয়েড অ্যাপ্লিকেশনগুলির জন্য সমর্থিত বিল্ড সিস্টেম। এটি বিভিন্ন ধরণের সোর্স কম্পাইল করার এবং সেগুলিকে একত্রিত করে একটি অ্যাপ্লিকেশন তৈরি করার সুবিধা দেয়, যা আপনি একটি বাস্তব অ্যান্ড্রয়েড ডিভাইস বা এমুলেটরে চালাতে পারেন।
নিম্নলিখিত বিভাগে AGP-এর DSL এবং API-এর পরিকল্পিত বিবর্তন বর্ণনা করা হয়েছে। স্থিতিশীল রিলিজগুলিতে নতুন API চালু হওয়ার সাথে সাথে, পুরানো API-গুলিকে অপ্রচলিত (deprecated) হিসাবে চিহ্নিত করা হবে। সেই অপ্রচলিত API-গুলি পরবর্তী স্থিতিশীল রিলিজে অনুপলব্ধ হয়ে যাবে। নিম্নলিখিত বিভাগগুলিতে প্রতিটি প্রধান AGP রিলিজে আসন্ন পরিবর্তনগুলি সম্পর্কে তথ্য প্রদান করা হয়েছে।
AGP API-এর বাতিল বা অপসারণের আরও বিস্তারিত তালিকার জন্য, AGP API আপডেটগুলি দেখুন।
এজিপি ১০.০ (২০২৬ সালের শেষের দিকে)
অ্যান্ড্রয়েড গ্রেডল প্লাগইন ১০.০ এপিআই-এর পরিবর্তন ও আধুনিকীকরণ
AGP 10.0 একটি সম্পূর্ণ লেজি, কনফিগারেশন-ক্যাশ-উপযোগী বিল্ড মডেলে রূপান্তর সম্পন্ন করেছে। পুরোনো, নন-লেজি এপিআইগুলোকে একটি নিরাপদ ও অধিক কর্মক্ষম আর্কিটেকচার দিয়ে প্রতিস্থাপন করার বহু বছরের প্রচেষ্টার চূড়ান্ত ফল হলো এই রিলিজটি।
কেন একটি লেজি বিল্ড মডেল?
লিগ্যাসি, নন-লেজি বিল্ড মডেলে, গ্রেডল প্রতিটি সিঙ্ক বা বিল্ড ইনভোকেশনের সময় প্রোজেক্টের সমস্ত মডিউল জুড়ে অবজেক্টগুলোকে ইগারলি ইভ্যালুয়েট করে, ভ্যারিয়েন্ট ডেটা কোয়েরি করে এবং টাস্ক কনফিগার করে। এই ইগার ইভ্যালুয়েশন এমন সব ভ্যারিয়েন্ট ও টাস্কের পেছনে সিপিইউ-এর সময় ও মেমরি নষ্ট করে যেগুলো চলছে না, এবং জটিল বিল্ড স্ক্রিপ্টগুলোর মধ্যে ইভ্যালুয়েশনের ক্রম নিয়ে দ্বন্দ্ব সৃষ্টি করে।
লেজি প্রোভাইডার ( Provider<T> ) এবং আধুনিক ভ্যারিয়েন্ট এপিআই ( androidComponents {} ) ব্যবহার করে সম্পূর্ণ লেজি বিল্ড মডেলে স্থানান্তরের ফলে, প্রোপার্টি এবং টাস্ক ওয়্যারিং শুধুমাত্র সক্রিয় বিল্ড এক্সিকিউশন গ্রাফের প্রয়োজনের সময় লেজিভাবে গণনা করা হয়।
এই রিলিজে যে লিগ্যাসি এপিআইগুলো সরানো হচ্ছে, সেগুলো এই আধুনিক আর্কিটেকচারের সাথে মৌলিকভাবে বেমানান ছিল। এগুলো সরিয়ে ফেলার ফলে AGP এখন গ্রেডল কনফিগারেশন ক্যাশে এবং প্রজেক্ট আইসোলেশনকে সম্পূর্ণরূপে সমর্থন করতে পারে, যা অ্যান্ড্রয়েড স্টুডিওতে বিল্ডের গতি এবং সিঙ্কের সময়কে ব্যাপকভাবে উন্নত করে।
মূল স্থাপত্যগত পার্থক্য
পুরানো BaseVariant API ( applicationVariants.all {} ) ছিল ইগার এবং টাস্ক-কেন্দ্রিক। এটি ডেভেলপারদের কনফিগারেশন পর্যায়ে গ্রেডল টাস্ক এবং অভ্যন্তরীণ কনফিগারেশনে সরাসরি অ্যাক্সেস দিত, যা স্বাভাবিকভাবেই আধুনিক গ্রেডলের পারফরম্যান্স বৈশিষ্ট্যগুলোকে ব্যাহত করে।
নতুন ভ্যারিয়েন্ট এপিআই ( androidComponents {} ) লেজি এবং আর্টিফ্যাক্ট-কেন্দ্রিক। এটি ব্যাপকভাবে গ্রেডলের প্রপার্টি এপিআই ব্যবহার করে এবং Task ও TaskProvider এর সমস্ত রেফারেন্স সম্পূর্ণরূপে সরিয়ে দেয়, যার ফলে আপনাকে অন্তর্নিহিত টাস্কগুলোর পরিবর্তে ইনপুট এবং আউটপুট ( Variant.artifacts )-এর সাথে পরিচ্ছন্নভাবে ইন্টারঅ্যাক্ট করতে হয়।
কী সরানো এবং প্রতিস্থাপন করা হচ্ছে
লিগ্যাসি ডিএসএল এবং পুরোনো ভ্যারিয়েন্ট এপিআই-তে ব্যবহৃত পূর্ববর্তী সমস্ত ইন্টারফেস ও ক্লাস মুছে ফেলা হয়েছে। আপনার বিল্ড স্ক্রিপ্ট এবং কাস্টম প্লাগইন প্রস্তুত করার জন্য, নিম্নলিখিত মেয়াদোত্তীর্ণ এপিআই এবং ফ্ল্যাগগুলো থেকে সরে আসুন:
| অপসারণ করা এপিআই বা বৈশিষ্ট্য | প্রতিস্থাপন বা পদক্ষেপ প্রয়োজন |
|---|---|
সরাসরি টাস্ক অ্যাক্সেস:
| আর্টিফ্যাক্টস এপিআই: টাস্কের আচরণ পরিবর্তন করার জন্য সরাসরি টাস্ক ফেচ করার পরিবর্তে, টাস্কগুলোর মধ্যে আদান-প্রদান হওয়া আসল ফাইল (আর্টিফ্যাক্টস) যুক্ত করতে, পরিবর্তন করতে বা প্রতিস্থাপন করতে variant.artifacts ব্যবহার করুন। |
আগ্রহী উৎস নিবন্ধন:
| সোর্সেস এপিআই: variant.sources.java.addGeneratedSourceDirectory(...) ব্যবহার করে আপনার কাস্টম টাস্কের আউটপুট ডিরেক্টরি সংযুক্ত করুন। |
ক্লাসপাথ / কনফিগারেশন অ্যাক্সেস:
| ইন্সট্রুমেন্টেশন এপিআই: বাইটকোড পরিবর্তন বা পরিদর্শন করতে (ক্লাসপাথ অ্যাক্সেসের সবচেয়ে সাধারণ ব্যবহার), AsmClassVisitorFactory ব্যবহার করে variant.instrumentation.transformClassesWith(...) ব্যবহার করুন। |
ইগার প্রপার্টি মিউটেশন:
| লেজি `MapProperty` ইনস্ট্যান্সের জন্য variant.buildConfigFields.put(...) এবং variant.manifestPlaceholders.put(...) ব্যবহার করুন। |
অপ্ট-আউট ফ্ল্যাগ:
| এর কোনো সরাসরি বিকল্প নেই। gradle.properties থেকে এই ফ্ল্যাগগুলো সরিয়ে ফেলুন; আধুনিক DSL এবং বিল্ট-ইন কোটলিন কঠোরভাবে অনুসরণ করা হয়। |
লিগ্যাসি ভ্যারিয়েন্ট এপিআই এক্সটেনশন:
| androidComponents.onVariants() দিয়ে প্রতিস্থাপন করুন। |
ভ্যারিয়েন্ট ফিল্টারিং ( variantFilter ব্লক) | ভ্যারিয়েন্ট সিলেক্টর ব্যবহার করে androidComponents.beforeVariants() দিয়ে প্রতিস্থাপন করুন। |
SDK এবং NDK উপাদানসমূহ:
| androidComponents.sdkComponents ব্যবহার করে SDK কম্পোনেন্টগুলো অ্যাক্সেস করুন। |
পরীক্ষার পরিবেশ:
| কাস্টম টেস্ট ডিভাইস রেজিস্ট্রেশনকে গ্রেডল-পরিচালিত ডিভাইসে স্থানান্তর করুন। |
অপ্রচলিত নিবন্ধন এপিআই:
| সরাসরি প্রতিস্থাপন ছাড়াই মুছে ফেলা হয়েছে। |
| এপিআই রূপান্তর করুন | Transform-গুলোকে Artifacts API এবং AsmClassVisitorFactory দিয়ে প্রতিস্থাপন করুন। |
সমস্ত রিপ্লেসমেন্ট ডিএসএল এবং ভ্যারিয়েন্ট এপিআই ( androidComponents {} ) ইন্টারফেস ও ক্লাস অ্যাক্সেস করার জন্য, কাস্টম গ্রেডল প্লাগইন বা বিল্ড লজিক ডেভেলপ করার সময় সর্বদা gradle-api আর্টিফ্যাক্টটি ব্যবহার করুন।
অভিবাসনের পদক্ষেপ
আপনার AGP 10.0-এ আপগ্রেডকে নির্বিঘ্ন ও অনুমানযোগ্য করতে, এই মাইগ্রেশন পদ্ধতিগুলো অনুসরণ করুন:
- AGP আপগ্রেড অ্যাসিস্ট্যান্ট চালান: সরাসরি 10.0-এ আপগ্রেড করার আগে, Android Studio-তে অফিসিয়াল AGP আপগ্রেড অ্যাসিস্ট্যান্টটি চালান (
Tools > AGP Upgrade Assistant)। এটি বেশ কিছু সাধারণ DSL এবং বিল্ড স্ক্রিপ্ট মাইগ্রেশন স্বয়ংক্রিয় করে এবং বিদ্যমান বিল্ড আচরণ বজায় রাখতে সাহায্য করে। - অ্যান্ড্রয়েড স্টুডিওতে এজেন্ট মোড স্কিল ব্যবহার করুন: অ্যান্ড্রয়েড স্টুডিওর ভিতরে জটিল বিল্ড লজিক এবং ডিএসএল (DSL) মাইগ্রেট করার প্রক্রিয়াকে স্বয়ংক্রিয় ও সহজ করতে এআই আপগ্রেড স্কিল (যেমন অ্যান্ড্রয়েড স্কিলস রিপোজিটরিতে উপলব্ধ এজিপি আপগ্রেড স্কিল) ব্যবহার করুন।
- প্রথমে AGP 9.x-এর ডেপ্রিকেশন ওয়ার্নিংগুলো ঠিক করুন: আপনার প্রজেক্টটি সর্বশেষ AGP 9.x রিলিজে আপগ্রেড করুন এবং বিদ্যমান সমস্ত ডেপ্রিকেশন ওয়ার্নিং সমাধান করুন। একবার আপনার প্রজেক্টটি
android.newDsl=falseবাandroid.builtInKotlin=falseএর উপর নির্ভর না করে এবং ওয়ার্নিং ছাড়াই 9.x-এ কাজ করা শুরু করলে, 10.0-এ যাওয়াটা একটি মসৃণ রূপান্তর হবে। - তৃতীয়-পক্ষের গ্রেডল প্লাগইন নিরীক্ষা করুন: নিশ্চিত করুন যে তৃতীয়-পক্ষের প্লাগইনগুলি AGP 10.0 সামঞ্জস্যপূর্ণ সংস্করণে আপগ্রেড করা হয়েছে। যে প্লাগইনগুলি এখনও পুরোনো এক্সটেনশন টাইপের উপর নির্ভর করে
ClassCastException: ... cannot be cast to class BaseExtensionএর মতো বিল্ড ব্যর্থতার কারণ হবে। - অফিসিয়াল মাইগ্রেশন রেসিপি ব্যবহার করুন: জটিল, বাস্তব মাইগ্রেশন উদাহরণ এবং পাশাপাশি তুলনার জন্য, অফিসিয়াল gradle-recipes গিটহাব রিপোজিটরি দেখুন।
এখানে একটি আগে ও পরের তুলনা দেখানো হলো, যেখানে দেখানো হয়েছে কিভাবে androidComponents {} ব্যবহার করে লিগ্যাসি ভ্যারিয়েন্টগুলোকে ইগারলি কোয়েরি করা থেকে লেজিলি কনফিগার করার পদ্ধতিতে মাইগ্রেট করতে হয়:
পূর্বে: লিগ্যাসি ভ্যারিয়েন্ট এপিআই (এজিপি ১০.০-এ অপসারণ করা হয়েছে)
// Eager evaluation using the legacy Variant API
android {
applicationVariants.all { variant ->
if (variant.buildType.name == "release") {
// Eagerly queries and modifies properties during evaluation
}
}
}
পরে: আধুনিক ভ্যারিয়েন্ট এপিআই ( androidComponents {} )
// Lazy, Configuration Cache compatible Variant API
androidComponents {
onVariants(selector().withBuildType("release")) { variant ->
// Safely and lazily configures properties
}
}
AGP 9.x-এ AGP 10.0-এর আচরণ কীভাবে পরীক্ষা করবেন
এর বিল্ড আচরণ পরীক্ষা করা এবং সামঞ্জস্যতা যাচাই করা শুরু করার জন্য আপনাকে AGP 10.0 রিলিজের জন্য অপেক্ষা করতে হবে না। যেকোনো AGP 9.x রিলিজে চালানোর সময়, আপনি আপনার gradle.properties যেকোনো অপ্ট-আউট নিষ্ক্রিয় করে এবং নিম্নলিখিত কঠোর আচরণ ফ্ল্যাগগুলি সেট করে AGP 10.0-এর আচরণ স্পষ্টভাবে প্রয়োগ করতে পারেন:
# Enforce modern DSL and Variant API interfaces exclusively
android.newDsl=true
# Enforce built-in Kotlin support without optional opt-out
android.builtInKotlin=true
android.newDsl=true এবং android.builtInKotlin=true প্রয়োগ করার মাধ্যমে, আপনি যাচাই করতে পারেন যে আপনার কাস্টম বিল্ড লজিক এবং থার্ড-পার্টি প্লাগইনগুলি AGP 10.0-এর কঠোর API প্রয়োজনীয়তার সাথে সম্পূর্ণরূপে সামঞ্জস্যপূর্ণ।
মাইগ্রেশনের সময় নির্বাচিত উপ-প্রকল্প থেকে অপ্ট-আউট
আপনি যদি আধুনিক আচরণ পরীক্ষা করার জন্য আপনার প্রোজেক্ট জুড়ে android.newDsl=true বিশ্বব্যাপী সক্রিয় করতে চান, কিন্তু নির্দিষ্ট সাব-প্রোজেক্ট মাইগ্রেট করার জন্য আরও সময়ের প্রয়োজন হয়, তাহলে আপনি AGP 9.4.0-alpha04 থেকে শুরু করে স্বতন্ত্র মডিউলগুলিকে বেছে বেছে অপ্ট-আউট করতে পারেন। প্রোজেক্ট পাথ উল্লেখ করে gradle.properties এ android.newDsl.optOut যোগ করুন:
# Enable modern DSL globally across the build
android.newDsl=true
# Selectively opt out specific sub-projects that still require legacy DSL APIs
android.newDsl.optOut=:lib
প্রতি মডিউলে নির্বাচিত বিল্ট-ইন কোটলিন নিষ্ক্রিয়করণ
আপনি যদি আপনার প্রোজেক্ট জুড়ে বিল্ট-ইন কোটলিন বিশ্বব্যাপী সক্রিয় করতে চান ( android.builtInKotlin=true ), কিন্তু kotlin-android থেকে নির্দিষ্ট সাব-প্রোজেক্ট (অথবা কোটলিন কোডবিহীন মডিউল) সরিয়ে নিতে আরও সময় প্রয়োজন হয়, তাহলে প্রোজেক্ট লেভেলের পরিবর্তে DSL লেভেলে সেই মডিউলগুলি কনফিগার করুন। মডিউলের বিল্ড ফাইলের ভিতরে enableKotlin = false সেট করুন:
android {
enableKotlin = false
}
প্রতিক্রিয়া এবং ত্রুটি জানানোর কর্মপ্রবাহ
আমরা নিশ্চিত করতে চাই যে নতুন ভ্যারিয়েন্ট এপিআই আপনার প্রয়োজনীয় ব্যবহারের ক্ষেত্রগুলোকে সমর্থন করে। পুরোনো এপিআই থেকে সরে আসার ক্ষেত্রে যদি আপনি কোনো বাধার সম্মুখীন হন, যেখানে নতুন ভ্যারিয়েন্ট এপিআই আপনার ব্যবহারের ক্ষেত্রটি সমর্থন করতে পারছে না, তাহলে মতামত জানানোর জন্য এই পদক্ষেপগুলো অনুসরণ করুন:
- বিদ্যমান আইটেমগুলি পরীক্ষা করুন: প্রথমে, আপনার মাইগ্রেশন ব্লকারটি আগে থেকেই পরিচিত কিনা তা দেখতে AGP 10.0 ভ্যারিয়েন্ট API গ্লোবাল ট্র্যাকিং বাগটি পরীক্ষা করুন এবং ইস্যুটিতে +1 করুন।
- অনুপস্থিত API সম্পর্কে জানান: আপনার ব্যবহারের ক্ষেত্রটি যদি অনন্য হয়, তবে আমাদের নির্দিষ্ট ভ্যারিয়েন্ট API টেমপ্লেট ব্যবহার করে একটি নতুন ফিচার রিকোয়েস্ট ফাইল করুন , যাতে আমরা বিষয়টি খতিয়ে দেখে আপনাকে সহায়তা করতে পারি।
(প্রাথমিকভাবে) ব্যক্তিগত অভ্যন্তরীণ AGP ক্লাসগুলিতে অ্যাক্সেস সরিয়ে নেওয়া হয়েছে
gradle আর্টিফ্যাক্টের উপর নির্ভরতার কারণে এখন সমস্ত অভ্যন্তরীণ ক্লাস আড়াল হয়ে যায় এবং শুধুমাত্র gradle-api আর্টিফ্যাক্টে উপলব্ধ ইন্টারফেস ও ক্লাসগুলোতে কম্পাইলেশন অ্যাক্সেস পাওয়া যায়। এটি প্লাগইন কম্পাইলেশনকে প্রভাবিত করে।
অভ্যন্তরীণ ক্লাসগুলোতে অ্যাক্সেস পাওয়ার জন্য ম্যানুয়ালি কোনো ডিপেন্ডেন্সি যোগ করা সম্ভব নয়।
এজিপি ৯.০ (জানুয়ারি ২০২৬)
নতুন ভ্যারিয়েন্ট এপিআইগুলো স্থিতিশীল, পুরোনো এপিআইগুলো অপ্রচলিত।
৪.১ এবং ৪.২ সংস্করণে পরীক্ষামূলক পর্যায়ে থাকা ভ্যারিয়েন্ট এপিআইগুলো এখন স্থিতিশীল এবং gradle-api আর্টিফ্যাক্টে অবস্থিত। পুরোনো ভ্যারিয়েন্ট এপিআই-তে ব্যবহৃত পূর্ববর্তী ইন্টারফেস এবং ক্লাসগুলো এখন অপ্রচলিত (deprecated), এবং এগুলো ব্যবহারের জন্য সুস্পষ্টভাবে সম্মতি (opt-in) দিতে হবে।
নতুন ডিএসএল ইন্টারফেসগুলো স্থিতিশীল, পুরোনো গুলো অপ্রচলিত।
৪.১, ৪.২, এবং ৭.০ সংস্করণে পরীক্ষামূলক পর্যায়ে থাকা ডিএসএল ইন্টারফেসগুলো এখন স্থিতিশীল এবং gradle-api আর্টিফ্যাক্টে অবস্থিত। ডিএসএল-এ ব্যবহৃত পূর্ববর্তী ইন্টারফেস এবং ক্লাসগুলো এখন অপ্রচলিত (deprecated), এবং এগুলো ব্যবহারের জন্য সুস্পষ্টভাবে সম্মতি (opt-in) প্রয়োজন।
ব্যক্তিগত অভ্যন্তরীণ এজিপি ক্লাসগুলি এখনও অ্যাক্সেসযোগ্য
AGP-এর নিজস্ব অভ্যন্তরীণ ক্লাস, যা অন্যান্য আর্টিফ্যাক্টে অবস্থিত, তা বিল্ড ফাইল এবং প্লাগইন কম্পাইল করার সময়ও অ্যাক্সেসযোগ্য থাকে, কিন্তু আমরা সেগুলি ব্যবহার করার পরামর্শ দিই না কারণ সেগুলি যেকোনো সময় এমনভাবে পরিবর্তিত হতে পারে যা গেমের কার্যকারিতায় বাধা সৃষ্টি করে।