Android Gradle প্লাগ-ইন 9.0.1 (জানুয়ারি ২০২৬)

Android Gradle প্লাগ-ইন 9.0 হল একটি বড় রিলিজ যা API এবং আচরণে পরিবর্তন নিয়ে আসে।

Android Gradle প্লাগ-ইন 9.0.1-এ আপডেট করতে, Android Gradle প্লাগ-ইন আপগ্রেড অ্যাসিস্ট্যান্ট ব্যবহার করুন। AGP আপগ্রেড অ্যাসিস্ট্যান্ট আপনার প্রজেক্ট আপগ্রেড করার সময় উপযুক্ত হলে আগেকার আচরণ বজায় রাখতে সাহায্য করে, তাই AGP 9.0-এর সব নতুন ডিফল্ট গ্রহণ করার জন্য প্রস্তুত না থাকলেও আপনি AGP 9.0 ব্যবহার করার জন্য নিজের প্রজেক্ট আপগ্রেড করতে পারবেন।

আপগ্রেড করার প্রসেস আরও সহজ করতে, দুটি এজেন্ট স্কিলও উপলভ্য আছে। KMP নয় এমন অ্যাপের জন্য, Android স্কিল রিপোজিটরি থেকে AGP 9 আপগ্রেড স্কিল ব্যবহার করে দেখুন। KMP অ্যাপের জন্য, JetBrains-এর AGP 9 আপগ্রেড দক্ষতা ব্যবহার করে দেখুন। Android Studio-তে স্কিল ব্যবহার করা সম্পর্কে আরও জানতে, স্কিলের মাধ্যমে এজেন্ট মোড এক্সটেন্ড করা দেখুন।

মানানসই

Android Gradle plugin 9.0-এর সাথে কাজ করে এমন সর্বাধিক API লেভেল হল API লেভেল 36.1. এখানে অন্যান্য কম্প্যাটিবিলিটি সংক্রান্ত তথ্য দেওয়া হল:

ন্যূনতম ভার্সন ডিফল্ট ভার্সন নোট
Gradle 9.1.0 9.1.0 আরও জানতে, Gradle আপডেট করা দেখুন।
SDK Build Tools ৩৬.০.০ ৩৬.০.০ SDK বিল্ড টুল ইনস্টল বা কনফিগার করুন।
NDK N/A 28.2.13676358 NDK-এর অন্য কোনও ভার্সন ইনস্টল বা কনফিগার করুন।
JDK 17 17 আরও জানতে, JDK ভার্সন সেট করা দেখুন।
Kotlin Gradle প্লাগ-ইন (KGP) ২.২.১০ ২.২.১০ আরও জানতে, Kotlin Gradle প্লাগ-ইনের উপর রানটাইম নির্ভরতা দেখুন।

android DSL ক্লাস এখন শুধুমাত্র নতুন পাবলিক ইন্টারফেস প্রয়োগ করে

গত কয়েক বছর ধরে, আমরা DSL ও API-এর জন্য নতুন ইন্টারফেস চালু করেছি যাতে কোন API সর্বজনীন হবে তা আরও ভালোভাবে নিয়ন্ত্রণ করা যায়। AGP ভার্সন ৭.x ও ৮.x এখনও পুরনো DSL ধরন (যেমন BaseExtension) ব্যবহার করে যা নতুন পাবলিক ইন্টারফেসও প্রয়োগ করে, যাতে ইন্টারফেসের কাজ এগিয়ে নিয়ে যাওয়ার সময় সামঞ্জস্য বজায় রাখা যায়।

AGP 9.0 শুধুমাত্র আমাদের নতুন DSL ইন্টারফেস ব্যবহার করে, এবং প্রয়োগ করার পদ্ধতি পরিবর্তন করে নতুন ধরনের করা হয়েছে যা সম্পূর্ণভাবে লুকানো থাকে। এছাড়াও, এটি পুরনো, অননুমোদিত ভ্যারিয়েন্ট API-তে অ্যাক্সেস সরিয়ে দেয়।

AGP 9.0-তে আপডেট করতে, আপনাকে হয়ত নিম্নলিখিত কাজগুলি করতে হবে:

  • আপনার প্রোজেক্ট বিল্ট-ইন Kotlin-এর সাথে মানানসই কিনা তা নিশ্চিত করুন: নতুন DSL-এর সাথে org.jetbrains.kotlin.android প্লাগ-ইন মানানসই নয়।
  • KMP প্রোজেক্টকে KMP-এর জন্য Android Gradle Library Plugin-এ পরিবর্তন করুন: com.android.library এবং com.android.application প্লাগ-ইনের মতো একই Gradle সাবপ্রোজেক্টে org.jetbrains.kotlin.multiplatform প্লাগ-ইন ব্যবহার করা নতুন DSL-এর সাথে মানানসই নয়।

  • আপনার বিল্ড ফাইল আপডেট করুন: ইন্টারফেসের পরিবর্তন DSL-কে যতটা সম্ভব একই রকম রাখার জন্য করা হলেও, এর মধ্যে কিছু ছোটখাটো পরিবর্তন থাকতে পারে।

  • নতুন DSL ও API-কে রেফারেন্স হিসেবে ব্যবহার করার জন্য আপনার কাস্টম বিল্ড লজিক আপডেট করুন: ইন্টার্নাল DSL-এর যেকোনও রেফারেন্সকে পাবলিক DSL ইন্টারফেস দিয়ে পাল্টে দিন। বেশিরভাগ ক্ষেত্রে এটি একটির পরিবর্তে একটি হবে। applicationVariants ও একই ধরনের API-এর যেকোনও ব্যবহার নতুন androidComponents API দিয়ে পরিবর্তন করুন। এটি আরও জটিল হতে পারে, কারণ androidComponents API প্লাগ-ইনকে আরও বেশি দিন মানানসই রাখার জন্য আরও স্থিতিশীল করে তোলার জন্য ডিজাইন করা হয়েছে। উদাহরণ দেখতে, আমাদের Gradle রেসিপি দেখুন।

  • থার্ড-পার্টি প্লাগ-ইন আপডেট করুন: কিছু থার্ড-পার্টি প্লাগ-ইন এখনও ইন্টারফেস বা API-এর উপর নির্ভর করতে পারে যেগুলি আর এক্সপোজ করা হয় না। AGP 9.0-এর সাথে মানানসই সেইসব প্লাগ-ইনের ভার্সনে মাইগ্রেট করুন।

