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 প্লাগ-ইন 9.0-এ কাজ করে এমন সর্বাধিক API লেভেল হল API লেভেল 36.1। এখানে অন্যান্য কম্প্যাটিবিলিটি সংক্রান্ত তথ্য দেওয়া হল:

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

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

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

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

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

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

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

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

  • থার্ড-পার্টি প্লাগ-ইন আপডেট করুন: কিছু থার্ড-পার্টি প্লাগ-ইন এখনও এমন ইন্টারফেস বা 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 AAR-এ প্যাকেজ করার জন্য AIDL ফাইল যাতে লাইব্রেরি এবং এই লাইব্রেরির উপর নির্ভর করে এমন অ্যাপের জন্য এটি API হিসেবে প্রকাশ করা যায়। এটি এখনও 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 বা ভেরিয়েন্ট API-তে ক্ষমতা বা ফিচার নেই, তাহলে যত তাড়াতাড়ি সম্ভব একটি সমস্যা ফাইল করুন।

বিল্ট-ইন Kotlin

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

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

এছাড়াও, আপনি Gradle সাবপ্রোজেক্টের জন্য বিল্ট-ইন Kotlin সাপোর্ট বেছে নিয়ে বন্ধ করতে পারবেন, যেখানে 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 ভার্সন ব্যবহার করেন, তাহলে AGP এটিকে 2.2.10-2.0.2-এ আপগ্রেড করবে যাতে KGP ভার্সনের সাথে ম্যাচ করে।

আরও উন্নত 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-এর পুরনো ভার্সনে ডাউনগ্রেড করুন

আপনি যদি বিল্ট-ইন Kotlin থেকে অপ্ট-আউট করে থাকেন, তাহলে শুধু 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-এর সর্বনিম্ন ২.০.০ ভার্সনে ডাউনগ্রেড করতে পারবেন।

টেস্ট ফিক্সচারের জন্য IDE সহায়তা

AGP 9.0-এ টেস্ট ফিক্সচার-এর জন্য সম্পূর্ণ Android Studio IDE সাপোর্ট রয়েছে।

Fused Library প্লাগ-ইন

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

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

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

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

