এই পৃষ্ঠা Android Gradle প্লাগ-ইন (AGP) API বন্ধ করা ও সরিয়ে দেওয়ার বিষয়টি ট্র্যাক করে এবং সেই অনুযায়ী আপনার কোড কীভাবে আপডেট করবেন সেই বিষয়ে তথ্য প্রদান করে।
API বন্ধ করা ও সরিয়ে দেওয়ার ট্র্যাকার
AGP ভার্সনের ভিত্তিতে, AGP API কখন বন্ধ করা হয়েছে এবং সরিয়ে দেওয়া হয়েছে, তা নিম্নলিখিত সারণীতে সংক্ষেপে দেওয়া হয়েছে।
| API | AGP ভার্সনে বন্ধ হয়ে গেছে | AGP ভার্সন থেকে সরানো হয়েছে |
|---|---|---|
Component.setAsmFramesComputationMode |
৭.২ | |
Component.transformClassesWith |
৭.২ | |
| RenderScript | ৭.২ | |
| ট্রান্সফর্ম | ৭.২ | ৮.০ |
AGP 8.12
Android Gradle প্লাগ-ইন 8.12.0-এ নিম্নলিখিত উল্লেখযোগ্য API পরিবর্তনগুলি রয়েছে।
আচরণে পরিবর্তন: includeAndroidResources বিকল্প টেস্ট ডিরেক্টরি থেকে ম্যানিফেস্ট মার্জ করে
আপনি এখন আপনার টেস্ট সোর্স ডিরেক্টরিতে একটি AndroidManifest.xml ফাইল তৈরি করতে পারবেন
যাতে android.testOptions.unitTests.includeAndroidResources বিকল্পের সাহায্যে ইউনিট টেস্টের জন্য
ম্যানিফেস্ট কাস্টমাইজ করা যায়। টেস্ট
ম্যানিফেস্ট ফাইল অ্যাপের মূল ম্যানিফেস্টে মার্জ হয়ে যাবে। সমস্যা #১২৭৯৮৬৪৫৮
AGP 8.10
Android Gradle প্লাগ-ইন 8.10.0-এ নিম্নলিখিত উল্লেখযোগ্য API পরিবর্তন রয়েছে।
সোর্স লেভেল ব্রেকিং পরিবর্তন: finalizeDsl-এর জন্য এখন প্যারামিটারাইজড টাইপ ব্যবহার করতে হবে
AndroidComponentsExtension-কে সরাসরি com.android.kotlin.multiplatform.library প্লাগ-ইনের সাথে ব্যবহার করার অনুমতি দিতে,
finalizeDsl-এর উপর টাইপ বাউন্ড শিথিল করা হয়েছে।
যেমন, আপনি যদি অ্যাপ্লিকেশন ও লাইব্রেরি অ্যাড্রেস করতে AndroidComponentsExtension-এর র টাইপ ব্যবহার করে থাকেন:
extensions.getByType(AndroidComponentsExtension::class).finalizeDsl { androidExtension ->
androidExtension.experimentalProperties["android.example"] = true
}
আপগ্রেড করার আগে বা আপগ্রেড করার সময় আপনাকে সোর্স কোড পরিবর্তন করতে হবে, যেমন:
extensions.getByType<AndroidComponentsExtension<CommonExtension<*, *, *, *, *, *>, *, *>>().finalizeDsl { androidExtension ->
androidExtension.experimentalProperties["android.example"] = true
}
মনে রাখবেন, আপনি যদি এমন finalizeDsl কোড লিখতে চান যা বর্তমান com.android.library ও com.android.application প্লাগ-ইন এবং নতুন com.android.kotlin.multiplatform.library প্লাগ-ইন, উভয়ের ক্ষেত্রেই কাজ করে, তাহলে আপনাকে রানটাইমে ধরন চেক করতে হতে পারে:
extensions.getByType<AndroidComponentsExtension<*, *, *>>().finalizeDsl { androidExtension ->
when(androidExtension) {
is CommonExtension<*, *, *, *, *, *> -> androidExtension.experimentalProperties["android.example"] = true
is KotlinMultiplatformAndroidLibraryExtension -> androidExtension.experimentalProperties["android.example"] = true
}
}
এটি শুধুমাত্র সোর্স লেভেল ব্রেকিং পরিবর্তন এবং বাইনারি প্লাগ-ইনে কোনও প্রভাব ফেলবে না।
AGP 8.8
AGP 8.8-এর জন্য গুরুত্বপূর্ণ API আপডেট নিচে দেওয়া হল।
রিসোর্স কনফিগারেশন বাতিল করা হয়েছে
রিসোর্স কনফিগারেশন AGP 8.8 থেকে বন্ধ করে দেওয়া হয়েছে। এটি করা হয়েছে কারণ AGP-তে আর বিভিন্ন রিসোর্স ডেনসিটি কাজ করে না এবং Google Play Console-এ এখন অ্যাপ বান্ডেল হিসেবে অ্যাপ প্রকাশ করতে হয়। ভাষা কনফিগারেশনের জন্য,
আপনি localeFilters DSL ব্যবহার করে আপনার অ্যাপ যেসব লোকেল সাপোর্ট করে তা নির্দিষ্ট করতে পারেন, যাতে লোকেল কনফিগারেশনকে সংশ্লিষ্ট রিসোর্সের সাথে ম্যাপ করা যায়।
AGP 8.0
AGP 8.0-এর জন্য গুরুত্বপূর্ণ API আপডেট নিচে দেওয়া হল।
Transform API সরিয়ে দেওয়া হয়েছে
AGP 8.0 থেকে শুরু করে, Transform API সরিয়ে দেওয়া হয়েছে। এর অর্থ হল com.android.build.api.transform প্যাকেজের সব ক্লাস
সরিয়ে দেওয়া হয়েছে।
বিল্ড পারফর্ম্যান্স উন্নত করতে Transform API সরিয়ে দেওয়া হচ্ছে। যেসব প্রোজেক্ট Transform API ব্যবহার করে, সেগুলি AGP-কে বিল্ডের জন্য কম অপ্টিমাইজ করা ফ্লো ব্যবহার করতে বাধ্য করে, যার ফলে বিল্ডের সময় অনেক বেশি রিগ্রেশন হতে পারে। এছাড়াও, Transform API ব্যবহার করা এবং অন্যান্য Gradle ফিচারের সাথে এটি একত্রিত করা কঠিন; রিপ্লেসমেন্ট API-এর লক্ষ্য হল, পারফর্ম্যান্স বা বিল্ডের সঠিকতা সংক্রান্ত সমস্যা ছাড়াই AGP এক্সটেন্ড করা আরও সহজ করে তোলা।
রিপ্লেসমেন্ট API
Transform API-এর কোনও একক বিকল্প নেই—প্রতিটি ব্যবহারের ক্ষেত্রে নতুন, টার্গেট করা
API আছে। সব রিপ্লেসমেন্ট API androidComponents
{} ব্লকে আছে। এইসব API, AGP 7.2-এর মাধ্যমে উপলভ্য।
বাইটকোড ট্রান্সফর্ম করার জন্য সহায়তা
বাইটকোড ট্রান্সফর্ম করতে, Instrumentation API ব্যবহার করুন। লাইব্রেরির জন্য, আপনি
শুধুমাত্র লোকাল প্রোজেক্ট ক্লাসের জন্য ইন্সট্রুমেন্টেশন রেজিস্টার করতে পারবেন; অ্যাপ এবং টেস্টের জন্য,
আপনি শুধুমাত্র লোকাল ক্লাস বা লোকাল এবং রিমোট ডিপেন্ডেন্সি সহ সব ক্লাসের জন্য
ইন্সট্রুমেন্টেশন রেজিস্টার করার বিকল্প বেছে নিতে পারবেন। এই API ব্যবহার করতে, ইনস্ট্রুমেন্টেশন প্রতিটি ক্লাসে স্বাধীনভাবে চলে, ক্লাসপাথের অন্যান্য ক্লাসে সীমিত অ্যাক্সেস সহ (আরও তথ্যের জন্য createClassVisitor() দেখুন)।
এই বিধিনিষেধ সম্পূর্ণ ও ইনক্রিমেন্টাল বিল্ডের পারফর্ম্যান্স উন্নত করে,
এবং API সারফেসকে স্ট্রিমলাইন করে রাখে। সব কম্পাইলেশন সম্পূর্ণ হওয়ার পরে নয়, বরং প্রতিটি লাইব্রেরি প্রস্তুত হওয়ার সাথে সাথেই
সমান্তরালভাবে ইন্সট্রুমেন্ট করা হয়। এছাড়াও,
একটি ক্লাসে পরিবর্তন করার অর্থ হল, ইনক্রিমেন্টাল বিল্ডে শুধুমাত্র প্রভাবিত ক্লাসগুলিকেই
পুনরায় ইনস্ট্রুমেন্ট করতে হবে। Instrumentation API কীভাবে ব্যবহার করতে হয় তার উদাহরণ দেখতে, ASM-এর সাহায্যে ক্লাস ট্রান্সফর্ম করা AGP
রেসিপি দেখুন।
আপনার অ্যাপে জেনারেট করা ক্লাস যোগ করার জন্য সহায়তা
অ্যাপে অতিরিক্ত জেনারেট করা ক্লাস যোগ করতে, MultipleArtifact.ALL_CLASSES_DIRS-এর সাথে
আর্টিফ্যাক্ট API ব্যবহার করুন। বিশেষত, ব্যবহার করুন
artifacts.use(TaskProvider)
.wiredWith(...)
.toAppend(Artifact.Multiple)
প্রোজেক্ট ক্লাসে অতিরিক্ত জেনারেট করা ডিরেক্টরি যোগ করতে
MultipleArtifact.ALL_CLASSES_DIRS-এর সাথে। Artifacts API আপনার কাস্টম টাস্কের আউটপুট দেখানোর জন্য
অটোমেটিক একটি অনন্য লোকেশন বেছে নেবে। এই API কীভাবে ব্যবহার করতে হয় তার উদাহরণ দেখতে
addToAllClasses রেসিপি দেখুন।
পুরো প্রোগ্রাম বিশ্লেষণের ভিত্তিতে ট্রান্সফর্মেশনের জন্য সহায়তা
পুরো প্রোগ্রাম বিশ্লেষণের উপর ভিত্তি করে ট্রান্সফর্মেশন প্রয়োগ করতে, একটি টাস্কে সব ক্লাস একসাথে ট্রান্সফর্ম করা যেতে পারে। এই পদ্ধতিটি সতর্কতার সাথে ব্যবহার করা উচিত কারণ এতে ইন্সট্রুমেন্টেশন API ব্যবহার করার চেয়ে অনেক বেশি বিল্ড পারফরম্যান্স খরচ হয়। আপনার প্লাগ-ইন এই API ব্যবহার করলে, বিল্ডের ধরন অনুযায়ী ট্রান্সফর্মেশন চালু করার জন্য সাজেস্ট করা হয়, যাতে অ্যাপ ডেভেলপার ডেভেলপমেন্ট বিল্ডের জন্য এটি বন্ধ করতে পারেন।
সব ক্লাস একসাথে ট্রান্সফর্ম করে এমন টাস্ক রেজিস্টার করতে, Android Gradle প্লাগ-ইন
7.4 ভার্সন Artifacts.forScope API নিয়ে এসেছে। বর্তমান প্রোজেক্টের সব ক্লাস
ট্রান্সফর্ম করতে, Artifacts.forScope.PROJECT ব্যবহার করুন। বর্তমান প্রোজেক্ট, ইমপোর্ট করা প্রোজেক্ট এবং সব এক্সটার্নাল ডিপেন্ডেন্সির সব ক্লাস ট্রান্সফর্ম করতে,
Artifacts.forScope.ALL ব্যবহার করুন। নিম্নলিখিত কোড থেকে জানা যায় যে কীভাবে
Artifacts.forScope.ALL ব্যবহার করে এমন একটি টাস্ক রেজিস্টার করা যায় যা সব ক্লাসকে
একসাথে ট্রান্সফর্ম করে:
variant.artifacts.forScope(ScopedArtifacts.Scope.ALL)
.use(taskProvider)
.toTransform(
ScopedArtifact.CLASSES,
ModifyClassesTask::allJars,
ModifyClassesTask::allDirectories,
ModifyClassesTask::output,
)
এই API কীভাবে ব্যবহার করতে হয় তার উদাহরণ দেখতে modifyProjectClasses রেসিপি দেখুন এবং Android বিল্ড টাইপে কীভাবে কাস্টম এক্সটেনশন রেজিস্টার করতে হয় তার উদাহরণ দেখতে customizeAgpDsl রেসিপি দেখুন।
আপনার ব্যবহারের কেস কোনও AndroidComponents API-এর মাধ্যমে কভার না করা হলে, আপনি সমস্যা ফাইল করতে পারবেন।
সাধারণত ব্যবহার করা হয় এমন বেশ কিছু প্লাগ-ইন ইতিমধ্যেই এই নতুন API ব্যবহার করার জন্য মাইগ্রেট করা হয়েছে, যার মধ্যে Firebase পারফর্ম্যান্স মনিটরিং প্লাগ-ইন (1.4.1, AGP 8.0-এর সাথে মানানসই) এবং Hilt Gradle প্লাগ-ইন (2.40.1, AGP 8.0-এর সাথে মানানসই) অন্তর্ভুক্ত। এছাড়াও, AGP আপগ্রেড অ্যাসিস্ট্যান্ট প্রোজেক্ট ডেভেলপারদের সাধারণত ব্যবহৃত প্লাগ-ইন প্রয়োজন অনুযায়ী আপগ্রেড করতে সাহায্য করবে।
আপনি যদি থার্ড-পার্টি প্লাগ-ইনের মাধ্যমে Transform API ব্যবহার করেন, তাহলে আপনি লেখককে জানাতে পারেন যে AGP 8.0-এর জন্য নতুন API-এর সাথে কাজ করার জন্য তাদের প্লাগ-ইন আপডেট করতে হবে।
AGP 7.2
AGP 7.2-এর জন্য গুরুত্বপূর্ণ API আপডেট নিচে দেওয়া হল।
RenderScript বন্ধ করা হয়েছে
AGP 7.2 থেকে শুরু করে, RenderScript API বন্ধ করা হয়েছে। এগুলি কাজ করা চালিয়ে যাবে, তবে সতর্কতা দেখাবে এবং AGP-এর ভবিষ্যতের ভার্সনে সম্পূর্ণভাবে সরিয়ে দেওয়া হবে। RenderScript থেকে ট্রানজিশন করার ব্যাপারে নির্দেশিকা পেতে, RenderScript থেকে মাইগ্রেট করুন দেখুন।
Component.transformClassesWith ও Component.setAsmFramesComputationMode বন্ধ করা হয়েছে
AGP 7.2 থেকে শুরু করে, ক্লাস বাইটকোড ইন্সট্রুমেন্টেশন API
Component.transformClassesWith এবং
Component.setAsmFramesComputationMode বন্ধ করা হয়েছে। সেগুলি একটি নতুন ব্লকে
সরানো হয়েছে, Component.instrumentation, যাতে ইনস্ট্রুমেন্টেশন প্রসেস কনফিগার করার সাথে
সম্পর্কিত সব API আছে। এইসব ইনস্ট্রুমেন্টেশন ফিচার ব্যবহার করা চালিয়ে যেতে, পরিবর্তে নতুন ব্লকে সংশ্লিষ্ট API ব্যবহার করুন, যেমনটি নিম্নলিখিত কোড স্নিপেটে
দেখানো হয়েছে:
androidComponents {
onVariants(selector().all(), {
instrumentation.transformClassesWith(AsmClassVisitorFactoryImpl.class,
InstrumentationScope.Project) { params ->
params.x = "value"
}
instrumentation.setAsmFramesComputationMode(
COMPUTE_FRAMES_FOR_INSTRUMENTED_METHODS
)
})
}