নতুন DSL ইন্টারফেসে পরিবর্তন করার ফলে, প্লাগ-ইন ও Gradle বিল্ড স্ক্রিপ্ট বিভিন্ন পুরনো API ব্যবহার করতে পারে না, এর মধ্যে এগুলি অন্তর্ভুক্ত:

android ব্লকে অননুমোদিত API ফাংশন পরিবর্ত
applicationVariants,
libraryVariants,
testVariants এবং
unitTestVariants
AGP-তে নতুন কার্যকারিতা যোগ করার জন্য প্লাগ-ইনের এক্সটেনশন পয়েন্ট। এর পরিবর্তে androidComponents.onVariants API ব্যবহার করুন, যেমন:
androidComponents {
    onVariants() { variant ->
        variant.signingConfig
            .enableV1Signing.set(false)
    }
}
আগের সব API-এর সরাসরি রিপ্লেসমেন্ট নাও থাকতে পারে। নতুন ভ্যারিয়েন্ট API-তে কভার করা হয়নি এমন কোনও ব্যবহারের ক্ষেত্র থাকলে সমস্যা জানান।
variantFilter বেছে নেওয়া ভেরিয়েন্ট বন্ধ করার অনুমতি দেয়। এর পরিবর্তে androidComponents.beforeVariants API ব্যবহার করুন, যেমন:
androidComponents {
    beforeVariants(
        selector()
            .withBuildType("debug")
            .withFlavor("color", "blue")
    ) { variantBuilder ->
        variantBuilder.enable = false
    }
  }
deviceProvider এবং
testServer
Android ডিভাইস ও এমুলেটরের বিরুদ্ধে পরীক্ষা চালানোর জন্য কাস্টম টেস্ট এনভায়রনমেন্টের রেজিস্ট্রেশন। Gradle-ম্যানেজ করা ডিভাইসে পাল্টে নিন।
sdkDirectory,
ndkDirectory,
bootClasspath,
adbExecutable এবং
adbExe
কাস্টম টাস্কের জন্য Android SDK-এর বিভিন্ন কম্পোনেন্ট ব্যবহার করা। androidComponents.sdkComponents-এ পরিবর্তন করুন।
registerArtifactType,
registerBuildTypeSourceProvider,
registerProductFlavorSourceProvider,
registerJavaArtifact,
registerMultiFlavorSourceProvider এবং
wrapJavaSourceSet
পুরনো হয়ে যাওয়া ফাংশনালিটি বেশিরভাগ ক্ষেত্রেই Android Studio-তে জেনারেট করা সোর্স ম্যানেজ করার সাথে সম্পর্কিত, যা AGP 7.2.0-এ কাজ করা বন্ধ করে দিয়েছে। এইসব API-এর কোনও সরাসরি বিকল্প নেই।
dexOptions dx টুলের সাথে সম্পর্কিত পুরনো সেটিংস, যা d8-এর মাধ্যমে পরিবর্তন করা হয়েছে। Android Gradle প্লাগ-ইন 7.0 থেকে কোনও সেটিংসের কোনও প্রভাব পড়েনি। এর কোনও সরাসরি বিকল্প নেই।
generatePureSplits ইনস্ট্যান্ট অ্যাপের জন্য কনফিগারেশন স্প্লিট তৈরি করা। কনফিগারেশন স্প্লিট শিপ করার ক্ষমতা এখন Android অ্যাপ বান্ডেলে বিল্ট-ইন করা আছে।
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.4 আপনাকে আলাদা আলাদা মডিউল অপ্ট-আউট করতে দেয়। কীভাবে তা জানুন, Variant API মডিউল অপ্ট-আউট দেখুন।

AGP 9.0-এ আগের ক্লাসগুলি 'সঞ্চালনের অনুপযুক্ত' হিসেবে চিহ্নিত করা হয়েছে। এর অর্থ হল, newDsl ফ্ল্যাগ থেকে অপ্ট-আউট করা প্রোজেক্ট android ব্লক সহ ডেপ্রিকেশন সংক্রান্ত সতর্কতা দেখতে পাবে।

এছাড়াও, AGP 9.0-তে আপগ্রেড করার আগে আপনি নতুন API-তে আপগ্রেড করা শুরু করতে পারবেন। নতুন ইন্টারফেসগুলি অনেক AGP ভার্সনে উপস্থিত রয়েছে এবং তাই আপনার কাছে নতুন এবং পুরনো ইন্টারফেসের মিশ্রণ থাকতে পারে। AGP API রেফারেন্স ডকুমেন্ট প্রতিটি AGP ভার্সনের জন্য API সারফেস এবং প্রতিটি ক্লাস, মেথড ও ফিল্ড কখন যোগ করা হয়েছে তা দেখায়।

সাধারণত ব্যবহৃত প্লাগ-ইনগুলির লেখকদের সাথে যোগাযোগ করে তাদের নতুন মোডের সাথে মানিয়ে নিতে এবং সম্পূর্ণভাবে মানানসই প্লাগ-ইন রিলিজ করতে সাহায্য করছি। এছাড়াও, মাইগ্রেশন প্রক্রিয়াতে আপনাকে গাইড করার জন্য Android Studio-তে AGP আপগ্রেড অ্যাসিস্ট্যান্টকে আরও উন্নত করার কাজ চালিয়ে যাব।

আপনি যদি দেখেন যে নতুন DSL বা Variant API-তে কোনও ক্ষমতা বা ফিচার নেই, তাহলে যত তাড়াতাড়ি সম্ভব একটি সমস্যা ফাইল করুন।

বিল্ট-ইন Kotlin

Android Gradle প্লাগ-ইন 9.0 বিল্ট-ইন Kotlin সহায়তা নিয়ে আসে এবং ডিফল্ট হিসেবে এটি চালু করে । এর অর্থ হল, Kotlin সোর্স ফাইল কম্পাইল করার জন্য আপনাকে আর বিল্ড ফাইলেorg.jetbrains.kotlin.android (বা kotlin-android) প্লাগ-ইন প্রয়োগ করতে হবে না। এটি AGP-র সাথে Kotlin ইন্টিগ্রেশনকে সহজ করে, পুরনো হয়ে যাওয়া API-এর ব্যবহার এড়ায় এবং কিছু ক্ষেত্রে পারফর্ম্যান্স উন্নত করে।