আচরণ সাজেশন
Android Gradle প্লাগ-ইন 9.0 ডিফল্ট হিসেবে NDK ভার্সন r28c ব্যবহার করে। আপনি যে NDK ভার্সন ব্যবহার করতে চান সেটি স্পষ্টভাবে উল্লেখ করার কথা বিবেচনা করুন।
Android Gradle প্লাগ-ইন 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-এ নয়। ­dontoptimize ফ্ল্যাগ যাতে ভুলবশত ব্যবহার না করা হয়, সেই জন্য এটি করা হয়েছে। এই ফ্ল্যাগ proguard-android.txt-এ অন্তর্ভুক্ত। 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-এর মতো গ্লোবাল বিকল্প থাকে, তা শুধুমাত্র অ্যাপ্লিকেশন মডিউলে ব্যবহার করা উচিত এবং লাইব্রেরি ব্যবহারকারীদের জন্য অপ্টিমাইজেশন সুবিধা কমাতে পারে। Android অ্যাপ মডিউল কম্পাইলেশন, প্রি-কম্পাইল করা ডিপেন্ডেন্সিতে (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 সেট করে অপ্ট-আউট করুন। আপনার সব কনজিউমার Keep ফাইল মানানসই হয়ে গেলে, অপ্ট-আউট সরিয়ে দিন।
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-এর প্যারামিটারাইজেশন সরিয়ে দেওয়া হয়েছে।

    In itself, this is only a source-level breaking change to help avoid future source-level breaking changes, but it also means that the block methods need to move from CommonExtension to ApplicationExtension, LibraryExtension, DynamicFeatureExtension and 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 ভার্সনের রেঞ্জকে টার্গেট করে, সেগুলির জন্য সরাসরি গেটার ব্যবহার করা 9.0-এর থেকে কম 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 কম্পাইলেশন চালু করে শুধুমাত্র সেইসব সাবপ্রোজেক্টে রেন্ডারস্ক্রিপ্ট কম্পাইলেশন চালু করুন যেখানে রেন্ডারস্ক্রিপ্ট সোর্স আছে এবং এটি করতে সেইসব প্রোজেক্টের 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-এর যেকোনও স্পেসিফিকেশন সেটি ওভাররাইড করবে। একাধিকবার উল্লেখ করা হলে, সবচেয়ে শক্তিশালী ভ্যালু ব্যবহার করা হয়।

কম্প্যানিয়ন পদ্ধতিতে তথ্য রাখার প্রচার বন্ধ করুন

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

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

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

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

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

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

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

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

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

এই পরিবর্তন 8.12.0 থেকে শুরু করে 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 (কোর লাইব্রেরি ডিসুগারিং) কনফিগার করে যাতে সব 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-এর জন্য সহায়তা সরানো হয়েছে।

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

Android Gradle প্লাগ-ইন 9.0.0

সমাধান করা সমস্যা
Android Gradle প্লাগ-ইন
ফিচার রিকোয়েস্ট: প্রপার্টি হিসেবে আদর্শ AGP ভার্সন ইনজেক্ট করুন
SingleArtifact.VERSION_CONTROL_INFO_FILE স্টেবিলাইজ করুন
androidTest connectedCheck logcat আউটপুট কাজ করছে না
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 সমস্যা দেখা দেয়
Pure Java প্রোজেক্ট 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 কল করার ক্ষেত্রে সমস্যা তৈরি করুন
জেটিফায়ার বন্ধ থাকলেও AGP জেটিফায়ার কনফিগারেশন শুরু করে
`kotlin.stdlib.default.dependency` মডিউল ও pom ফাইলের ক্ষেত্রে সত্য হলে, kotlin-এ তৈরি করা kotlinStdlib-কে কম্পাইল টাইম ডিপেন্ডেন্সি হিসেবে যোগ করে না
নতুন অপ্টিমাইজেশন DSL ডিফল্ট হিসেবে configuration.txt তৈরি করে না
AGP 8.13.0 কোনও মডিউলে নেভিগেশন গ্রাফ যাচাই করতে পারেনি
AGP বন্ধ হয়ে যাওয়া Gradle API ব্যবহার করে: মাল্টি-স্ট্রিং নোটেশন
minSdkVersion >=২১ সহ পুরনো মাল্টিডেক্স লাইব্রেরি ব্যবহার করার চেষ্টা করছেন এমন ব্যবহারকারীদের সতর্ক করুন
কোড জেনারেশন টাস্ক থাকলে বিল্ড ব্যর্থ হয়
`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-এর PatternFilterable এক্সটেন্ড করা বন্ধ করা উচিত
শুধুমাত্র টেস্ট মডিউলে টেস্ট ফিক্সচার সংক্রান্ত সমস্যা
টেস্ট ফিক্সচারে কন্টেক্সট রিসিভার ব্যবহার করার সময় ভুল ত্রুটি
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 ফ্ল্যাগ সরিয়ে দিন
প্রোগার্ড ফাইল না থাকলে বিল্ড করা যাবে না
buildconfig defaults gradle.properties ফ্ল্যাগ সরান
অ্যাপের targetSdk ডিফল্ট ভ্যালু পরিবর্তন করে minSdk-এর পরিবর্তে compileSdk-এর উপর ভিত্তি করে সেট করুন
`isIncludeAndroidResources` চালু করা থাকলে, AGP 8.12.0-এ tools:overrideLibrary ব্যবহার মার্জ করতে `process{Variant}UnitTestManifest` ব্যর্থ হয়
JVM টেস্ট টাস্কের জন্য Gradle-এ AGP-এর কারণে ডেপ্রিকেশন সংক্রান্ত সতর্কতা দেখানো হচ্ছে
DependencyReportTask কনফিগারেশন ক্যাশের সাথে মানানসই নয়
AGP 9.0-এ ডিফল্ট সোর্স/টার্গেট Java ভার্সন Java 8 থেকে Java 11-এ পরিবর্তন করুন
android.useAndroidX ডিফল্টকে true-তে ফ্লিপ করুন
বিল্ট-ইন Kotlin-এর সাথে kapt প্লাগ-ইন প্রয়োগ করার সময় আরও ভালো এক্সেপশন।
consumerProguardFiles-এর জন্য android.proguard.failOnMissingFiles কাজ করছে না
Kotlin Gradle প্লাগ-ইন ডিপেন্ডেন্সি ২.২.১০ ভার্সনে আপডেট করুন
KGP API ব্যবহার করে KotlinJvmAndroidCompilation তৈরি করা
টেস্ট সোর্সে Kotlin এক্সপ্লিসিট API মোড প্রয়োগ করা হয়েছে
Lint
AGP 8.11.0: apply(from = "...") সহ .gradle.kts ফাইল প্রয়োগ করার সময় lintAnalyzeRelease টাস্ক ক্র্যাশ করে
Lint ChecksSdkIntAtLeast চেক, অ্যানোটেট করা ভ্যালু সঠিক কিনা তা চেক করে না
বিল্ট-ইন Kotlin, META-INF-এ .kotlin_module যোগ করে না
Lint ক্লাসপাথে বিভিন্ন ভার্সনে ডুপ্লিকেট ক্লাস আছে
ব্যক্তিগত রিসোর্স ওভাররাইড করার সমাধান কাজ করছে না (tools:override = "true")
সমস্যা: অব্যবহৃত রিসোর্স সরিয়ে দেওয়ার পরেও সেগুলির অনুবাদ সরানো হয় না এবং এই বিষয়ে কোনও প্রশ্নও করা হয় না
Lint "K2 ক্যাশে পরিষ্কার করা যায়নি" সতর্কতা দেখাচ্ছে
Lint "K2 ক্যাশে পরিষ্কার করা যায়নি" সতর্কতা দেখাচ্ছে
Lint ইন্টিগ্রেশন
systemPropertyInputs.javaVersion-এ পার্থক্যের কারণে বিভিন্ন JDK ভেন্ডর বা মাইনর ভার্সন জুড়ে AndroidLintAnalysisTask ক্যাশে মিস হয়
Lint, compileSdk থাকা সত্ত্বেও লেটেস্ট ইনস্টল করা SDK অটোমেটিক ব্যবহার করে, টাস্ক ইনপুট হিসেবে রেজিস্টার করে না এবং ক্যাশিং ব্রেক করে
Shrinker (R8)
ফাইনাল রিসোর্স আইডি ব্যবহার করলে, R8 অপ্টিমাইজ করা রিসোর্স সরিয়ে দেওয়ার প্রসেস কোনও বিজ্ঞপ্তি ছাড়াই ব্যর্থ হয়