অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৯.০.১ (জানুয়ারী ২০২৬)

অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৯.০ একটি প্রধান রিলিজ যা এপিআই এবং আচরণগত পরিবর্তন নিয়ে এসেছে।

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 এ যান।
registerArtifactType
registerBuildTypeSourceProvider ,
registerProductFlavorSourceProvider
registerJavaArtifact
registerMultiFlavorSourceProvider , এবং
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 এর মতো লিগ্যাসি ভ্যারিয়েন্ট এপিআই-টিও আর ব্যবহার করা যাবে না।
falsetrue আপনি android.newDsl=false সেট করে এটি থেকে বিরত থাকতে পারেন।
আপনার প্রোজেক্টে ব্যবহৃত সমস্ত প্লাগইন এবং বিল্ড লজিক সামঞ্জস্যপূর্ণ হয়ে গেলে, অপ্ট-আউটটি সরিয়ে দিন।
android. builtInKotlin বিল্ট-ইন কোটলিন সক্ষম করে falsetrue সম্ভব হলে বিল্ট-ইন কোটলিনে স্থানান্তরিত হন অথবা এটি এড়িয়ে চলুন
android. uniquePackage Names প্রতিটি লাইব্রেরির একটি স্বতন্ত্র প্যাকেজ নাম থাকা নিশ্চিত করে। falsetrue আপনার প্রোজেক্টের অন্তর্গত সমস্ত লাইব্রেরির জন্য স্বতন্ত্র প্যাকেজ নাম নির্দিষ্ট করুন। যদি তা সম্ভব না হয়, তাহলে মাইগ্রেট করার সময় আপনি এই ফ্ল্যাগটি নিষ্ক্রিয় করতে পারেন।
android. useAndroidx ডিফল্টরূপে androidx নির্ভরতা ব্যবহার করুন। falsetrue androidx নির্ভরতাগুলো গ্রহণ করুন।
android. default. androidx. test. runner ডিফল্টরূপে androidx.test.runner.AndroidJUnitRunner ক্লাস ব্যবহার করে অন-ডিভাইস টেস্ট চালান, যা অপ্রচলিত InstrumentationTestRunner এর ডিফল্ট বিকল্প হিসেবে কাজ করে।
android {
  defaultConfig {
    testInstrumentationRunner = "..."
  }
}
falsetrue AndroidJUnitRunner ব্যবহার করুন, অথবা আপনার নিজস্ব testInstrumentationRunner স্পষ্টভাবে নির্দিষ্ট করে দিন।
android. dependency. useConstraints কনফিগারেশনগুলোর মধ্যে নির্ভরশীলতার সীমাবদ্ধতার ব্যবহার নিয়ন্ত্রণ করে।
AGP 9.0-এর ডিফল্ট মান হলো false , যা শুধুমাত্র অ্যাপ্লিকেশন ডিভাইস টেস্টে (AndroidTest) কনস্ট্রেইন্ট ব্যবহার করে। এটিকে true তে সেট করলে 8.13-এর আচরণে ফিরে যাবে।
truefalse প্রয়োজন না হলে সব জায়গায় ডিপেন্ডেন্সি কনস্ট্রেইন্ট ব্যবহার করবেন না। এই ফ্ল্যাগের নতুন ডিফল্ট গ্রহণ করলে প্রজেক্ট ইম্পোর্ট প্রক্রিয়ায় অপটিমাইজেশনও চালু হয়, যা অনেকগুলো অ্যান্ড্রয়েড লাইব্রেরি সাবপ্রজেক্ট থাকা বিল্ডগুলোর জন্য ইম্পোর্টের সময় কমিয়ে দেবে।
android. enableApp CompileTime RClass অ্যাপ্লিকেশন কম্পাইলেশনকে লাইব্রেরি কম্পাইলেশনের সাথে সামঞ্জস্যপূর্ণ করতে, অ্যাপ্লিকেশনগুলিতে কোড একটি নন-ফাইনাল R ক্লাসের সাপেক্ষে কম্পাইল করুন।
এটি ইনক্রিমেন্টালিটি উন্নত করে এবং রিসোর্স প্রসেসিং ফ্লো-এর ভবিষ্যৎ পারফরম্যান্স অপটিমাইজেশনের পথ প্রশস্ত করে।
falsetrue অনেক প্রজেক্ট কোনো সোর্স কোড পরিবর্তন ছাড়াই নতুন আচরণটি গ্রহণ করতে পারে। যদি R ক্লাস ফিল্ডগুলো এমন কোনো জায়গায় ব্যবহৃত হয় যেখানে কনস্ট্যান্ট প্রয়োজন, যেমন সুইচ কেস, তাহলে চেইনড if স্টেটমেন্ট ব্যবহার করার জন্য রিফ্যাক্টর করুন।
android. sdk. defaultTargetSdk ToCompileSdk IfUnset অ্যাপ এবং টেস্টে টার্গেট SDK ভার্সনের ডিফল্ট মান হিসেবে কম্পাইল করা SDK ভার্সনটি ব্যবহার করা হয়।
এই পরিবর্তনের আগে, টার্গেট SDK ভার্সনটি ডিফল্টভাবে সর্বনিম্ন SDK ভার্সন হতো।
falsetrue অ্যাপ এবং টেস্টের জন্য টার্গেট SDK ভার্সন স্পষ্টভাবে উল্লেখ করুন।
android. onlyEnableUnitTest ForTheTested BuildType শুধুমাত্র পরীক্ষিত বিল্ড টাইপের জন্য ইউনিট টেস্ট কম্পোনেন্ট তৈরি করে।
ডিফল্ট প্রজেক্টে এর ফলে ডিবাগের জন্য একটিমাত্র ইউনিট টেস্ট তৈরি হয়, যেখানে আগে ডিবাগ বা রিলিজের জন্য ইউনিট টেস্ট চালানো হতো।
falsetrue আপনার প্রোজেক্টে যদি ডিবাগ এবং রিলিজ উভয় পর্যায়েই টেস্ট চালানোর প্রয়োজন না হয়, তাহলে কোনো পরিবর্তনের প্রয়োজন নেই।
android. proguard. failOnMissingFiles AGP DSL-এ নির্দিষ্ট করা কোনো ফাইল ডিস্কে না থাকলে, একটি ত্রুটির কারণে বিল্ডটি ব্যর্থ হয়। এই পরিবর্তনের আগে, ফাইলের নামে টাইপিংয়ের ভুলের কারণে ফাইলগুলো নীরবে উপেক্ষা করা হতো। falsetrue যেকোনো অবৈধ প্রোগার্ড ফাইলের ঘোষণা মুছে ফেলুন
android. r8. optimizedResourceShrinking ক্লাস এবং অ্যান্ড্রয়েড রিসোর্সগুলোকে একত্রে বিবেচনা করার মাধ্যমে R8 কম অ্যান্ড্রয়েড রিসোর্স ব্যবহার করতে পারে। falsetrue আপনার প্রোজেক্টের রাখার নিয়মাবলী যদি ইতিমধ্যেই সম্পূর্ণ হয়ে থাকে, তাহলে কোনো পরিবর্তনের প্রয়োজন নেই।
android. r8. strictFullMode ForKeepRules এর ফলে R8 কোনো ক্লাসকে 'কিপ' করার সময় তার ডিফল্ট কনস্ট্রাক্টরকে পরোক্ষভাবে রাখে না। অর্থাৎ, -keep class A এখন আর -keep class A { <init>(); } বোঝায় না।
falsetrue আপনার প্রোজেক্টের রাখার নিয়মাবলী যদি ইতিমধ্যেই সম্পূর্ণ হয়ে থাকে, তাহলে কোনো পরিবর্তনের প্রয়োজন নেই।