তাই, আপনার প্রোজেক্ট AGP 9.0-তে আপগ্রেড করলে, আপনাকেও বিল্ট-ইন Kotlin-এ মাইগ্রেট করতে হবে অথবা অপ্ট-আউট করতে হবে।

এছাড়াও, Kotlin সোর্স নেই এমন Gradle সাবপ্রজেক্টের জন্য আপনি বেছে বেছে বিল্ট-ইন Kotlin সাপোর্ট বন্ধ করতে পারবেন।

Kotlin Gradle প্লাগ-ইনের উপর রানটাইম নির্ভরতা

বিল্ট-ইন Kotlin সহায়তা প্রদান করতে, Android Gradle প্লাগ-ইন 9.0-এ এখন Kotlin Gradle প্লাগ-ইন (KGP) 2.2.10-এর উপর রানটাইম নির্ভরতা আছে। এর অর্থ হল, আপনাকে আর KGP ভার্সন ঘোষণা করতে হবে না এবং আপনি 2.2.10-এর থেকে কম KGP ভার্সন ব্যবহার করলে, Gradle অটোমেটিক আপনার KGP ভার্সন 2.2.10-এ আপগ্রেড করে দেবে। একইভাবে, আপনি যদি 2.2.10-2.0.2-এর থেকে কম KSP ভার্সন ব্যবহার করেন, তাহলে KGP ভার্সনের সাথে ম্যাচ করাতে AGP এটিকে 2.2.10-2.0.2-এ আপগ্রেড করবে।

আরও উন্নত 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 ডিফল্ট হিসেবে বিল্ট-ইন Kotlin চালু করে এবং বিল্ট-ইন Kotlin-এর জন্য 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 সাপোর্ট দেওয়া হয়েছে।

ফিউজড লাইব্রেরি প্লাগ-ইন

Fused Library Plugin (Preview) আপনাকে একাধিক লাইব্রেরি একটি Android Library AAR হিসেবে প্রকাশ করতে দেয়। এর ফলে আপনার প্রকাশিত আর্টিফ্যাক্টের উপর নির্ভর করা আপনার ব্যবহারকারীদের পক্ষে সহজ হতে পারে।

শুরু করা সম্পর্কিত তথ্যের জন্য, Fused Library-এর মাধ্যমে একাধিক Android লাইব্রেরি একটি হিসেবে প্রকাশ করুন দেখুন।

আচরণগত পরিবর্তন

Android Gradle প্লাগ-ইন 9.0-তে নিম্নলিখিত নতুন আচরণ রয়েছে:

আচরণ সাজেশন
Android Gradle প্লাগ-ইন 9.0 ডিফল্ট হিসেবে NDK ভার্সন r28c ব্যবহার করে। আপনি যে NDK ভার্সন ব্যবহার করতে চান সেটি স্পষ্টভাবে উল্লেখ করার কথা বিবেচনা করুন।
Android Gradle plugin 9.0 ডিফল্ট হিসেবে লাইব্রেরির কনজিউমারদের একই বা তার পরের কোনও কম্পাইল SDK ভার্সন ব্যবহার করতে বলে। লাইব্রেরি ব্যবহার করার সময় একই বা তার পরের ভার্সনের কম্পাইল SDK ব্যবহার করুন। এটি সম্ভব না হলে অথবা আপনি প্রকাশ করা লাইব্রেরির গ্রাহকদের পরিবর্তন করার জন্য আরও সময় দিতে চাইলে, স্পষ্টভাবে AarMetadata.minCompileSdk সেট করুন।

AGP 9.0-তে নিম্নলিখিত Gradle প্রপার্টির ডিফল্ট ভ্যালু আপডেট করা হয়েছে। আপগ্রেড করার সময় এটি আপনাকে AGP 8.13 আচরণ বজায় রাখার বিকল্প দেয়:

