অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৯.০ একটি প্রধান রিলিজ যা এপিআই এবং আচরণগত পরিবর্তন নিয়ে এসেছে।
Android Gradle plugin 9.0.1-এ আপডেট করতে, Android Gradle plugin Upgrade Assistant ব্যবহার করুন।
যখনই উপযুক্ত হয়, AGP আপগ্রেড অ্যাসিস্ট্যান্ট আপনার প্রজেক্ট আপগ্রেড করার সময় বিদ্যমান আচরণগুলো বজায় রাখতে সাহায্য করে, যার ফলে আপনি AGP 9.0-এর সমস্ত নতুন ডিফল্ট গ্রহণ করতে প্রস্তুত না থাকলেও আপনার প্রজেক্টকে AGP 9.0 ব্যবহার করার জন্য আপগ্রেড করতে পারবেন।
সামঞ্জস্যতা
অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৯.০ সর্বোচ্চ যে এপিআই লেভেলটি সমর্থন করে তা হলো এপিআই লেভেল ৩৬.১। অন্যান্য সামঞ্জস্যতার তথ্য নিচে দেওয়া হলো:
| সর্বনিম্ন সংস্করণ | ডিফল্ট সংস্করণ | নোট | |
|---|---|---|---|
| গ্রেডল | ৯.১.০ | ৯.১.০ | আরও জানতে, Gradle আপডেট করা দেখুন। |
| এসডিকে বিল্ড টুলস | ৩৬.০.০ | ৩৬.০.০ | এসডিকে বিল্ড টুলস ইনস্টল বা কনফিগার করুন । |
| এনডিকে | প্রযোজ্য নয় | ২৮.২.১৩৬৭৬৩৫৮ | NDK-এর একটি ভিন্ন সংস্করণ ইনস্টল বা কনফিগার করুন । |
| জেডিকে | ১৭ | ১৭ | আরও জানতে, JDK সংস্করণ নির্ধারণ দেখুন। |
android ডিএসএল ক্লাসগুলো এখন শুধু নতুন পাবলিক ইন্টারফেসগুলো ইমপ্লিমেন্ট করে।
গত কয়েক বছরে, কোন এপিআইগুলো পাবলিক হবে তা আরও ভালোভাবে নিয়ন্ত্রণ করার জন্য আমরা আমাদের ডিএসএল এবং এপিআই-এর জন্য নতুন ইন্টারফেস চালু করেছি। ইন্টারফেসগুলোর কাজ এগিয়ে যাওয়ার সাথে সাথে সামঞ্জস্যতা বজায় রাখার জন্য, এজিপি সংস্করণ 7.x এবং 8.x তখনও পুরোনো ডিএসএল টাইপগুলো (যেমন BaseExtension ) ব্যবহার করত, যেগুলো নতুন পাবলিক ইন্টারফেসগুলোও ইমপ্লিমেন্ট করত।
AGP 9.0 শুধুমাত্র আমাদের নতুন DSL ইন্টারফেস ব্যবহার করে, এবং এর ইমপ্লিমেন্টেশনগুলো সম্পূর্ণ গোপন নতুন টাইপে পরিবর্তিত হয়েছে। এর ফলে পুরোনো, অপ্রচলিত ভ্যারিয়েন্ট API-তে অ্যাক্সেসও বন্ধ হয়ে গেছে।
AGP 9.0-তে আপডেট করতে, আপনাকে নিম্নলিখিত কাজগুলো করতে হতে পারে:
- আপনার প্রজেক্টটি বিল্ট-ইন কোটলিনের সাথে সামঞ্জস্যপূর্ণ কিনা তা নিশ্চিত করুন:
org.jetbrains.kotlin.androidপ্লাগইনটি নতুন DSL-এর সাথে সামঞ্জস্যপূর্ণ নয়। KMP প্রোজেক্টগুলিকে KMP-এর জন্য Android Gradle Library Plugin- এ পরিবর্তন করুন:
com.android.libraryএবংcom.android.applicationপ্লাগইনগুলির সাথে একই Gradle সাবপ্রোজেক্টেorg.jetbrains.kotlin.multiplatformপ্লাগইন ব্যবহার করা নতুন DSL-এর সাথে সামঞ্জস্যপূর্ণ নয়।আপনার বিল্ড ফাইলগুলো আপডেট করুন: যদিও ইন্টারফেস পরিবর্তনের উদ্দেশ্য হলো ডিএসএল-কে যথাসম্ভব একই রকম রাখা, তবুও কিছু ছোটখাটো পরিবর্তন থাকতে পারে।
নতুন ডিএসএল এবং এপিআই রেফারেন্স করার জন্য আপনার কাস্টম বিল্ড লজিক আপডেট করুন: ইন্টারনাল ডিএসএল-এর যেকোনো রেফারেন্স পাবলিক ডিএসএল ইন্টারফেস দিয়ে প্রতিস্থাপন করুন। বেশিরভাগ ক্ষেত্রে এটি একটি হুবহু প্রতিস্থাপন হবে।
applicationVariantsএবং অনুরূপ এপিআই-এর যেকোনো ব্যবহার নতুনandroidComponentsএপিআই দিয়ে প্রতিস্থাপন করুন। এটি আরও জটিল হতে পারে, কারণandroidComponentsএপিআই-কে আরও স্থিতিশীল করে ডিজাইন করা হয়েছে যাতে প্লাগইনগুলো দীর্ঘ সময় ধরে সামঞ্জস্যপূর্ণ থাকে। উদাহরণের জন্য আমাদের গ্রেডল রেসিপিগুলো দেখুন।থার্ড-পার্টি প্লাগইন আপডেট করুন: কিছু থার্ড-পার্টি প্লাগইন এখনও এমন ইন্টারফেস বা এপিআই-এর উপর নির্ভরশীল থাকতে পারে যা এখন আর উপলব্ধ নয়। সেই প্লাগইনগুলির এমন সংস্করণে স্থানান্তরিত হন যা AGP 9.0-এর সাথে সামঞ্জস্যপূর্ণ।
নতুন ডিএসএল ইন্টারফেসে পরিবর্তনের ফলে প্লাগইন এবং গ্রেডল বিল্ড স্ক্রিপ্টগুলো বিভিন্ন অপ্রচলিত এপিআই ব্যবহার করতে পারে না, যার মধ্যে রয়েছে:
android ব্লকে অপ্রচলিত এপিআই | ফাংশন | প্রতিস্থাপন |
|---|---|---|
applicationVariants ,libraryVariants ,testVariants , এবংunitTestVariants | AGP-তে নতুন কার্যকারিতা যোগ করার জন্য প্লাগইনগুলির এক্সটেনশন পয়েন্ট। | উদাহরণস্বরূপ, এটিকে androidComponents.onVariants API দিয়ে প্রতিস্থাপন করুন:androidComponents { onVariants() { variant -> variant.signingConfig .enableV1Signing.set(false) } } |
variantFilter | নির্বাচিত ভ্যারিয়েন্টগুলো নিষ্ক্রিয় করার সুযোগ দেয়। | উদাহরণস্বরূপ, এটিকে androidComponents.beforeVariants API দিয়ে প্রতিস্থাপন করুন: androidComponents { beforeVariants( selector() .withBuildType("debug") .withFlavor("color", "blue") ) { variantBuilder -> variantBuilder.enable = false } } |
deviceProvider এবংtestServer | অ্যান্ড্রয়েড ডিভাইস ও এমুলেটরে পরীক্ষা চালানোর জন্য নিজস্ব পরীক্ষা পরিবেশের নিবন্ধন। | Gradle-পরিচালিত ডিভাইসগুলিতে স্যুইচ করুন। |
sdkDirectory ,ndkDirectory ,bootClasspath ,adbExecutable , এবংadbExe | কাস্টম টাস্কের জন্য অ্যান্ড্রয়েড এসডিকে-র বিভিন্ন উপাদান ব্যবহার করা। | androidComponents.sdkComponents এ যান। |
registerArtifactTyperegisterBuildTypeSourceProvider ,registerProductFlavorSourceProviderregisterJavaArtifactregisterMultiFlavorSourceProvider , এবংwrapJavaSourceSet | অপ্রচলিত কার্যকারিতা, যা মূলত অ্যান্ড্রয়েড স্টুডিওতে তৈরি হওয়া সোর্সগুলো পরিচালনার সাথে সম্পর্কিত, এবং যা AGP 7.2.0 থেকে কাজ করা বন্ধ করে দিয়েছে। | এই এপিআইগুলোর কোনো সরাসরি বিকল্প নেই। |
dexOptions | dx টুল সম্পর্কিত অপ্রচলিত সেটিংস, যা d8 দ্বারা প্রতিস্থাপিত হয়েছে। অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৭.০-এর পর থেকে এই সেটিংসগুলোর কোনো কার্যকারিতা নেই। | এর কোনো সরাসরি বিকল্প নেই। |
generatePureSplits | ইনস্ট্যান্ট অ্যাপগুলির জন্য কনফিগারেশন স্প্লিট তৈরি করুন। | অ্যান্ড্রয়েড অ্যাপ বান্ডেলগুলিতে এখন কনফিগারেশন স্প্লিট পাঠানোর ক্ষমতা অন্তর্নির্মিত রয়েছে। |
aidlPackagedList | এই লাইব্রেরির উপর নির্ভরশীল লাইব্রেরি এবং অ্যাপগুলির জন্য এটিকে API হিসাবে উন্মুক্ত করতে AAR-এ প্যাকেজ করার জন্য AIDL ফাইলগুলি। | এটি এখনও LibraryExtension এ উন্মুক্ত, কিন্তু অন্যান্য এক্সটেনশন টাইপগুলিতে নয়। |
আপনি যদি AGP 9.0-এ আপডেট করার পর নিম্নলিখিত এরর মেসেজটি দেখতে পান, তার মানে হলো আপনার প্রজেক্টটি এখনও কিছু পুরোনো টাইপ রেফারেন্স করছে:
java.lang.ClassCastException: class com.android.build.gradle.internal.dsl.ApplicationExtensionImpl$AgpDecorated_Decorated
cannot be cast to class com.android.build.gradle.BaseExtension
যদি আপনি অসঙ্গত থার্ড-পার্টি প্লাগইন দ্বারা বাধাগ্রস্ত হন, তবে আপনি অপ্ট-আউট করে DSL-এর পুরোনো ইমপ্লিমেন্টেশন এবং পুরোনো ভ্যারিয়েন্ট API ফিরে পেতে পারেন। এটি করার সময়, নতুন ইন্টারফেসগুলোও উপলব্ধ থাকবে এবং আপনি আপনার নিজের বিল্ড লজিককে নতুন API অনুযায়ী আপডেট করতে পারবেন। অপ্ট-আউট করতে, আপনার gradle.properties ফাইলে এই লাইনটি অন্তর্ভুক্ত করুন:
android.newDsl=false
AGP 9.0-এ পূর্ববর্তী ক্লাসগুলোকে ডেপ্রিকেটেড হিসেবে চিহ্নিত করা হয়েছে। এর মানে হলো, যেসব প্রোজেক্ট newDsl ফ্ল্যাগটি ব্যবহার করবে না, তারা ডেপ্রিকেশন ওয়ার্নিং দেখতে পাবে, এমনকি android ব্লকটিতেও।
আপনি AGP 9.0-এ আপগ্রেড করার আগেও নতুন API-গুলিতে আপগ্রেড করা শুরু করতে পারেন। নতুন ইন্টারফেসগুলি অনেক AGP সংস্করণ ধরেই বিদ্যমান, তাই আপনি নতুন এবং পুরানোর একটি মিশ্রণ রাখতে পারেন। AGP API রেফারেন্স ডক্স-এ প্রতিটি AGP সংস্করণের জন্য API সারফেস এবং কখন প্রতিটি ক্লাস, মেথড ও ফিল্ড যোগ করা হয়েছিল তা দেখানো হয়।
আমরা বহুল ব্যবহৃত প্লাগইনগুলির নির্মাতাদের সাথে যোগাযোগ করছি, যাতে তাঁরা নতুন মোডগুলির সাথে সম্পূর্ণ সামঞ্জস্যপূর্ণ প্লাগইন তৈরি ও প্রকাশ করতে পারেন। এছাড়াও, মাইগ্রেশন প্রক্রিয়ায় আপনাকে পথ দেখানোর জন্য আমরা অ্যান্ড্রয়েড স্টুডিও-তে থাকা AGP আপগ্রেড অ্যাসিস্ট্যান্ট-এর উন্নতি সাধন অব্যাহত রাখব।
যদি আপনি দেখেন যে নতুন DSL বা ভ্যারিয়েন্ট API-তে কোনো সক্ষমতা বা বৈশিষ্ট্যের অভাব রয়েছে, তাহলে অনুগ্রহ করে যত দ্রুত সম্ভব একটি ইস্যু ফাইল করুন।
অন্তর্নির্মিত কোটলিন
অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৯.০-তে বিল্ট-ইন কোটলিন সাপোর্ট যুক্ত করা হয়েছে এবং এটি ডিফল্টভাবে সক্রিয় থাকে। এর মানে হলো, কোটলিন সোর্স ফাইল কম্পাইল করার জন্য আপনাকে আর আপনার বিল্ড ফাইলে org.jetbrains.kotlin.android (বা kotlin-android ) প্লাগইনটি প্রয়োগ করতে হবে না। এটি AGP-এর সাথে কোটলিনের ইন্টিগ্রেশনকে সহজ করে, ডেপ্রিকেটেড API-এর ব্যবহার এড়ায় এবং কিছু ক্ষেত্রে পারফরম্যান্স উন্নত করে।
সুতরাং, যখন আপনি আপনার প্রজেক্ট AGP 9.0-এ আপগ্রেড করবেন, তখন আপনাকে বিল্ট-ইন কোটলিনেও মাইগ্রেট করতে হবে অথবা এটি বাদ দিতে হবে ।
আপনি সেইসব গ্রেডল সাবপ্রজেক্টের জন্য বিল্ট-ইন কোটলিন সাপোর্টও বেছে বেছে নিষ্ক্রিয় করতে পারেন, যেগুলিতে কোটলিন সোর্স নেই।
কোটলিন গ্রেডল প্লাগইনের উপর রানটাইম নির্ভরতা
বিল্ট-ইন কোটলিন সাপোর্ট দেওয়ার জন্য, অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৯.০-এর এখন কোটলিন গ্রেডল প্লাগইন (কেজিপি) ২.২.১০-এর উপর একটি রানটাইম ডিপেন্ডেন্সি রয়েছে। এর মানে হলো, আপনাকে আর কেজিপি ভার্সন ঘোষণা করতে হবে না এবং আপনি যদি ২.২.১০-এর চেয়ে কম কোনো কেজিপি ভার্সন ব্যবহার করেন, তাহলে গ্রেডল স্বয়ংক্রিয়ভাবে আপনার কেজিপি ভার্সনটিকে ২.২.১০-এ আপগ্রেড করে দেবে। একইভাবে, আপনি যদি ২.২.১০-২.০.২-এর চেয়ে কম কোনো কেএসপি ভার্সন ব্যবহার করেন, তাহলে এজিপি এটিকে কেজিপি ভার্সনের সাথে মেলানোর জন্য ২.২.১০-২.০.২-এ আপগ্রেড করে নেবে।
উচ্চতর KGP সংস্করণে আপগ্রেড করুন
KGP বা KSP-এর উচ্চতর সংস্করণ ব্যবহার করতে, আপনার শীর্ষ-স্তরের বিল্ড ফাইলে নিম্নলিখিতটি যোগ করুন:
buildscript {
dependencies {
// For KGP
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:KGP_VERSION")
// For KSP
classpath("com.google.devtools.ksp:symbol-processing-gradle-plugin:KSP_VERSION")
}
}
নিম্নতর KGP সংস্করণে ডাউনগ্রেড করুন
আপনি কেবল তখনই KGP ভার্সন ডাউনগ্রেড করতে পারবেন, যদি আপনি বিল্ট-ইন কোটলিন ব্যবহার করা থেকে বিরত থাকেন । এর কারণ হলো, AGP 9.0 ডিফল্টরূপে বিল্ট-ইন কোটলিন সক্রিয় করে, এবং এই ব্যবহারের জন্য KGP 2.2.10 বা তার উচ্চতর সংস্করণ প্রয়োজন।
KGP বা KSP-এর নিম্নতর সংস্করণ ব্যবহার করতে, আপনার শীর্ষ-স্তরের বিল্ড ফাইলে একটি কঠোর সংস্করণ ঘোষণার মাধ্যমে সেই সংস্করণটি ঘোষণা করুন:
buildscript {
dependencies {
// For KGP
classpath("org.jetbrains.kotlin:kotlin-gradle-plugin") {
version { strictly("KGP_VERSION") }
}
// For KSP
classpath("com.google.devtools.ksp:symbol-processing-gradle-plugin") {
version { strictly("KSP_VERSION") }
}
}
}
মনে রাখবেন যে, আপনি KGP-এর সর্বনিম্ন যে সংস্করণে ডাউনগ্রেড করতে পারবেন তা হলো 2.0.0।
টেস্ট ফিক্সচারের জন্য IDE সমর্থন
AGP 9.0-এর মাধ্যমে Android Studio IDE-তে টেস্ট ফিক্সচারের পূর্ণাঙ্গ সমর্থন যুক্ত হয়েছে।
ফিউজড লাইব্রেরি প্লাগইন
ফিউজড লাইব্রেরি প্লাগইন (প্রিভিউ) আপনাকে একাধিক লাইব্রেরিকে একটি একক অ্যান্ড্রয়েড লাইব্রেরি AAR হিসেবে প্রকাশ করতে দেয়। এর ফলে আপনার ব্যবহারকারীদের পক্ষে আপনার প্রকাশিত আর্টিফ্যাক্টগুলোর ওপর নির্ভর করা সহজ হতে পারে।
কীভাবে শুরু করবেন সে সম্পর্কে তথ্যের জন্য, ফিউজড লাইব্রেরির সাহায্যে একাধিক অ্যান্ড্রয়েড লাইব্রেরিকে একটি হিসেবে প্রকাশ করুন দেখুন।
আচরণের পরিবর্তন
অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৯.০-তে নিম্নলিখিত নতুন বৈশিষ্ট্যগুলো রয়েছে:
| আচরণ | সুপারিশ |
|---|---|
অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৯.০ ডিফল্টরূপে এনডিকে সংস্করণ r28c ব্যবহার করে। | আপনি যে NDK সংস্করণটি ব্যবহার করতে চান, তা স্পষ্টভাবে উল্লেখ করার কথা বিবেচনা করুন। |
| অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৯.০ ডিফল্টরূপে লাইব্রেরি ব্যবহারকারীদের একই বা উচ্চতর কম্পাইল এসডিকে সংস্করণ ব্যবহার করার জন্য নির্দেশ দেয়। | কোনো লাইব্রেরি ব্যবহার করার সময় একই বা উচ্চতর কম্পাইল SDK ব্যবহার করুন। যদি এটি সম্ভব না হয়, অথবা আপনি আপনার প্রকাশিত লাইব্রেরির ব্যবহারকারীদের পরিবর্তনের জন্য আরও সময় দিতে চান, তাহলে স্পষ্টভাবে AarMetadata.minCompileSdk সেট করুন। |
AGP 9.0-এ নিম্নলিখিত Gradle প্রোপার্টিগুলোর ডিফল্ট সেটিংসে আপডেট আনা হয়েছে। এর ফলে আপগ্রেড করার সময় আপনি AGP 8.13-এর আচরণ বজায় রাখার বিকল্পটি বেছে নিতে পারবেন:
| সম্পত্তি | ফাংশন | AGP 8.13 থেকে AGP 9.0-তে পরিবর্তন | সুপারিশ |
|---|---|---|---|
android. newDsl | android ব্লকের পুরোনো ইমপ্লিমেন্টেশনগুলোকে প্রকাশ না করেই নতুন ডিএসএল ইন্টারফেসগুলো ব্যবহার করুন।এর মানে হলো, android.applicationVariants এর মতো লিগ্যাসি ভ্যারিয়েন্ট এপিআই-টিও আর ব্যবহার করা যাবে না। | false → true | আপনি android.newDsl=false সেট করে এটি থেকে বিরত থাকতে পারেন।আপনার প্রোজেক্টে ব্যবহৃত সমস্ত প্লাগইন এবং বিল্ড লজিক সামঞ্জস্যপূর্ণ হয়ে গেলে, অপ্ট-আউটটি সরিয়ে দিন। |
android. builtInKotlin | বিল্ট-ইন কোটলিন সক্ষম করে | false → true | সম্ভব হলে বিল্ট-ইন কোটলিনে স্থানান্তরিত হন অথবা এটি এড়িয়ে চলুন । |
android. uniquePackage Names | প্রতিটি লাইব্রেরির একটি স্বতন্ত্র প্যাকেজ নাম থাকা নিশ্চিত করে। | false → true | আপনার প্রোজেক্টের অন্তর্গত সমস্ত লাইব্রেরির জন্য স্বতন্ত্র প্যাকেজ নাম নির্দিষ্ট করুন। যদি তা সম্ভব না হয়, তাহলে মাইগ্রেট করার সময় আপনি এই ফ্ল্যাগটি নিষ্ক্রিয় করতে পারেন। |
android. useAndroidx | ডিফল্টরূপে androidx নির্ভরতা ব্যবহার করুন। | false → true | androidx নির্ভরতাগুলো গ্রহণ করুন। |
android. default. androidx. test. runner | ডিফল্টরূপে androidx.test.runner.AndroidJUnitRunner ক্লাস ব্যবহার করে অন-ডিভাইস টেস্ট চালান, যা অপ্রচলিত InstrumentationTestRunner এর ডিফল্ট বিকল্প হিসেবে কাজ করে। android {
defaultConfig {
testInstrumentationRunner = "..."
}
} | false → true | AndroidJUnitRunner ব্যবহার করুন, অথবা আপনার নিজস্ব testInstrumentationRunner স্পষ্টভাবে নির্দিষ্ট করে দিন। |
android. dependency. useConstraints | কনফিগারেশনগুলোর মধ্যে নির্ভরশীলতার সীমাবদ্ধতার ব্যবহার নিয়ন্ত্রণ করে। AGP 9.0-এর ডিফল্ট মান হলো false , যা শুধুমাত্র অ্যাপ্লিকেশন ডিভাইস টেস্টে (AndroidTest) কনস্ট্রেইন্ট ব্যবহার করে। এটিকে true তে সেট করলে 8.13-এর আচরণে ফিরে যাবে। | true → false | প্রয়োজন না হলে সব জায়গায় ডিপেন্ডেন্সি কনস্ট্রেইন্ট ব্যবহার করবেন না। এই ফ্ল্যাগের নতুন ডিফল্ট গ্রহণ করলে প্রজেক্ট ইম্পোর্ট প্রক্রিয়ায় অপটিমাইজেশনও চালু হয়, যা অনেকগুলো অ্যান্ড্রয়েড লাইব্রেরি সাবপ্রজেক্ট থাকা বিল্ডগুলোর জন্য ইম্পোর্টের সময় কমিয়ে দেবে। |
android. enableApp CompileTime RClass | অ্যাপ্লিকেশন কম্পাইলেশনকে লাইব্রেরি কম্পাইলেশনের সাথে সামঞ্জস্যপূর্ণ করতে, অ্যাপ্লিকেশনগুলিতে কোড একটি নন-ফাইনাল R ক্লাসের সাপেক্ষে কম্পাইল করুন। এটি ইনক্রিমেন্টালিটি উন্নত করে এবং রিসোর্স প্রসেসিং ফ্লো-এর ভবিষ্যৎ পারফরম্যান্স অপটিমাইজেশনের পথ প্রশস্ত করে। | false → true | অনেক প্রজেক্ট কোনো সোর্স কোড পরিবর্তন ছাড়াই নতুন আচরণটি গ্রহণ করতে পারে। যদি R ক্লাস ফিল্ডগুলো এমন কোনো জায়গায় ব্যবহৃত হয় যেখানে কনস্ট্যান্ট প্রয়োজন, যেমন সুইচ কেস, তাহলে চেইনড if স্টেটমেন্ট ব্যবহার করার জন্য রিফ্যাক্টর করুন। |
android. sdk. defaultTargetSdk ToCompileSdk IfUnset | অ্যাপ এবং টেস্টে টার্গেট SDK ভার্সনের ডিফল্ট মান হিসেবে কম্পাইল করা SDK ভার্সনটি ব্যবহার করা হয়। এই পরিবর্তনের আগে, টার্গেট SDK ভার্সনটি ডিফল্টভাবে সর্বনিম্ন SDK ভার্সন হতো। | false → true | অ্যাপ এবং টেস্টের জন্য টার্গেট SDK ভার্সন স্পষ্টভাবে উল্লেখ করুন। |
android. onlyEnableUnitTest ForTheTested BuildType | শুধুমাত্র পরীক্ষিত বিল্ড টাইপের জন্য ইউনিট টেস্ট কম্পোনেন্ট তৈরি করে। ডিফল্ট প্রজেক্টে এর ফলে ডিবাগের জন্য একটিমাত্র ইউনিট টেস্ট তৈরি হয়, যেখানে আগে ডিবাগ বা রিলিজের জন্য ইউনিট টেস্ট চালানো হতো। | false → true | আপনার প্রোজেক্টে যদি ডিবাগ এবং রিলিজ উভয় পর্যায়েই টেস্ট চালানোর প্রয়োজন না হয়, তাহলে কোনো পরিবর্তনের প্রয়োজন নেই। |
android. proguard. failOnMissingFiles | AGP DSL-এ নির্দিষ্ট করা কোনো ফাইল ডিস্কে না থাকলে, একটি ত্রুটির কারণে বিল্ডটি ব্যর্থ হয়। এই পরিবর্তনের আগে, ফাইলের নামে টাইপিংয়ের ভুলের কারণে ফাইলগুলো নীরবে উপেক্ষা করা হতো। | false → true | যেকোনো অবৈধ প্রোগার্ড ফাইলের ঘোষণা মুছে ফেলুন |
android. r8. optimizedResourceShrinking | ক্লাস এবং অ্যান্ড্রয়েড রিসোর্সগুলোকে একত্রে বিবেচনা করার মাধ্যমে R8 কম অ্যান্ড্রয়েড রিসোর্স ব্যবহার করতে পারে। | false → true | আপনার প্রোজেক্টের রাখার নিয়মাবলী যদি ইতিমধ্যেই সম্পূর্ণ হয়ে থাকে, তাহলে কোনো পরিবর্তনের প্রয়োজন নেই। |
android. r8. strictFullMode ForKeepRules | এর ফলে R8 কোনো ক্লাসকে 'কিপ' করার সময় তার ডিফল্ট কনস্ট্রাক্টরকে পরোক্ষভাবে রাখে না। অর্থাৎ, -keep class A এখন আর -keep class A { <init>(); } বোঝায় না। | false → true | আপনার প্রোজেক্টের রাখার নিয়মাবলী যদি ইতিমধ্যেই সম্পূর্ণ হয়ে থাকে, তাহলে কোনো পরিবর্তনের প্রয়োজন নেই। আপনার প্রোজেক্টের keep rules-এ যেসব ক্ষেত্রে ডিফল্ট কনস্ট্রাক্টরটি রাখার প্রয়োজন হয়, সেখানে -keep class A -keep class A { <init>(); } ব্যবহার করুন। |
android. defaults. buildfeatures. resvalues | সমস্ত উপপ্রকল্পে resValues সক্ষম করে | true → false | শুধুমাত্র যে সাবপ্রজেক্টগুলোর প্রয়োজন, সেগুলোর গ্রেডল বিল্ড ফাইলে নিম্নলিখিত বিষয়গুলো সেট করে resValues সক্রিয় করুন: android {
buildFeatures {
resValues = true
}
} |
android. defaults. buildfeatures. shaders | সকল সাবপ্রজেক্টে শেডার কম্পাইলেশন সক্ষম করে। | true → false | শুধুমাত্র সেই সাবপ্রজেক্টগুলিতে শেডার কম্পাইলেশন সক্ষম করতে, যেগুলিতে কম্পাইল করার জন্য শেডার রয়েছে, সেই প্রজেক্টগুলির গ্রেডল বিল্ড ফাইলে নিম্নলিখিতটি সেট করুন: android {
buildFeatures {
shaders = true
}
} |
android. r8. proguardAndroidTxt. disallowed | AGP 9.0-এ, getDefaultProguardFile() proguard- proguard-android.txt proguard-android-optimize.txt ফাইলটিকেই সাপোর্ট করবে। এর কারণ হলো, proguard-android.txt ফাইলে অন্তর্ভুক্ত dontoptimize ফ্ল্যাগটির অনিচ্ছাকৃত ব্যবহার রোধ করা। | false → true | আপনি যদি অপ্টিমাইজেশন এড়াতে চান, তাহলে proguard-android-optimize.txt ব্যবহারের পাশাপাশি একটি কাস্টম proguardFile-এ স্পষ্টভাবে dontoptimize উল্লেখ করতে পারেন। সম্ভব হলে এই ফাইল থেকে dontoptimize ফ্ল্যাগটি সরিয়ে ফেলতে ভুলবেন না, কারণ এটি R8 অপ্টিমাইজেশনের সুবিধা কমিয়ে দেয়। অন্যথায়, android.r8.globalOptionsInConsumerRules.disallowed=false সেট করে অপ্ট-আউট করুন। |
android. r8. globalOptions InConsumerRules. disallowed | AGP 9.0 থেকে, কনজিউমার কিপ ফাইলে সমস্যাযুক্ত প্রগার্ড কনফিগারেশন থাকলে অ্যান্ড্রয়েড লাইব্রেরি এবং ফিচার মডিউল পাবলিশিং ব্যর্থ হবে। যে কনজিউমার কিপ ফাইলগুলিতে dontoptimize বা dontobfuscate মতো গ্লোবাল অপশন থাকে, সেগুলি শুধুমাত্র অ্যাপ্লিকেশন মডিউলে ব্যবহার করা উচিত এবং এগুলি লাইব্রেরি ব্যবহারকারীদের জন্য অপটিমাইজেশনের সুবিধা কমিয়ে দিতে পারে। যদি এই ধরনের কোনো গ্লোবাল অপশন একটি প্রি-কম্পাইলড ডিপেন্ডেন্সি (JAR বা AAR)-এর মধ্যে এমবেড করা থাকে, তাহলে অ্যান্ড্রয়েড অ্যাপ মডিউল কম্পাইলেশন তা নীরবে উপেক্ষা করবে। configuration.txt (সাধারণত <app_module>/build/outputs/mapping/<build_variant>/configuration.txt এর মতো পাথে থাকে) চেক করে আপনি বুঝতে পারবেন কখন এটি ঘটছে। সেখানে # REMOVED CONSUMER RULE: dontoptimize মতো কমেন্ট থাকতে পারে। | false → true | প্রকাশিত লাইব্রেরিগুলো থেকে যেকোনো অসঙ্গত নিয়ম সরিয়ে ফেলা উচিত। অভ্যন্তরীণ লাইব্রেরিগুলো থেকে যেকোনো অসঙ্গত কিন্তু প্রয়োজনীয় নিয়ম একটি অ্যাপ মডিউলের proguardFile-এ স্থানান্তর করা উচিত। android.r8.globalOptionsInConsumerRules.disallowed=false সেট করে অপ্ট-আউট করুন। আপনার সমস্ত কনজিউমার কিপ ফাইল সামঞ্জস্যপূর্ণ হয়ে গেলে, অপ্ট-আউটটি সরিয়ে ফেলুন। |
android. sourceset. disallowProvider | AndroidSourceSet DSL ব্যবহার করে জেনারেটেড সোর্সগুলির জন্য প্রোভাইডার পাস করা নিষিদ্ধ করুন। | false → true | জেনারেট করা সোর্সগুলো রেজিস্টার করতে androidComponents এর Sources API ব্যবহার করুন। |
android. custom. shader. path. required | যদি শেডার কম্পাইলেশন সক্রিয় করা থাকে, তাহলে local.properties ফাইলে শেডার কম্পাইলারের পাথ স্পষ্টভাবে সেট করতে হবে। | false → true | আপনার প্রোজেক্টের local.properties ফাইলে glslc.dir=/path/to/shader-tools যোগ করুন। |
অপসারণ করা বৈশিষ্ট্য
অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৯.০ নিম্নলিখিত কার্যকারিতাগুলো সরিয়ে দেয়:
- এমবেডেড Wear OS অ্যাপ সাপোর্ট
AGP 9.0 থেকে Wear OS অ্যাপ এমবেড করার সাপোর্ট তুলে নেওয়া হয়েছে, যা এখন আর Play-তে সমর্থিত নয়। এর মধ্যেwearAppকনফিগারেশন এবংAndroidSourceSet.wearAppConfigurationNameDSL-ও অন্তর্ভুক্ত। Wear OS-এ আপনার অ্যাপ কীভাবে প্রকাশ করবেন, তা জানতে "Distribute to Wear OS" দেখুন। -
androidDependenciesএবংsourceSetsরিপোর্ট টাস্ক - ঘনত্ব বিভাজন APK সমর্থন
AGP 9.0 থেকে স্ক্রিন ডেনসিটির উপর ভিত্তি করে স্প্লিট APK তৈরির সাপোর্ট সরিয়ে দেওয়া হয়েছে। এই কার্যকারিতা এবং সম্পর্কিত API-গুলো অপসারণ করা হয়েছে। AGP 9.0 বা তার উচ্চতর সংস্করণ ব্যবহার করে স্ক্রিন ডেনসিটির উপর ভিত্তি করে APK স্প্লিট করতে, অ্যাপ বান্ডেল ব্যবহার করুন।
ডিএসএল পরিবর্তন করা হয়েছে
অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৯.০-তে নিম্নলিখিত ব্রেকিং ডিএসএল পরিবর্তনগুলি আনা হয়েছে:
CommonExtensionএর প্যারামিটারাইজেশন অপসারণ করা হয়েছে।মূলত, এটি শুধুমাত্র একটি সোর্স-লেভেল ব্রেকিং চেঞ্জ যা ভবিষ্যতে সোর্স-লেভেল ব্রেকিং চেঞ্জ এড়াতে সাহায্য করবে, কিন্তু এর মানে হলো ব্লক মেথডগুলোকে
CommonExtensionথেকেApplicationExtension,LibraryExtension,DynamicFeatureExtensionএবংTestExtensionএ স্থানান্তর করতে হবে।আপনার প্রজেক্ট AGP 9.0-এ আপগ্রেড করার সময়, সেইসব Gradle প্লাগইন কোড রিফ্যাক্টর করুন যেগুলো ঐ প্যারামিটার বা ব্লক মেথডগুলো ব্যবহার করে। উদাহরণস্বরূপ, নিম্নলিখিত প্লাগইনটি টাইপ প্যারামিটারটি সরিয়ে দিতে এবং অপসারিত ব্লক মেথডগুলোর উপর নির্ভর না করার জন্য আপডেট করা হয়েছে:
এজিপি ৮.১৩
val commonExtension: CommonExtension<*, *, *, *, *, *> = extensions.getByType(CommonExtension::class) commonExtension.apply { defaultConfig { minSdk { version = release(28) } } }এজিপি ৯.০
val commonExtension: CommonExtension = extensions.getByType(CommonExtension::class) commonExtension.apply { defaultConfig.apply { minSdk { version = release(28) } } }যেসব প্লাগইন বিভিন্ন AGP সংস্করণকে লক্ষ্য করে তৈরি, সেগুলোর ক্ষেত্রে সরাসরি গেটার ব্যবহার করা 9.0-এর কম AGP সংস্করণগুলোর সাথে বাইনারিভাবে সামঞ্জস্যপূর্ণ।
ডিএসএল সরানো হয়েছে
অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৯.০ থেকে বাদ দেওয়া হয়েছে:
AndroidSourceSet.jni, কারণ এটি কার্যকর ছিল না।AndroidSourceSet.wearAppConfigurationName, যা অপসারিত এমবেডেড Wear OS অ্যাপ সাপোর্টের সাথে সম্পর্কিত।BuildType.isRenderscriptDebuggable, কারণ এটি কার্যকরী ছিল না।DependencyVariantSelectionDependencySelectionদ্বারা প্রতিস্থাপন করা হয়েছে, যাkotlin.android.localDependencySelectionহিসেবে প্রকাশিত হয়।Installation.installOptions(String). এটিInstallation.installOptions-এর পরিবর্তনযোগ্য প্রপার্টি দ্বারা প্রতিস্থাপিত হয়।পরীক্ষামূলক, কিন্তু কখনো স্থিতিশীল না হওয়া
PostProcessingব্লক।ProductFlavor.setDimension, যাdimensionপ্রপার্টি দ্বারা প্রতিস্থাপিত হয়।LanguageSplitOptions, যা শুধুমাত্র Google Play Instant-এর জন্য কার্যকর ছিল, যা এখন অপ্রচলিত।DensitySplit, কারণ ফিচারটি আর সমর্থিত নয়। এর বিকল্প হিসেবে App Bundles ব্যবহার করতে হবে।
অপসারিত এপিআই
অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৯.০ থেকে বাদ দেওয়া হয়েছে:
AndroidComponentsExtension.finalizeDSl. এটিfinalizeDslদ্বারা প্রতিস্থাপিত হয়।Component.transformClassesWithএর পরিবর্তেInstrumentation.transformClassesWithব্যবহৃত হয়।Component.setAsmFramesComputationModeকেInstrumentation.setAsmFramesComputationModeদ্বারা প্রতিস্থাপন করা হয়।ComponentBuilder.enabledএর পরিবর্তেComponentBuilder.enableব্যবহৃত হয়।DependenciesInfoBuilder.includedInApkকেincludeInApkদ্বারা প্রতিস্থাপন করা হয়েছে।DependenciesInfoBuilder.includedInBundleএর পরিবর্তেincludeInBundleব্যবহৃত হয়।GeneratesApk.targetSdkVersion. Is কেtargetSdkদ্বারা প্রতিস্থাপন করা হয়।Variant.minSdkVersion. Is কেminSdkদ্বারা প্রতিস্থাপন করা হয়।Variant.maxSdkVersion. Is কেmaxSdkদ্বারা প্রতিস্থাপন করা হয়।Variant.targetSdkVersion. Is কেtargetSdkদ্বারা প্রতিস্থাপন করা হয়।Variant.unitTest, কারণ এটিcom.android.testপ্লাগইনের জন্য প্রযোজ্য ছিল না।unitTestসেইসবVariantBuilderসাবটাইপে উপলব্ধ যাHasUnitTestএক্সটেন্ড করে।লাইব্রেরিতে
VariantBuilder.targetSdkএবংtargetSdkPreviewঅর্থবহ ছিল না। এর পরিবর্তেGeneratesApkBuilder.targetSdkঅথবাGeneratesApkBuilder.targetSdkPreviewব্যবহার করুন।VariantBuilder.enableUnitTest, কারণ এটিcom.android.testপ্লাগইনের জন্য প্রযোজ্য ছিল না।enableUnitTestসেইসবVariantBuilderসাবটাইপে উপলব্ধ যাHasUnitTestBuilderএক্সটেন্ড করে।HasUnitTestBuilderএক্সটেন্ড করাVariantBuilderসাবটাইপগুলো থেকেVariantBuilder.unitTestEnabledসরিয়ে দিয়ে এর পরিবর্তে আরও সামঞ্জস্যপূর্ণ নামেরenableUnitTestব্যবহার করা হয়।VariantOutput.enable. Is কেenabledদ্বারা প্রতিস্থাপন করা হয়েছে।অপ্রচলিত এবং নিষ্ক্রিয়
FeaturePluginএবংFeatureExtension।অপ্রচলিত এবং নিষ্ক্রিয়
BaseExtension.registerTransformAPI-গুলো শুধুমাত্র AGP 4.2 বা তার নিম্ন সংস্করণে চালানোর লক্ষ্য নিয়ে সর্বশেষ AGP সংস্করণের সাথে কম্পাইল করার অনুমতি দেওয়ার জন্য রাখা হয়েছিল।
গ্রেডল প্রোপার্টিগুলো সরানো হয়েছে
নিম্নলিখিত গ্রেডল প্রোপার্টিগুলো প্রাথমিকভাবে এমন ফিচারগুলোকে বিশ্বব্যাপী নিষ্ক্রিয় করার উপায় হিসেবে যোগ করা হয়েছিল, যেগুলো ডিফল্টরূপে সক্রিয় ছিল।
AGP 8.0 বা তার নিম্ন সংস্করণ থেকে এই বৈশিষ্ট্যগুলি ডিফল্টরূপে নিষ্ক্রিয় করা হয়েছে। আরও কার্যকর বিল্ডের জন্য, শুধুমাত্র সেই সাব-প্রজেক্টগুলিতে এই বৈশিষ্ট্যগুলি সক্রিয় করুন যেগুলি এগুলি ব্যবহার করে।
| সম্পত্তি | ফাংশন | প্রতিস্থাপন |
|---|---|---|
android. defaults. buildfeatures. aidl | সকল সাবপ্রজেক্টে AIDL কম্পাইলেশন সক্ষম করে। | শুধুমাত্র সেই সাবপ্রজেক্টগুলিতে AIDL কম্পাইলেশন সক্রিয় করতে, যেখানে AIDL সোর্স রয়েছে, সেই প্রজেক্টগুলির Gradle বিল্ড ফাইলে নিম্নলিখিত প্রপার্টিটি সেট করুন:android {
buildFeatures {
aidl = true
}
} |
android. defaults. buildfeatures. renderscript | সকল সাবপ্রজেক্টে RenderScript কম্পাইলেশন সক্ষম করে। | শুধুমাত্র সেই সাবপ্রজেক্টগুলিতে রেন্ডারস্ক্রিপ্ট কম্পাইলেশন সক্রিয় করতে, যেখানে রেন্ডারস্ক্রিপ্ট সোর্স রয়েছে, সেই প্রজেক্টগুলির গ্রেডল বিল্ড ফাইলে নিম্নলিখিত প্রপার্টিটি সেট করুন: android {
buildFeatures {
renderScript = true
}
} |
বাধ্যতামূলক গ্রেডল বৈশিষ্ট্য
নিম্নলিখিত গ্রেডল প্রোপার্টিগুলো সেট করলে AGP 9.0 একটি এরর দেখায়।
অ্যান্ড্রয়েড গ্র্যাডল প্লাগইন আপগ্রেড অ্যাসিস্ট্যান্ট সেইসব প্রোজেক্টকে AGP 9.0-এ আপগ্রেড করবে না, যেগুলোতে এই প্রোপার্টিগুলো ব্যবহৃত হয়।
| সম্পত্তি | ফাংশন |
|---|---|
android. r8. integratedResourceShrinking | R8-এর অংশ হিসেবে রিসোর্স সঙ্কুচিতকরণ এখন সর্বদা চালিত হয়, পূর্ববর্তী বাস্তবায়নটি সরিয়ে দেওয়া হয়েছে। |
android. enableNewResourceShrinker. preciseShrinking | রিসোর্স সঙ্কুচিত করার ক্ষেত্রে এখন সর্বদা সুনির্দিষ্ট পদ্ধতি ব্যবহার করা হয়, যার ফলে আরও বেশি রিসোর্স অপসারণ করা সম্ভব হয়। |
R8 পরিবর্তন
AGP 9.0.0-এ নিম্নলিখিত R8 পরিবর্তনগুলি অন্তর্ভুক্ত করা হয়েছে।
নতুন কনফিগারেশন বিকল্প -processkotlinnullchecks
কোটলিন নাল চেক প্রসেস করার জন্য R8 কনফিগার করতে আমরা নতুন R8 অপশন -processkotlinnullchecks যোগ করেছি। এই অপশনটির জন্য একটি আবশ্যিক আর্গুমেন্ট প্রয়োজন, যা অবশ্যই নিম্নলিখিত তিনটি মানের মধ্যে একটি হতে হবে: keep , remove_message এবং remove । এই অপশনটি কোটলিন কম্পাইলার দ্বারা যোগ করা নিম্নলিখিত নাল চেকগুলো প্রসেস করে:
class kotlin.jvm.internal.Intrinsics {
void checkNotNull(java.lang.Object);
void checkNotNull(java.lang.Object, java.lang.String);
void checkExpressionValueIsNotNull(
java.lang.Object, java.lang.String);
void checkNotNullExpressionValue(
java.lang.Object, java.lang.String);
void checkReturnedValueIsNotNull(
java.lang.Object, java.lang.String);
void checkReturnedValueIsNotNull(
java.lang.Object, java.lang.String, java.lang.String);
void checkFieldIsNotNull(java.lang.Object, java.lang.String);
void checkFieldIsNotNull(
java.lang.Object, java.lang.String, java.lang.String);
void checkParameterIsNotNull(java.lang.Object, java.lang.String);
void checkNotNullParameter(java.lang.Object, java.lang.String);
}
দুর্বলতম থেকে শক্তিশালীতম ক্রমে সাজানো অপশন মানগুলোর নিম্নলিখিত প্রভাব রয়েছে:
-
keepচেকগুলো পরিবর্তন করে না। -
remove_messageপ্রতিটি চেক মেথড কলকে তার প্রথম আর্গুমেন্টের উপরgetClass()কলে পরিবর্তন করে (কার্যত নাল চেকটি বজায় রাখে, কিন্তু কোনো মেসেজ ছাড়াই)। -
removeবিকল্পটি চেকগুলো সম্পূর্ণরূপে মুছে দেয়।
ডিফল্টরূপে R8 remove_message ব্যবহার করে। -processkotlinnullchecks নির্দিষ্ট করলে তা এটিকে অগ্রাহ্য করবে। একাধিকবার নির্দিষ্ট করা হলে সবচেয়ে শক্তিশালী মানটি ব্যবহৃত হয়।
প্রচার বন্ধ করুন, সঙ্গীদের কাছে তথ্য রাখার পদ্ধতি।
যখন কিপ রুলগুলো ডিসুগারিং-এর অধীন ইন্টারফেস মেথডগুলোর সাথে মিলে যায়, তখন R8 পূর্বে অভ্যন্তরীণভাবে ডিসঅ্যালাউ অপটিমাইজেশন এবং ডিসঅ্যালাউ শ্রিংকিং বিটগুলোকে সিন্থেসাইজড কম্প্যানিয়ন মেথডগুলোতে স্থানান্তর করত।
AGP 9.0 থেকে শুরু করে, কম্প্যানিয়ন মেথডগুলোর ক্ষেত্রে কিপ রুল আর প্রযোজ্য নয়। এটি এই সত্যের সাথে সামঞ্জস্যপূর্ণ যে, অন্যান্য কম্পাইলার সিন্থেসাইজড ফিল্ড/মেথড/ক্লাসের ক্ষেত্রেও কিপ রুল প্রযোজ্য নয়।
disallow অপটিমাইজেশন এবং disallow শ্রিংকিং বিটগুলিকে কম্প্যানিয়ন মেথডগুলিতে স্থানান্তর করার মাধ্যমে, নিম্নলিখিত ব্যবহারের ক্ষেত্রটি পূর্বে সমর্থিত ছিল:
-
minSdk< 24 এবং ইন্টারফেস মেথডগুলো অক্ষুণ্ণ রাখার নিয়ম মেনেdefault/static/privateইন্টারফেস মেথডসহ একটি লাইব্রেরি DEX-এ কম্পাইল করুন। - ক্লাসপাথে লাইব্রেরিটি এবং
-applymappingযুক্ত করে অ্যাপটি কম্পাইল করুন। - অ্যাপ এবং লাইব্রেরি একীভূত করুন।
উল্লেখ্য যে, এটি শুধুমাত্র -applymapping এর সাথেই কাজ করে, কারণ disallow obfuscation বিটটি কম্প্যানিয়ন মেথডগুলিতে স্থানান্তরিত হয় না—অর্থাৎ, ধাপ ১ থেকে তৈরি হওয়া কম্প্যানিয়ন ক্লাসগুলির মেথডের নামগুলি অবফাসকেটেড থাকবে।
এখন থেকে minSdk < 24-এর জন্য এই ব্যবহারের ক্ষেত্রটি আর সমর্থিত নয়। এর বিকল্প সমাধান হলো নিম্নলিখিত পদক্ষেপগুলো অনুসরণ করা:
-
default/static/privateইন্টারফেস মেথডসহ লাইব্রেরিটিকেminSdk< 24 শর্তযুক্ত ক্লাস ফাইলে ডিসুগার করুন। - R8 এবং এমন নিয়ম ব্যবহার করে ডিসুগারড আর্টিফ্যাক্টটি কম্পাইল করুন যা কম্প্যানিয়ন ক্লাসগুলিতে ইন্টারফেস মেথডগুলি বজায় রাখে।
- ক্লাসপাথে লাইব্রেরিটি রেখে অ্যাপটি কম্পাইল করুন।
- অ্যাপ এবং ডিসুগারড আর্টিফ্যাক্টটি মার্জ করুন।
এর আরেকটি পার্শ্বপ্রতিক্রিয়া হলো যে, ইন্টারফেস কম্প্যানিয়ন মেথডের ভিতরে অ্যানোনিমাস এবং লোকাল ক্লাসের জন্য ইনার ক্লাস এবং এনক্লোজিং মেথড অ্যাট্রিবিউটগুলো আর রাখা সম্ভব হয় না।
ডিফল্ট নির্গত উৎস ফাইলটি r8-map-id-<MAP_ID> এ পরিবর্তন করুন।
এই পরিবর্তনটি AGP 8.12.0 সংস্করণ থেকে কার্যকর হয়েছে।
যখন রিট্রেসিং-এর প্রয়োজন হয় (অর্থাৎ, যখন অবফাসকেশন বা অপটিমাইজেশন সক্রিয় করা থাকে), তখন একটি ক্লাসের ডিফল্ট নির্গত সোর্স ফাইল অ্যাট্রিবিউট SourceFile থেকে r8-map-id-<MAP_ID> তে পরিবর্তিত হয়।
একটি অস্পষ্ট স্ট্যাক ট্রেস দেওয়া থাকলে, নতুন সোর্স ফাইল অ্যাট্রিবিউটটি রিট্রেসিংয়ের জন্য প্রয়োজনীয় ম্যাপিং ফাইলের আইডি বের করা সম্ভব করে তোলে, যা লগক্যাটে স্ট্যাক ট্রেসের স্বয়ংক্রিয় রিট্রেসিং সমর্থন করতে ব্যবহার করা যেতে পারে।
যদি একটি কাস্টম সোর্স ফাইল অ্যাট্রিবিউট ব্যবহার করা হয় ( -renamesourcefileattribute ), তাহলে এই কাস্টম সোর্স ফাইল অ্যাট্রিবিউটটিই অগ্রাধিকার পেতে থাকে।
ProGuard কম্প্যাটিবিলিটি মোডে (যখন gradle.properties ফাইলে android.enableR8.fullMode=false থাকে), r8-map-id-<MAP_ID> সোর্স ফাইল অ্যাট্রিবিউটটি তখনই কার্যকর হয়, যদি SourceFile অ্যাট্রিবিউটটি রাখা না হয়। যে অ্যাপগুলো ProGuard কম্প্যাটিবিলিটি মোড ব্যবহার করে এবং তাদের স্ট্যাক ট্রেসে ম্যাপিং ফাইল আইডি অন্তর্ভুক্ত করতে চায়, -keepattributes SourceFile সরিয়ে ফেলা উচিত (অথবা R8 ফুল মোডে মাইগ্রেট করা উচিত)।
r8-map-id-<MAP_ID> এ ব্যবহৃত ম্যাপ আইডিটি হলো সম্পূর্ণ ম্যাপ হ্যাশ, এবং এটি ম্যাপ হ্যাশের ৭ অক্ষরের কোনো প্রিফিক্স নয়, যা পূর্বে ব্যবহৃত হতো।
L8 ডিসুগারিং-এ সংক্ষিপ্ত সিন্থেটিক নাম ব্যবহার সক্ষম করুন
D8 দ্বারা জেনারেট করা সিন্থেটিক ক্লাসগুলোর নামে সাধারণত $$ExternalSynthetic সাবস্ট্রিংটি থাকে, যা থেকে বোঝা যায় এটি D8 দ্বারা জেনারেট করা একটি সিন্থেটিক। এছাড়াও, সিন্থেটিকটির নাম তার ধরনও (যেমন, Backport , Lambda ) এনকোড করে। এর ফলে চূড়ান্ত DEX ফাইলের আকারের উপর একটি নেতিবাচক প্রভাব পড়ে, কারণ ক্লাসের নামগুলো স্ট্রিং পুলে বেশি জায়গা নেয়।
AGP 9.0, L8 (কোর লাইব্রেরি ডিসুগারিং) এমনভাবে কনফিগার করে যাতে সমস্ত j$ ক্লাস ধারণকারী DEX ফাইলটি সিন্থেটিক ক্লাসগুলির জন্য একটি নতুন সংক্ষিপ্ত ক্লাস নামের ফরম্যাট ব্যবহার করে। নতুন ক্লাস নামটি একটি সংখ্যাসূচক আইডি ব্যবহার করে (উদাহরণস্বরূপ, $1 )।
-addconfigurationdebugging এর জন্য সমর্থন সরান
AGP 9.0 থেকে -addconfigurationdebugging ফ্ল্যাগটির সাপোর্ট তুলে নেওয়া হয়েছে। এখন এই ফ্ল্যাগটি ব্যবহার করা হলে কম্পাইলার একটি সতর্কবার্তা দেখায়।
D8/R8 থেকে L8 নিয়ম তৈরির সমর্থন সরিয়ে ফেলুন
এই পরিবর্তনটি শুধুমাত্র সেইসব ডেভেলপারদের জন্য প্রযোজ্য, যারা সরাসরি D8/R8 কমান্ড লাইন বা এপিআই (API) ব্যবহার করেন।
R8 9.0 সংস্করণে D8 এবং R8 থেকে L8-এর জন্য কিপ রুল তৈরি করার সমর্থন তুলে নেওয়া হয়েছে। এর পরিবর্তে, এই কাজের জন্য আপনার TraceReferences ব্যবহার করা উচিত।
আরও নির্দিষ্টভাবে বলতে গেলে, D8Command.builder.setDesugaredLibraryKeepRuleConsumer এবং R8Command.Builder.setDesugaredLibraryKeepRuleConsumer মেথডগুলো সরিয়ে ফেলা হয়েছে, এবং D8 ও R8-এর কমান্ড লাইন অপশনগুলো থেকে --desugared-lib-pg-conf-output এর সাপোর্ট তুলে নেওয়া হয়েছে।
সমাধান করা সমস্যাগুলি
অ্যান্ড্রয়েড গ্রেডল প্লাগইন 9.0.0
| সমাধান করা সমস্যাগুলি | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| অ্যান্ড্রয়েড গ্রেডল প্লাগইন |
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| লিন্ট |
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| লিন্ট ইন্টিগ্রেশন |
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| সঙ্কোচনকারী (R8) |
| |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||