আপনার প্রোজেক্টের keep rules-এ যেসব ক্ষেত্রে ডিফল্ট কনস্ট্রাক্টরটি রাখার প্রয়োজন হয়, সেখানে -keep class A -keep class A { <init>(); } ব্যবহার করুন।
android. defaults. buildfeatures. resvalues সমস্ত উপপ্রকল্পে resValues ​​সক্ষম করে truefalse শুধুমাত্র যে সাবপ্রজেক্টগুলোর প্রয়োজন, সেগুলোর গ্রেডল বিল্ড ফাইলে নিম্নলিখিত বিষয়গুলো সেট করে resValues ​​সক্রিয় করুন:
android {
  buildFeatures {
    resValues = true
  }
}
android. defaults. buildfeatures. shaders সকল সাবপ্রজেক্টে শেডার কম্পাইলেশন সক্ষম করে। truefalse শুধুমাত্র সেই সাবপ্রজেক্টগুলিতে শেডার কম্পাইলেশন সক্ষম করতে, যেগুলিতে কম্পাইল করার জন্য শেডার রয়েছে, সেই প্রজেক্টগুলির গ্রেডল বিল্ড ফাইলে নিম্নলিখিতটি সেট করুন:
android {
  buildFeatures {
    shaders = true
  }
}
android. r8. proguardAndroidTxt. disallowed AGP 9.0-এ, getDefaultProguardFile() proguard- proguard-android.txt proguard-android-optimize.txt ফাইলটিকেই সাপোর্ট করবে। এর কারণ হলো, proguard-android.txt ফাইলে অন্তর্ভুক্ত dontoptimize ফ্ল্যাগটির অনিচ্ছাকৃত ব্যবহার রোধ করা। falsetrue আপনি যদি অপ্টিমাইজেশন এড়াতে চান, তাহলে 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 মতো কমেন্ট থাকতে পারে। falsetrue প্রকাশিত লাইব্রেরিগুলো থেকে যেকোনো অসঙ্গত নিয়ম সরিয়ে ফেলা উচিত। অভ্যন্তরীণ লাইব্রেরিগুলো থেকে যেকোনো অসঙ্গত কিন্তু প্রয়োজনীয় নিয়ম একটি অ্যাপ মডিউলের proguardFile-এ স্থানান্তর করা উচিত। android.r8.globalOptionsInConsumerRules.disallowed=false সেট করে অপ্ট-আউট করুন। আপনার সমস্ত কনজিউমার কিপ ফাইল সামঞ্জস্যপূর্ণ হয়ে গেলে, অপ্ট-আউটটি সরিয়ে ফেলুন।
android. sourceset. disallowProvider AndroidSourceSet DSL ব্যবহার করে জেনারেটেড সোর্সগুলির জন্য প্রোভাইডার পাস করা নিষিদ্ধ করুন। falsetrue জেনারেট করা সোর্সগুলো রেজিস্টার করতে androidComponents এর Sources API ব্যবহার করুন।
android. custom. shader. path. required যদি শেডার কম্পাইলেশন সক্রিয় করা থাকে, তাহলে local.properties ফাইলে শেডার কম্পাইলারের পাথ স্পষ্টভাবে সেট করতে হবে। falsetrue আপনার প্রোজেক্টের local.properties ফাইলে glslc.dir=/path/to/shader-tools যোগ করুন।