প্রপার্টি ফাংশন AGP 8.13 থেকে AGP 9.0-তে পরিবর্তন করুন সাজেশন
android.newDsl android ব্লকের লিগ্যাসি ইমপ্লিমেন্টেশন প্রকাশ না করেই নতুন DSL ইন্টারফেস ব্যবহার করুন।
এর অর্থ হল, এই ধরনের পুরনো ভেরিয়েন্ট API android.applicationVariants আর অ্যাক্সেস করা যাবে না।
false → true আপনি android.newDsl=false সেটিং করে অপ্ট-আউট করতে পারবেন।
আপনার প্রোজেক্টে ব্যবহৃত সব প্লাগ-ইন ও বিল্ড লজিক মানানসই হয়ে গেলে, অপ্ট-আউট করার সুবিধা সরিয়ে দিন।
android.builtInKotlin এগুলি চালু করে বিল্ট-ইন Kotlin false → true বিল্ট-ইন Kotlin-এ মাইগ্রেট করুন যদি পারেন অথবা বেরিয়ে আসুন।
android.uniquePackageNames প্রতিটি লাইব্রেরির আলাদা প্যাকেজের নাম আছে কিনা তা নিশ্চিত করে। 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 লাইব্রেরি সাবপ্রজেক্ট সহ বিল্ডের ইমপোর্ট করার সময় কমে যায়।
android.enableAppCompileTimeRClass ফাইনাল নয় এমন R ক্লাসের বিরুদ্ধে অ্যাপ্লিকেশনে কোড কম্পাইল করা, এর ফলে অ্যাপ্লিকেশন কম্পাইলেশন লাইব্রেরি কম্পাইলেশনের সাথে সামঞ্জস্যপূর্ণ হয়।
এটি ইনক্রিমেন্টালিটি উন্নত করে এবং রিসোর্স প্রসেসিং ফ্লোতে ভবিষ্যতে পারফর্ম্যান্স অপ্টিমাইজেশনের পথ প্রশস্ত করে।
false → true অনেক প্রোজেক্ট সোর্সে কোনও পরিবর্তন না করেই নতুন আচরণ গ্রহণ করতে পারে। R ক্লাস ফিল্ড যদি এমন কোনও জায়গায় ব্যবহার করা হয় যেখানে কনস্ট্যান্টের প্রয়োজন, যেমন সুইচ কেস, তাহলে চেইন করা if স্টেটমেন্ট ব্যবহার করার জন্য রিফ্যাক্টর করুন।
android.sdk.defaultTargetSdkToCompileSdkIfUnset অ্যাপ ও টেস্টে টার্গেট SDK ভার্সনের ডিফল্ট ভ্যালু হিসেবে কম্পাইল SDK ভার্সন ব্যবহার করে।
এই পরিবর্তনের আগে, টার্গেট SDK ভার্সন ডিফল্ট হিসেবে ন্যূনতম SDK ভার্সন হবে।
false → true অ্যাপ ও পরীক্ষার জন্য টার্গেট SDK ভার্সন স্পষ্টভাবে উল্লেখ করুন।
android.onlyEnableUnitTestForTheTestedBuildType শুধুমাত্র পরীক্ষিত বিল্ড ধরনের জন্য ইউনিট টেস্ট কম্পোনেন্ট তৈরি করে।
ডিফল্ট প্রোজেক্টে এর ফলে ডিবাগ করার জন্য একটি ইউনিট টেস্ট হয়, যেখানে আগের আচরণ ছিল ডিবাগ বা রিলিজের জন্য ইউনিট টেস্ট চালানো।
false → true আপনার প্রোজেক্টে যদি ডিবাগ ও রিলিজ, দু'টির জন্যই টেস্ট চালানোর প্রয়োজন না হয়, তাহলে কোনও পরিবর্তন করার প্রয়োজন নেই।
android.proguard.failOnMissingFiles AGP DSL-এ নির্দিষ্ট করা কোনও কিপ ফাইল ডিস্কে না থাকলে সমস্যা সহ বিল্ডটি সম্পূর্ণ হয় না। এই পরিবর্তনের আগে, ফাইলের নামে টাইপো থাকলে ফাইলটি নীরবে উপেক্ষা করা হত। false → true ভুল proguard ফাইল ঘোষণা সরিয়ে দিন
android.r8.optimizedResourceShrinking ক্লাস ও Android রিসোর্স একসাথে বিবেচনা করে R8-কে কম Android রিসোর্স রাখতে দেয়। false → true আপনার প্রোজেক্টের কিপ সংক্রান্ত নিয়ম ইতিমধ্যেই সম্পূর্ণ হয়ে থাকলে, কোনও পরিবর্তন করার প্রয়োজন নেই।
android.r8.strictFullModeForKeepRules কোনও ক্লাস রাখা হলে, R8-কে ডিফল্ট কনস্ট্রাক্টর অপ্রয়োজনীয়ভাবে না রাখার অনুমতি দেয়। অর্থাৎ, -keep class A আর -keep class A { <init>(); }
বোঝায় না
false → true আপনার প্রোজেক্টের কিপ সংক্রান্ত নিয়ম ইতিমধ্যেই সম্পূর্ণ হয়ে থাকলে, কোনও পরিবর্তন করার প্রয়োজন নেই।

পরিবর্ত করুন -keep class A এর সাথে -keep class A { <init>(); } আপনার প্রজেক্টের কিপ নিয়মে, সেইসব ক্ষেত্রে যেখানে আপনাকে ডিফল্ট কনস্ট্রাক্টর রেখে দিতে হবে।
android.defaults.buildfeatures.resvalues সব সাবপ্রোজেক্টে resValues চালু করে true → false শুধুমাত্র যেসব সাবপ্রোজেক্টে resValues প্রয়োজন, সেগুলিতেই এটি চালু করুন সেইসব প্রোজেক্টের Gradle বিল্ড ফাইলে নিম্নলিখিত সেটিংস প্রয়োগ করে:
android {
  buildFeatures {
    resValues = true
  }
}
android.defaults.buildfeatures.shaders সব সাবপ্রোজেক্টে শেডার কম্পাইলেশন চালু করে true → false শুধুমাত্র সেইসব সাবপ্রোজেক্টে শেডার কম্পাইলেশন চালু করুন যেগুলিতে কম্পাইল করার জন্য শেডার আছে। এর জন্য সেইসব প্রোজেক্টের Gradle বিল্ড ফাইলে নিম্নলিখিতগুলি সেট করুন:
android {
  buildFeatures {
    shaders = true
  }
}
android.r8.proguardAndroidTxt.disallowed AGP 9.0-এ, getDefaultProguardFile() শুধুমাত্র proguard-android-optimize.txt-এ কাজ করবে, proguard-android.txt-এ নয়। proguard-android.txt-এ অন্তর্ভুক্ত ­dontoptimize ফ্ল্যাগ যাতে ভুলবশত ব্যবহার না করা হয়, সেই জন্য এটি করা হয়। false → true আপনি অপ্টিমাইজেশন এড়াতে চাইলে, proguard-android-optimize.txt ব্যবহার করার পাশাপাশি কাস্টম proguardFile-এ ­dontoptimize স্পষ্টভাবে উল্লেখ করতে পারেন। সম্ভব হলে এই ফাইল থেকে ­dontoptimize ফ্ল্যাগ সরিয়ে দিতে ভুলবেন না, কারণ এটি R8 অপ্টিমাইজেশনের সুবিধা কমিয়ে দেয়। না হলে, android.r8.globalOptionsInConsumerRules.disallowed=false সেট করে বেরিয়ে আসুন।
android.r8.globalOptionsInConsumerRules.disallowed AGP 9.0 থেকে, গ্রাহক যদি সমস্যাযুক্ত Proguard কনফিগারেশন সহ ফাইল রাখেন, তাহলে Android লাইব্রেরি এবং ফিচার মডিউল প্রকাশ করা যাবে না। ­dontoptimize বা ­dontobfuscate-এর মতো গ্লোবাল বিকল্প সহ ফাইল গ্রাহক শুধুমাত্র অ্যাপ্লিকেশন মডিউলে ব্যবহার করতে পারবেন এবং লাইব্রেরি ব্যবহারকারীদের জন্য অপ্টিমাইজেশন সুবিধা কমাতে পারে। প্রি-কম্পাইল করা ডিপেন্ডেন্সি (JAR বা AAR)-তে এম্বেড করা থাকলে, Android অ্যাপ মডিউল কম্পাইলেশন নীরবে এই ধরনের যেকোনও গ্লোবাল বিকল্প উপেক্ষা করবে। আপনি 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 যোগ করুন।

সরানো ফিচার

Android Gradle প্লাগ-ইন 9.0 নিম্নলিখিত ফাংশনালিটি সরিয়ে দেয়:

  • এম্বেড করা Wear OS অ্যাপের জন্য সহায়তা
    AGP 9.0 এম্বেড করা Wear OS অ্যাপের জন্য সহায়তা সরিয়ে দেয়, যা আর Play-তে কাজ করে না। এর মধ্যে wearApp কনফিগারেশন এবং AndroidSourceSet.wearAppConfigurationName DSL সরিয়ে দেওয়া অন্তর্ভুক্ত। Wear OS-এ আপনার অ্যাপ কীভাবে প্রকাশ করবেন তা জানতে Wear OS-এ ডিস্ট্রিবিউট করুন দেখুন।
  • androidDependencies ও sourceSets টাস্ক সম্পর্কে অভিযোগ জানান
  • ঘনত্বের উপর ভিত্তি করে স্প্লিট APK সংক্রান্ত সহায়তা
    AGP 9.0 স্ক্রিন ঘনত্বের উপর ভিত্তি করে স্প্লিট APK তৈরি করার সহায়তা সরিয়ে দেয়। কার্যকারিতা এবং সম্পর্কিত API সরিয়ে দেওয়া হয়েছে। AGP 9.0 বা তার পরের যেকোনও ভার্সন ব্যবহার করে স্ক্রিন ডেনসিটি অনুযায়ী APK স্প্লিট করতে, অ্যাপ বান্ডেল ব্যবহার করুন।

পরিবর্তিত DSL

Android Gradle প্লাগ-ইন 9.0-তে নিম্নলিখিত DSL পরিবর্তনগুলি করা হয়েছে:

  • CommonExtension-এর প্যারামিটারাইজেশন সরিয়ে দেওয়া হয়েছে।

    এটি শুধুমাত্র সোর্স-লেভেল ব্রেকিং পরিবর্তন যা ভবিষ্যতে সোর্স-লেভেল ব্রেকিং পরিবর্তন এড়াতে সাহায্য করে, কিন্তু এর অর্থ হল যে ব্লক করার পদ্ধতিগুলি CommonExtension থেকে ApplicationExtension, LibraryExtension, DynamicFeatureExtension এবং TestExtension-এ সরাতে হবে।

    আপনার প্রোজেক্টকে AGP 9.0-তে আপগ্রেড করার সময়, সেইসব প্যারামিটার বা ব্লক পদ্ধতি ব্যবহার করে এমন Gradle প্লাগ-ইন কোড রিফ্যাক্টর করুন। যেমন, নিম্নলিখিত প্লাগ-ইনটি টাইপ প্যারামিটার সরানোর জন্য আপডেট করা হয়েছে এবং সরানো ব্লক পদ্ধতির উপর নির্ভর করে না:

    AGP 8.13

    val commonExtension: CommonExtension<*, *, *, *, *, *> =
            extensions.getByType(CommonExtension::class)
    commonExtension.apply {
        defaultConfig {
            minSdk {
                version = release(28)
            }
        }
    }
    

    AGP 9.0

    val commonExtension: CommonExtension =
            extensions.getByType(CommonExtension::class)
    commonExtension.apply {
        defaultConfig.apply {
            minSdk {
                version = release(28)
            }
        }
    }
    

    যেসব প্লাগ-ইন AGP ভার্সনের একটি রেঞ্জকে টার্গেট করে, সেগুলির জন্য সরাসরি গেটার ব্যবহার করলে ৯.০-এর আগের AGP ভার্সনের সাথে বাইনারি মানানসই হয়।

সরানো DSL

Android Gradle প্লাগ-ইন 9.0 এগুলি সরিয়ে দেয়:

সরিয়ে দেওয়া API

Android Gradle প্লাগ-ইন 9.0 এগুলি সরিয়ে দেয়:

সরিয়ে দেওয়া Gradle প্রপার্টি

ডিফল্ট হিসেবে চালু থাকা ফিচারগুলি বিশ্বব্যাপী বন্ধ করার উপায় হিসেবে নিম্নলিখিত Gradle প্রপার্টিগুলি প্রাথমিকভাবে যোগ করা হয়েছিল।

AGP 8.0 বা এর আগের ভার্সন থেকে এইসব ফিচার সাধারণত বন্ধ থাকে। আরও দক্ষ বিল্ডের জন্য শুধুমাত্র সেইসব সাব-প্রোজেক্টে এই ফিচারগুলি চালু করুন যেগুলিতে সেগুলি ব্যবহার করা হয়।

প্রপার্টি ফাংশন পরিবর্ত
android.defaults.buildfeatures.aidl সব সাবপ্রোজেক্টে AIDL কম্পাইলেশন চালু করে শুধুমাত্র সেইসব সাবপ্রোজেক্টে AIDL কম্পাইলেশন চালু করুন যেখানে AIDL সোর্স আছে সেইসব প্রোজেক্টের Gradle বিল্ড ফাইলে নিম্নলিখিত প্রপার্টি সেট করে:
android {
  buildFeatures {
    aidl = true
  }
}
AIDL সোর্স থাকা প্রতিটি সাবপ্রোজেক্টের Gradle বিল্ড ফাইলে
android.defaults.buildfeatures.renderscript সব সাবপ্রোজেক্টে RenderScript কম্পাইলেশন চালু করে শুধুমাত্র সেইসব সাবপ্রোজেক্টে renderscript কম্পাইলেশন চালু করুন যেখানে renderscript সোর্স আছে সেইসব প্রোজেক্টের Gradle বিল্ড ফাইলে নিম্নলিখিত প্রপার্টি সেট করে:
android {
  buildFeatures {
    renderScript = true
  }
}

বাধ্যতামূলক Gradle প্রপার্টি