অপসারণ করা বৈশিষ্ট্য

অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৯.০ নিম্নলিখিত কার্যকারিতাগুলো সরিয়ে দেয়:

  • এমবেডেড Wear OS অ্যাপ সাপোর্ট
    AGP 9.0 থেকে Wear OS অ্যাপ এমবেড করার সাপোর্ট তুলে নেওয়া হয়েছে, যা এখন আর Play-তে সমর্থিত নয়। এর মধ্যে wearApp কনফিগারেশন এবং AndroidSourceSet.wearAppConfigurationName DSL-ও অন্তর্ভুক্ত। 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 সংস্করণগুলোর সাথে বাইনারিভাবে সামঞ্জস্যপূর্ণ।

ডিএসএল সরানো হয়েছে

অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৯.০ থেকে বাদ দেওয়া হয়েছে:

অপসারিত এপিআই

অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৯.০ থেকে বাদ দেওয়া হয়েছে:

গ্রেডল প্রোপার্টিগুলো সরানো হয়েছে

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

AGP 8.0 বা তার নিম্ন সংস্করণ থেকে এই বৈশিষ্ট্যগুলি ডিফল্টরূপে নিষ্ক্রিয় করা হয়েছে। আরও কার্যকর বিল্ডের জন্য, শুধুমাত্র সেই সাব-প্রজেক্টগুলিতে এই বৈশিষ্ট্যগুলি সক্রিয় করুন যেগুলি এগুলি ব্যবহার করে।