আপনি নিম্নলিখিত Gradle প্রপার্টি সেট করলে AGP 9.0 একটি সমস্যা দেখায়।

Android Gradle প্লাগ-ইন আপগ্রেড অ্যাসিস্ট্যান্ট এইসব প্রপার্টি ব্যবহার করে এমন প্রোজেক্টকে AGP 9.0-তে আপগ্রেড করবে না।

প্রপার্টি ফাংশন
android.r8.integratedResourceShrinking রিসোর্স সঙ্কুচিত করা এখন সবসময় R8-এর অংশ হিসেবে রান করে, আগের ইমপ্লিমেন্টেশন সরিয়ে দেওয়া হয়েছে।
android.enableNewResourceShrinker.preciseShrinking রিসোর্স সরিয়ে দেওয়ার ক্ষেত্রে এখন সবসময় নিখুঁত রিসোর্স সরিয়ে দেওয়া হয়, যা আরও বেশি রিসোর্স সরিয়ে দিতে সাহায্য করে।

R8 পরিবর্তন

AGP 9.0.0-এ নিম্নলিখিত R8 পরিবর্তন অন্তর্ভুক্ত করা হয়েছে।

নতুন কনফিগারেশন বিকল্প -processkotlinnullchecks

Kotlin নাল চেক প্রসেস করার জন্য R8 কনফিগার করতে আমরা নতুন R8 বিকল্প -processkotlinnullchecks যোগ করেছি। এই বিকল্পে একটি বাধ্যতামূলক আর্গুমেন্ট দিতে হয় যা নিম্নলিখিত তিনটি মানের মধ্যে একটি হতে হবে: keep, remove_message এবং remove। এই বিকল্পটি Kotlin কম্পাইলারের যোগ করা নিম্নলিখিত নাল চেক প্রসেস করে:

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 এর যেকোনও স্পেসিফিকেশন সেটি ওভাররাইড করবে। একাধিকবার উল্লেখ করা হলে, সবচেয়ে শক্তিশালী ভ্যালু ব্যবহার করা হয়।

কম্প্যানিয়ন পদ্ধতিতে Keep সংক্রান্ত তথ্য প্রোপাগেট করা বন্ধ করা

কীপ রুল, ডিসুগারিংয়ের অধীন ইন্টারফেস পদ্ধতির সাথে ম্যাচ করলে, R8 আগে ইন্টার্নালি সিন্থেসাইজ করা কম্প্যানিয়ন পদ্ধতিতে অপ্টিমাইজেশন ডিসঅ্যালাও এবং সংকোচন ডিসঅ্যালাও বিট ট্রান্সফার করত।

AGP 9.0 থেকে শুরু করে, কীপ নিয়ম আর কম্প্যানিয়ন পদ্ধতির ক্ষেত্রে প্রযোজ্য হবে না। এটি এই সত্যের সাথে সামঞ্জস্যপূর্ণ যে, কিপ নিয়মগুলি অন্যান্য কম্পাইলার সিন্থেসাইজড ফিল্ড/মেথড/ক্লাসের ক্ষেত্রে প্রযোজ্য নয়।

অপ্টিমাইজ করার অনুমতি নেই এবং ছোট করার অনুমতি নেই বিটগুলি কম্প্যানিয়ন পদ্ধতিতে ট্রান্সফার করার মাধ্যমে, নিম্নলিখিত ব্যবহারের ক্ষেত্রে আগে কাজ করত:

  1. default/static/private ইন্টারফেস পদ্ধতি সহ লাইব্রেরি কম্পাইল করুন minSdk < ২৪ এবং ইন্টারফেস পদ্ধতি বজায় রাখে এমন নিয়ম সহ DEX-এ।
  2. ক্লাসপাথ ও -applymapping-এ লাইব্রেরি সহ অ্যাপ কম্পাইল করুন।
  3. অ্যাপ ও লাইব্রেরি মার্জ করুন।

মনে রাখবেন, এটি শুধুমাত্র -applymapping-এর সাথে কাজ করে, কারণ disallow obfuscation বিটটি কম্প্যানিয়ন পদ্ধতিতে ট্রান্সফার করা হয় না—অর্থাৎ, ১ম ধাপ থেকে তৈরি কম্প্যানিয়ন ক্লাসে অস্পষ্ট করা পদ্ধতির নাম থাকবে।

ভবিষ্যতে minSdk < 24-এর জন্য এই ব্যবহার আর কাজ করবে না। এর বিকল্প সমাধান হল নিম্নলিখিত কাজগুলি করা:

  1. default/static/private ইন্টারফেস পদ্ধতির মাধ্যমে লাইব্রেরিকে ডিসুগার করুন যাতে minSdk < ২৪ সহ ক্লাস ফাইল থাকে।
  2. R8 এবং এমন নিয়ম ব্যবহার করে ডেসুগার করা আর্টিফ্যাক্ট কম্পাইল করুন যা কম্প্যানিয়ন ক্লাসে মেথড রাখে।
  3. ক্লাসপাথে লাইব্রেরি সহ অ্যাপটি কম্পাইল করুন।
  4. অ্যাপ ও ডিসেগার করা আর্টিফ্যাক্ট মার্জ করুন।

এর আরেকটি পার্শ্বপ্রতিক্রিয়া হল যে ইন্টারফেস কম্প্যানিয়ন পদ্ধতির মধ্যে অ্যানোনিমাস এবং লোকাল ক্লাসের জন্য ইনার ক্লাস এবং এনক্লোজিং মেথড অ্যাট্রিবিউট আর রাখা সম্ভব নয়।

ডিফল্ট নির্গত সোর্স ফাইল পরিবর্তন করে r8-map-id-<MAP_ID> করুন

এই পরিবর্তন AGP-তে ৮.১২.০ ভার্সন থেকে শুরু হচ্ছে।

রিট্রেসিংয়ের প্রয়োজন হলে (অর্থাৎ, অফস্কেশন বা অপ্টিমাইজেশন চালু থাকলে), কোনও ক্লাসের জন্য ডিফল্ট এমিটেড সোর্স ফাইল অ্যাট্রিবিউট SourceFile থেকে r8-map-id-<MAP_ID>-এ পরিবর্তিত হয়।

অফস্কেট করা স্ট্যাক ট্রেস দেওয়া হলে, নতুন সোর্স ফাইল অ্যাট্রিবিউট ম্যাপিং ফাইলের আইডি এক্সট্র্যাক্ট করা সম্ভব করে তোলে, যা রিট্রেসিংয়ের জন্য প্রয়োজন হয় এবং এটি Logcat-এ স্ট্যাক ট্রেসের অটোমেটিক রিট্রেসিং-এ সহায়তা করতে ব্যবহার করা যেতে পারে।

কাস্টম সোর্স ফাইল অ্যাট্রিবিউট ব্যবহার করা হলে (-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 (কোর লাইব্রেরি ডিসুগারিং) কনফিগার করে যাতে DEX ফাইলে থাকা সব j$ ক্লাসে সিন্থেটিক ক্লাসের জন্য নতুন ছোট করা ক্লাসের নাম ফর্ম্যাট ব্যবহার করা হয়। নতুন ক্লাসের নামে সাংখ্যিক আইডি (যেমন, $1) ব্যবহার করা হয়।

-addconfigurationdebugging-এর জন্য সহায়তা সরিয়ে দিন

AGP 9.0, -addconfigurationdebugging-এর জন্য সহায়তা সরিয়ে দেয়। ফ্ল্যাগ ব্যবহার করা হলে, কম্পাইলার এখন একটি সতর্কতা জানায়।

D8/R8 থেকে L8 নিয়ম জেনারেট করার সুবিধা সরিয়ে দেওয়া

এই পরিবর্তনটি শুধুমাত্র D8/R8 কমান্ড লাইন বা সরাসরি API ব্যবহার করা ডেভেলপারদের জন্য প্রাসঙ্গিক।

D8 ও R8 থেকে L8-এর জন্য কীপ নিয়ম জেনারেট করার সুবিধা R8 9.0 সরিয়ে দেয়। এই উদ্দেশ্যে আপনাকে TraceReferences ব্যবহার করতে হবে।

আরও নির্দিষ্টভাবে, D8Command.builder.setDesugaredLibraryKeepRuleConsumer এবং R8Command.Builder.setDesugaredLibraryKeepRuleConsumer পদ্ধতি সরিয়ে দেওয়া হয়েছে এবং D8 ও R8-এর কমান্ড লাইন বিকল্প থেকে --desugared-lib-pg-conf-output-এর জন্য সাপোর্ট সরিয়ে দেওয়া হয়েছে।

সমাধান করা সমস্যা

Android Gradle প্লাগ-ইন 9.0.0

সমাধান করা সমস্যা
Android Gradle Plugin
ফিচার সংক্রান্ত অনুরোধ: প্রপার্টি হিসেবে আদর্শ AGP ভার্সন ইনজেক্ট করা
Stabilize SingleArtifact.VERSION_CONTROL_INFO_FILE
androidTest connectedCheck logcat output is broken
AGP-তে বিল্ট-ইন Kotlin সাপোর্ট, Kotlin সোর্সসেটের সাথে সিঙ্ক করা উচিত নয়
missingDimensionStrategy, নিজের নামের সাথে ম্যাচ করা ফ্লেভারকে পছন্দ করে, এমনকি তা যদি কোনও সম্পর্কহীন ডাইমেনশন থেকেও আসে
AGP-তে বিল্ট-ইন Kotlin সাপোর্ট, Kotlin সোর্সসেটের সাথে সিঙ্ক করা উচিত নয়
AGP 9.0.0-rc01, kotlin() ফাংশনের মাধ্যমে Kotlin লাইব্রেরি সমাধান করে না
Built-in-kotlin, maven pom-এ kotlin-stdlib নির্ভরতা সংক্রান্ত বিধিনিষেধ প্রকাশ করে না
compileSdk ও targetSdk-এর মধ্যে পার্থক্য সংক্রান্ত টেস্ট কেস যোগ করা
resConfigs ভ্যালু খালি থাকলে, aapt সংক্রান্ত অস্পষ্ট সমস্যা হয়
পিওর জাভা প্রোজেক্টে kotlin stdlib-এর উপর নির্ভরতা থাকে।
AGP 9.0-তে KotlinMultiplatformAndroidCompilationBuilder-এর বন্ধ হয়ে যাওয়া প্রপার্টি সরিয়ে দিন
`com.android.tools.build:gradle:9.0.0-alpha05`-এর KGP ও gradle-api-এর উপর API নির্ভরতা থাকা উচিত
com.android.experimental.built-in-kotlin Gradle প্লাগ-ইনের নাম পরিবর্তন করুন
AGP9: `variant.sources.kotlin!!.addGeneratedSourceDirectory()` কাজ করছে না
কম্পাইল Sdk-তে Aar মেটাডেটা চেক করার সময় পুরনো DSL ব্যবহার করা হয়
সিস্টেম থেকে সরিয়ে দেওয়া `com.android.build.api.dsl.ManagedDevices.devices` প্রপার্টি সরানো হয়েছে
AGP-তে বিল্ট-ইন Kotlin সাপোর্ট, Kotlin সোর্সসেটের সাথে সিঙ্ক করা উচিত নয়
গ্রাহক যদি ফাইল কন্টেন -dontobfuscate রাখেন তাহলে Android লাইব্রেরি প্রকাশ করা যাবে না
অপ্টিমাইজ করা রিসোর্সের জন্য প্রিন্ট ম্যাপিংয়ের কোনও বিকল্প নেই
এই ফেজ পেরিয়ে যাওয়ার পরে finalizeDsl কল করলে সেটি একটি সমস্যা হিসেবে গণ্য করা হবে
Jetifier বন্ধ করা থাকলেও AGP jetifier কনফিগারেশন ইনিশিয়ালাইজ করে
মডিউল ও pom ফাইলে `kotlin.stdlib.default.dependency` true হলে, বিল্ট-ইন কোটলিন, কোটলিনStdlib-কে কম্পাইল টাইম ডিপেন্ডেন্সি হিসেবে যোগ করে না
নতুন অপ্টিমাইজেশন DSL ডিফল্ট হিসেবে configuration.txt তৈরি করে না
AGP 8.13.0 মডিউলে নেভিগেশন গ্রাফ যাচাই করতে পারে না
AGP বন্ধ হয়ে যাওয়া Gradle API ব্যবহার করে: মাল্টি-স্ট্রিং নোটেশন
minSdkVersion >=21 সহ লেগ্যাসি মাল্টিডেক্স লাইব্রেরি ব্যবহার করার চেষ্টা করা ব্যবহারকারীদের সতর্ক করা
কোড জেনারেশন টাস্ক থাকলে বিল্ড সম্পূর্ণ হয় না
`android.builtInKotlin=false` এবং `android.newDsl=false` এবং `android.enableLegacyVariantApi=false` সহ, `kotlin-android` প্লাগ-ইন ব্যবহার করলে "API 'applicationVariants' আর ব্যবহার করা হয় না" মেসেজ সহ ব্যর্থ হবে
kotlin.stdlib.default.dependency=false হলে বিল্ট-ইন Kotlin, ভার্সন না থাকা kotlin-stdlib সমাধান করতে পারে না
DexData ফাইল বন্ধ না করেই খোলে, ফলে ক্লিন-আপ করা যায় না
AGP 9.0-এ AndroidSourceDirectorySet-এর প্যাটার্ন ফিল্টার করার সুবিধা বন্ধ করে দেওয়া উচিত
শুধুমাত্র টেস্ট মডিউলে টেস্ট ফিক্সচার সংক্রান্ত সমস্যা
টেস্ট ফিক্সচারে কন্টেক্সট রিসিভার ব্যবহার করার সময় ভুল সমস্যা
testFixtures-এ Kotlin কোডের জন্য ভুল IDE সংক্রান্ত সমস্যা
`kotlin-kapt`-এর মতো `legacy-kapt` প্লাগ-ইন অ্যানোটেশন প্রসেসিং এড়িয়ে যায়
SettingsExtension-এর সাথে compileSdkSpec.minorApiLevel কাজ করছে না
[fused lib - public] Generated fused library does not include sources
extractNativeLibs এবং useEmbeddedDex ম্যানিফেস্ট থেকে আসা উচিত নয়
AGP 9.0.0-alpha09-এ R8 থেকে সতর্কতা
AGP 9.0-তে AndroidSourceSet.jni-এর ব্যবহার বন্ধ করা হয়েছে
AGP 9.0-তে Installation.installOptions() সরিয়ে দেওয়া হয়েছে
AGP 9.0-তে BuildType.isRenderscriptDebuggable সরিয়ে দিন।
android.defaults.buildfeatures.renderscript সরিয়ে দিন
Gradle ম্যানেজ করা ডিভাইসের সাথে `com.android.kotlin.multiplatform.library` ক্র্যাশ করে
`android.defaults.buildfeatures.aidl` ডিফল্ট gradle.properties ফ্ল্যাগ সরিয়ে দিন
Proguard ফাইল না থাকলে বিল্ড করা যায় না
remove buildconfig defaults gradle.properties flags
minSdk-এর পরিবর্তে compileSdk-এর উপর ভিত্তি করে অ্যাপের targetSdk ডিফল্ট ভ্যালু পরিবর্তন করুন
`isIncludeAndroidResources` চালু করা থাকলে, `process{Variant}UnitTestManifest` AGP 8.12.0-এ টুল:overrideLibrary ব্যবহার মার্জ করতে পারে না
JVM টেস্ট টাস্কের জন্য Gradle-এ AGP-র কারণে অবচয় সংক্রান্ত সতর্কতা
DependencyReportTask কনফিগারেশন ক্যাশের সাথে মানানসই নয়
AGP 9.0-এ ডিফল্ট সোর্স/টার্গেট Java ভার্সন Java 8 থেকে Java 11-এ পরিবর্তন করা
Flip android.useAndroidX ডিফল্ট মান true
বিল্ট-ইন Kotlin-এর সাথে kapt প্লাগ-ইন প্রয়োগ করার সময় আরও ভালো ব্যতিক্রম।
android.proguard.failOnMissingFiles, consumerProguardFiles-এর জন্য কাজ করছে না
Kotlin Gradle প্লাগ-ইন ডিপেন্ডেন্সি 2.2.10-এ আপডেট করুন
KGP API ব্যবহার করে KotlinJvmAndroidCompilation তৈরি করা
টেস্ট সোর্সে Kotlin এক্সপ্লিসিট API মোড প্রয়োগ করা হয়েছে
Lint
AGP 8.11.0: apply(from = "...") সহ .gradle.kts ফাইল প্রয়োগ করার সময় lintAnalyzeRelease টাস্ক ক্র্যাশ করে
Lint ChecksSdkIntAtLeast চেক, অ্যানোটেট করা ভ্যালু সঠিক কিনা তা চেক করে না
বিল্ট-ইন Kotlin, META-INF-এ .kotlin_module যোগ করে না
Lint classpath-এ আলাদা আলাদা ভার্সনে ডুপ্লিকেট ক্লাস আছে
ওভাররাইডিং প্রাইভেট রিসোর্স ওয়ার্কঅ্যারাউন্ড কাজ করছে না (tools:override = "true")
সমস্যা: অব্যবহৃত রিসোর্স সরিয়ে দিলেও সেগুলির অনুবাদ সরানো হয় না এবং সেই বিষয়ে কোনও প্রশ্নও করা হয় না
Lint throwing warning "Could not clean up K2 caches"
Lint throwing warning "Could not clean up K2 caches"
Lint ইন্টিগ্রেশন
systemPropertyInputs.javaVersion পার্থক্যের কারণে বিভিন্ন JDK ভেন্ডর বা মাইনর ভার্সন জুড়ে AndroidLintAnalysisTask ক্যাশে মিস
Lint, compileSdk থাকা সত্ত্বেও অটোমেটিক লেটেস্ট ইনস্টল করা SDK ব্যবহার করে, টাস্ক ইনপুট হিসেবে রেজিস্টার করে না এবং ক্যাশিং ভেঙে দেয়
Shrinker (R8)
ফাইনাল রিসোর্স আইডি ব্যবহার করলে R8 অপ্টিমাইজ করা রিসোর্স সরিয়ে দেওয়া নীরবে ব্যর্থ হয়