সম্পত্তি ফাংশন প্রতিস্থাপন
android. defaults. buildfeatures. aidl সকল সাবপ্রজেক্টে AIDL কম্পাইলেশন সক্ষম করে। শুধুমাত্র সেই সাবপ্রজেক্টগুলিতে AIDL কম্পাইলেশন সক্রিয় করতে, যেখানে AIDL সোর্স রয়েছে, সেই প্রজেক্টগুলির Gradle বিল্ড ফাইলে নিম্নলিখিত প্রপার্টিটি সেট করুন:
android {
  buildFeatures {
    aidl = true
  }
}
AIDL সোর্স ধারণকারী প্রতিটি সাবপ্রজেক্টের গ্রেডল বিল্ড ফাইলে
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 শ্রিংকিং বিটগুলিকে কম্প্যানিয়ন মেথডগুলিতে স্থানান্তর করার মাধ্যমে, নিম্নলিখিত ব্যবহারের ক্ষেত্রটি পূর্বে সমর্থিত ছিল:

  1. minSdk < 24 এবং ইন্টারফেস মেথডগুলো অক্ষুণ্ণ রাখার নিয়ম মেনে default / static / private ইন্টারফেস মেথডসহ একটি লাইব্রেরি DEX-এ কম্পাইল করুন।
  2. ক্লাসপাথে লাইব্রেরিটি এবং -applymapping যুক্ত করে অ্যাপটি কম্পাইল করুন।
  3. অ্যাপ এবং লাইব্রেরি একীভূত করুন।

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

এখন থেকে minSdk < 24-এর জন্য এই ব্যবহারের ক্ষেত্রটি আর সমর্থিত নয়। এর বিকল্প সমাধান হলো নিম্নলিখিত পদক্ষেপগুলো অনুসরণ করা:

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

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

ডিফল্ট নির্গত উৎস ফাইলটি 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

সমাধান করা সমস্যাগুলি
অ্যান্ড্রয়েড গ্রেডল প্লাগইন
ফিচার অনুরোধ: আদর্শ AGP সংস্করণকে একটি প্রপার্টি হিসেবে অন্তর্ভুক্ত করা
SingleArtifact.VERSION_CONTROL_INFO_FILE স্থিতিশীল করুন
androidTest connectedCheck logcat আউটপুটটি ত্রুটিপূর্ণ।
AGP-তে অন্তর্নির্মিত কোটলিন সাপোর্ট কোটলিন সোর্সসেটগুলির সাথে সিঙ্ক্রোনাইজ করা উচিত নয়।
missingDimensionStrategy এমনকি সম্পর্কহীন মাত্রা থেকেও এমন একটি স্বাদ পছন্দ করে যা তার নিজের নামের সাথে মেলে।
AGP-তে অন্তর্নির্মিত কোটলিন সাপোর্ট কোটলিন সোর্সসেটগুলির সাথে সিঙ্ক্রোনাইজ করা উচিত নয়।
AGP 9.0.0-rc01, kotlin() ফাংশনের মাধ্যমে কোটলিন লাইব্রেরিগুলো রিজলভ করতে পারে না।
বিল্ট-ইন-কোটলিন মেভেন পম-এ kotlin-stdlib নির্ভরতা সীমাবদ্ধতা প্রকাশ করে না।
compileSdk এবং targetSdk-এর মধ্যে পার্থক্যের জন্য একটি টেস্ট কেস যোগ করুন।
resConfigs-এর মান খালি থাকলে একটি অস্পষ্ট aapt ত্রুটি দেখা দেয়।
সম্পূর্ণ জাভা প্রজেক্টটি কোটলিন স্ট্যান্ডার্ড লাইব্রেরির উপর নির্ভরশীল।
AGP 9.0-এ অপ্রচলিত KotlinMultiplatformAndroidCompilationBuilder প্রোপার্টিগুলো অপসারণ করা হয়েছে।
`com.android.tools.build:gradle:9.0.0-alpha05`-এর KGP এবং gradle-api-এর উপর এপিআই নির্ভরতা থাকা উচিত।
com.android.experimental.built-in-kotlin গ্রেডল প্লাগইনের নাম পরিবর্তন করুন
AGP9: `variant.sources.kotlin!!.addGeneratedSourceDirectory()` কাজ করছে না।
কম্পাইল করার সময় Aar মেটাডেটা যাচাই করার জন্য Sdk পুরোনো DSL ব্যবহার করে।
অপ্রচলিত `com.android.build.api.dsl.ManagedDevices.devices` প্রপার্টিটি মুছে ফেলুন
AGP-তে অন্তর্নির্মিত কোটলিন সাপোর্ট কোটলিন সোর্সসেটগুলির সাথে সিঙ্ক্রোনাইজ করা উচিত নয়।
যদি ব্যবহারকারীর রাখা ফাইলে -dontobfuscate থাকে, তাহলে অ্যান্ড্রয়েড লাইব্রেরি প্রকাশ করা ব্যর্থ হবে।
অপ্টিমাইজ করা রিসোর্সের জন্য ম্যাপিং প্রিন্ট করার কোনো বিকল্প নেই
এই পর্যায়টি অতিক্রম করার পর finalizeDsl কল করাকে একটি ত্রুটি হিসেবে গণ্য করুন।
জেটিফায়ার নিষ্ক্রিয় থাকলেও AGP জেটিফায়ার কনফিগারেশন চালু করে।
মডিউল এবং pom ফাইলগুলিতে `kotlin.stdlib.default.dependency`-এর মান `true` হলে, বিল্ট-ইন কোটলিন `kotlinStdlib`-কে কম্পাইল-টাইম ডিপেন্ডেন্সি হিসেবে যোগ করে না।
নতুন অপ্টিমাইজেশন ডিএসএল ডিফল্টরূপে configuration.txt তৈরি করে না।
AGP 8.13.0 একটি মডিউলে ন্যাভ গ্রাফ যাচাই করতে ব্যর্থ হয়।
AGP অপ্রচলিত Gradle API ব্যবহার করে: মাল্টি-স্ট্রিং নোটেশন
minSdkVersion >=21 সহ লিগ্যাসি মাল্টিডেক্স লাইব্রেরি ব্যবহার করার চেষ্টা করা ব্যবহারকারীদের সতর্ক করুন।
কোড জেনারেশন টাস্ক থাকলে বিল্ড ব্যর্থ হয়।
`android.builtInKotlin=false`, `android.newDsl=false` এবং `android.enableLegacyVariantApi=false` সেট করা থাকলে, `kotlin-android` প্লাগইন ব্যবহার করলে "API 'applicationVariants' is obsolete" এই ত্রুটি দেখা দেবে।
যখন kotlin.stdlib.default.dependency=false থাকে, তখন বিল্ট-ইন কোটলিন সংস্করণবিহীন kotlin-stdlib সমাধান করতে ব্যর্থ হয়।
DexData ফাইলটি বন্ধ না করেই খুলে ফেলে, ফলে পরিষ্করণ বাধাগ্রস্ত হয়।
AGP 9.0 থেকে AndroidSourceDirectorySet-এর PatternFilterable এক্সটেন্ড করা বন্ধ করা উচিত।
শুধুমাত্র পরীক্ষার জন্য মডিউলগুলিতে টেস্ট ফিক্সচার ত্রুটি
টেস্ট ফিক্সচারে কনটেক্সট রিসিভার ব্যবহার করার সময় ভুল ত্রুটি
testFixtures-এ Kotlin কোডের জন্য IDE-এর ভুল ত্রুটি
`kotlin-kapt`-এর মতো নয়, `legacy-kapt` প্লাগইন অ্যানোটেশন প্রসেসিং এড়িয়ে যায়।
compileSdkSpec.minorApiLevel, SettingsExtension-এর সাথে কাজ করছে না।
[fused lib - public] তৈরি করা ফিউজড লাইব্রেরিতে সোর্স অন্তর্ভুক্ত নেই।
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 Managed Devices-এর সাথে `com.android.kotlin.multiplatform.library` ক্র্যাশ করে।
`android.defaults.buildfeatures.aidl` ডিফল্ট gradle.properties ফ্ল্যাগগুলি সরান
প্রোগার্ড ফাইল বিদ্যমান না থাকলে বিল্ড ব্যর্থ হবে।
buildconfig ডিফল্ট gradle.properties ফ্ল্যাগগুলি সরান
অ্যাপের targetSdk ডিফল্ট মান minSdk-এর পরিবর্তে compileSdk-এর উপর ভিত্তি করে পরিবর্তন করুন।
যখন `isIncludeAndroidResources` সক্রিয় থাকে, তখন AGP 8.12.0-এ `process{Variant}UnitTestManifest` `tools:overrideLibrary` ব্যবহারগুলিকে মার্জ করতে ব্যর্থ হয়।
JVM টেস্ট টাস্কের জন্য Gradle-এ AGP-এর কারণে ডেপ্রিকেশন ওয়ার্নিং দেখা দিচ্ছে।
DependencyReportTask কনফিগারেশন ক্যাশের সাথে বেমানান।
AGP 9.0-এ ডিফল্ট সোর্স/টার্গেট জাভা ভার্সন জাভা ৮ থেকে জাভা ১১-এ পরিবর্তন করা হয়েছে।
android.useAndroidX-কে ডিফল্টভাবে true-তে পরিবর্তন করুন।
বিল্ট-ইন কোটলিনের সাথে kapt প্লাগইন প্রয়োগ করার সময় আরও ভালো এক্সেপশন।
consumerProguardFiles-এর জন্য android.proguard.failOnMissingFiles কাজ করছে না।
Kotlin Gradle প্লাগইন নির্ভরতা 2.2.10-এ আপডেট করুন।
KGP API ব্যবহার করে KotlinJvmAndroidCompilation তৈরি করুন
টেস্ট সোর্সগুলিতে কোটলিন এক্সপ্লিসিট এপিআই মোড প্রয়োগ করা হয়েছে
লিন্ট
AGP 8.11.0: apply(from = "...") ব্যবহার করে .gradle.kts ফাইল প্রয়োগ করার সময় lintAnalyzeRelease টাস্কটি ক্র্যাশ করে।
Lint ChecksSdkIntAtLeast Check টীকাযুক্ত মানটি সঠিক কিনা তা যাচাই করে না।
বিল্ট-ইন কোটলিন META-INF-এ .kotlin_module যোগ করে না।
লিন্ট ক্লাসপাথে বিভিন্ন সংস্করণের সদৃশ ক্লাস রয়েছে
ব্যক্তিগত রিসোর্স ওভাররাইড করার বিকল্প পদ্ধতিটি কাজ করছে না (tools:override = "true")
ত্রুটি: অব্যবহৃত রিসোর্স মুছে ফেললে সেগুলোর অনুবাদ মুছে যায় না, এবং এ বিষয়ে কোনো জিজ্ঞাসাও করা হয় না।
লিন্ট সতর্কবার্তা দেখাচ্ছে "K2 ক্যাশে পরিষ্কার করা যায়নি"
লিন্ট সতর্কবার্তা দেখাচ্ছে "K2 ক্যাশে পরিষ্কার করা যায়নি"
লিন্ট ইন্টিগ্রেশন
systemPropertyInputs.javaVersion-এর পার্থক্যের কারণে বিভিন্ন JDK ভেন্ডর বা মাইনর ভার্সনে AndroidLintAnalysisTask ক্যাশে মিস হয়।
compileSdk থাকা সত্ত্বেও Lint স্বয়ংক্রিয়ভাবে সর্বশেষ ইনস্টল করা SDK ব্যবহার করে, টাস্ক ইনপুট হিসাবে নিবন্ধিত হয় না এবং ক্যাশিং নষ্ট করে দেয়।
সঙ্কোচনকারী (R8)
চূড়ান্ত রিসোর্স আইডি ব্যবহার করলে R8 অপ্টিমাইজ করা রিসোর্স সঙ্কুচিতকরণ নীরবে ব্যর্থ হয়।