Android Gradle প্লাগ-ইন 7.0.0 (জুলাই ২০২১)

Android Gradle প্লাগ-ইন 7.0.0 হল একটি প্রধান রিলিজ যাতে বিভিন্ন ধরনের নতুন ফিচার এবং উন্নতি অন্তর্ভুক্ত রয়েছে।

7.0.1 (আগস্ট ২০২১)

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

মানানসই

সর্বনিম্ন ভার্সন ডিফল্ট ভার্সন নোট
Gradle 7.0.2 7.0.2 আরও জানতে, Gradle আপডেট করা দেখুন।
SDK বিল্ড টুল 30.0.2 30.0.2 SDK বিল্ড টুল ইনস্টল বা কনফিগার করুন।
NDK N/A 21.4.7075529 NDK-এর অন্য কোনও ভার্সন ইনস্টল বা কনফিগার করুন।
JDK 11 11 আরও জানতে, JDK ভার্সন সেট করা দেখুন।

AGP 7.0 চালানোর জন্য JDK 11 প্রয়োজন

আপনার অ্যাপ তৈরি করার জন্য Android Gradle প্লাগ-ইন 7.0 ব্যবহার করার সময়, Gradle রান করার জন্য এখন JDK 11 প্রয়োজন। Android Studio Arctic Fox, JDK 11 বান্ডেল করে এবং ডিফল্ট হিসেবে এটি ব্যবহার করার জন্য Gradle কনফিগার করে, যার অর্থ হল বেশিরভাগ Android Studio ব্যবহারকারীকে তাদের প্রোজেক্টে কোনও কনফিগারেশন পরিবর্তন করতে হবে না।

Android Studio-র মধ্যে AGP-এর মাধ্যমে ব্যবহৃত JDK ভার্সন ম্যানুয়ালি সেট করতে হলে, আপনাকে JDK 11 বা তার পরবর্তী যেকোনও ভার্সন ব্যবহার করতে হবে।

Android Studio থেকে স্বাধীনভাবে AGP ব্যবহার করার সময়, JAVA_HOME এনভায়রনমেন্ট ভেরিয়েবল বা -Dorg.gradle.java.home কমান্ড-লাইন বিকল্প আপনার JDK 11-এর ইনস্টলেশন ডিরেক্টরিতে সেট করে JDK ভার্সন আপগ্রেড করুন।

মনে রাখবেন যে, SDK ম্যানেজার এবং AVD ম্যানেজার, যা বন্ধ হয়ে যাওয়া SDK টুল প্যাকেজে রয়েছে, JDK 11-এর সাথে কাজ করে না। AGP 7.0 এবং তার পরবর্তী যেকোনও ভার্সনের সাথে SDK Manager এবং AVD Manager ব্যবহার করা চালিয়ে যেতে, আপনাকে বর্তমান Android SDK Command-Line Tools প্যাকেজে টুলের নতুন ভার্সনে পরিবর্তন করতে হবে।

Variant API stable

নতুন ভেরিয়েন্ট API এখন স্টেবল। com.android.build.api.variant প্যাকেজে নতুন ইন্টারফেস এবং gradle-recipes GitHub প্রোজেক্টে উদাহরণ দেখুন। নতুন Variant API-এর অংশ হিসেবে, আমরা আর্টিফ্যাক্ট ইন্টারফেসের মাধ্যমে আর্টিফ্যাক্ট নামে পরিচিত বেশ কিছু ইন্টারমিডিয়েট ফাইল উপলভ্য করেছি। মার্জ করা ম্যানিফেস্টের মতো এইসব আর্টিফ্যাক্ট, থার্ড-পার্টি প্লাগ-ইন ও কোড ব্যবহার করে নিরাপদে পাওয়া ও কাস্টমাইজ করা যেতে পারে।

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

Lint-এর জন্য আচরণগত পরিবর্তন

এই বিভাগে Android Gradle প্লাগ-ইন 7.0.0-এ একাধিক লিন্ট আচরণ পরিবর্তন বর্ণনা করা হয়েছে।

লাইব্রেরি ডিপেন্ডেন্সির জন্য উন্নত লিন্ট

checkDependencies = true-এর সাথে লিন্ট রান করা এখন আগের থেকে আরও দ্রুত হয়েছে। লাইব্রেরি ডিপেন্ডেন্সি সহ অ্যাপ নিয়ে গঠিত Android প্রোজেক্টের জন্য, নিচের উদাহরণে দেখানো অনুযায়ী checkDependencies-কে true-এ সেট করা এবং ./gradlew :app:lint ব্যবহার করে লিন্ট রান করার সাজেশন দেওয়া হয়, যা সমান্তরালভাবে সব ডিপেন্ডেন্সি মডিউল বিশ্লেষণ করবে এবং অ্যাপ ও এর সব ডিপেন্ডেন্সি থেকে সমস্যা সহ একটি রিপোর্ট তৈরি করবে।

গ্ৰুভি

// build.gradle
android {
  ...
  lintOptions {
    checkDependencies true
  }
}

Kotlin

// build.gradle.kts
android {
  ...
  lint {
    isCheckDependencies = true
  }
}

Lint টাস্ক এখন UP-TO-DATE হতে পারে

কোনও মডিউলের সোর্স ও রিসোর্স পরিবর্তন না হলে, মডিউলের জন্য লিন্ট বিশ্লেষণ টাস্ক আবার রান করার প্রয়োজন হয় না। এটি হলে, Gradle আউটপুটে টাস্কের এক্সিকিউশন "আপ-টু-ডেট" হিসেবে দেখানো হয়। এই পরিবর্তনের ফলে, checkDependencies = true-এর সাথে কোনও অ্যাপ্লিকেশন মডিউলে লিন্ট রান করার সময়, শুধুমাত্র পরিবর্তিত মডিউলগুলির বিশ্লেষণ রান করতে হবে। এর ফলে, Lint আরও দ্রুত রান করতে পারে।

Lint রিপোর্ট টাস্কের ইনপুট পরিবর্তন না হলে সেটিও রান করার প্রয়োজন হয় না। এই ধরনের একটি পরিচিত সমস্যা হল, লিন্ট টাস্ক UP-TO-DATE (সমস্যা #191897708) থাকলে, stdout-এ কোনও লিন্ট টেক্সট আউটপুট প্রিন্ট করা হয় না।

ডায়নামিক-ফিচার মডিউলে লিন্ট রান করা হচ্ছে

AGP-তে ডায়নামিক-ফিচার মডিউল থেকে লিন্ট রান করার সুবিধা আর কাজ করে না। সংশ্লিষ্ট অ্যাপ্লিকেশন মডিউল থেকে লিন্ট রান করলে, এটি ডাইনামিক-ফিচার মডিউলে লিন্ট রান করবে এবং অ্যাপের লিন্ট রিপোর্টে সব সমস্যা অন্তর্ভুক্ত করবে। একটি সম্পর্কিত পরিচিত সমস্যা হল যে অ্যাপ মডিউল থেকে checkDependencies = true-এর সাথে লিন্ট রান করার সময়, ডায়নামিক-ফিচার লাইব্রেরি ডিপেন্ডেন্সি চেক করা হয় না, যদি না সেগুলিও অ্যাপ ডিপেন্ডেন্সি হয় (সমস্যা #১৯১৯৭৭৮৮৮)।

শুধুমাত্র ডিফল্ট ভেরিয়েন্টে লিন্ট রান করা হচ্ছে

./gradlew :app:lint রান করলে এখন শুধু ডিফল্ট ভ্যারিয়েন্টের জন্য লিন্ট রান করে। AGP-এর আগের ভার্সনে, এটি সব ভেরিয়েন্টের জন্য লিন্ট রান করত।

R8 শ্রিঙ্কারে ক্লাস সংক্রান্ত সতর্কতা নেই

R8 আরও নিখুঁতভাবে এবং ধারাবাহিকভাবে অনুপস্থিত ক্লাস এবং -dontwarn বিকল্প ম্যানেজ করে। তাই, R8-এর মাধ্যমে দেখানো মিসিং ক্লাস সংক্রান্ত সতর্কতা মূল্যায়ন করা শুরু করতে হবে।

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

R8: Missing class: java.lang.instrument.ClassFileTransformer

এই সতর্কতার অর্থ হল, আপনার অ্যাপের কোড বিশ্লেষণ করার সময় java.lang.instrument.ClassFileTransformer ক্লাস ডেফিনেশন খুঁজে পাওয়া যায়নি। সাধারণত এর অর্থ হল কোনও সমস্যা হয়েছে, তবে আপনি এই সতর্কতা উপেক্ষা করতে চাইতে পারেন। সতর্কতা উপেক্ষা করার দুটি সাধারণ কারণ হল:

  1. JVM-কে টার্গেট করা লাইব্রেরি এবং অনুপস্থিত ক্লাস JVM লাইব্রেরি ধরনের (যেমন উপরে উদাহরণে দেখানো হয়েছে)।

  2. আপনার একটি ডিপেন্ডেন্সি শুধুমাত্র কম্পাইল-টাইম API ব্যবহার করে।

আপনি proguard-rules.pro ফাইলে -dontwarn নিয়ম যোগ করে মিসিং ক্লাস সংক্রান্ত সতর্কতা উপেক্ষা করতে পারবেন। যেমন:

-dontwarn java.lang.instrument.ClassFileTransformer

সুবিধার জন্য, AGP এমন একটি ফাইল তৈরি করবে যাতে সম্ভাব্য সব অনুপস্থিত নিয়ম রয়েছে, সেগুলিকে নিম্নলিখিত পাথে লেখা হবে: app/build/outputs/mapping/release/missing_rules.txt। সতর্কতা এড়িয়ে যেতে আপনার proguard-rules.pro ফাইলে নিয়ম যোগ করুন।

AGP 7.0-এ, ক্লাস মেসেজ না থাকলে তা সতর্কতা হিসেবে দেখানো হবে এবং আপনি android.r8.failOnMissingClasses = true-এ gradle.properties সেট করে সেগুলিকে ত্রুটি হিসেবে দেখাতে পারবেন। AGP 8.0-তে, এই সতর্কতাগুলি এমন সমস্যা হয়ে যাবে যা আপনার বিল্ডকে ভেঙে দেবে। আপনার proguard-rules.pro ফাইলে -ignorewarnings বিকল্প যোগ করে AGP 7.0-এর আচরণ বজায় রাখা সম্ভব, তবে এটি করার সাজেশন দেওয়া হয় না।

Android Gradle প্লাগ-ইন বিল্ড ক্যাশে সরিয়ে দেওয়া হয়েছে

AGP 4.1-এ AGP বিল্ড ক্যাশে সরিয়ে দেওয়া হয়েছে। Gradle বিল্ড ক্যাশের পরিপূরক হিসেবে AGP 2.3-এ আগে চালু করা AGP বিল্ড ক্যাশ, AGP 4.1-এ Gradle বিল্ড ক্যাশ দ্বারা সম্পূর্ণরূপে স্থান অধিকার করা হয়েছিল। এই পরিবর্তন বিল্ড টাইমকে প্রভাবিত করে না।

AGP 7.0-এ, android.enableBuildCache প্রপার্টি, android.buildCacheDir প্রপার্টি এবং cleanBuildCache টাস্ক সরিয়ে দেওয়া হয়েছে।

আপনার প্রোজেক্টে Java 11 সোর্স কোড ব্যবহার করুন

আপনি এখন আপনার অ্যাপের প্রোজেক্টে Java 11 সোর্স কোড পর্যন্ত কম্পাইল করতে পারবেন, যা আপনাকে প্রাইভেট ইন্টারফেস পদ্ধতি, অ্যানোনিমাস ক্লাসের জন্য ডায়মন্ড অপারেটর এবং ল্যাম্বডা প্যারামিটারের জন্য লোকাল ভেরিয়েবল সিনট্যাক্সের মতো নতুন ভাষার ফিচার ব্যবহার করার সুবিধা দেয়।

এই ফিচার চালু করতে, আপনার বেছে নেওয়া Java ভার্সনে compileOptions সেট করুন এবং compileSdkVersion-এ ৩০ বা তার বেশি সেট করুন:

// build.gradle
android {
  compileSdkVersion 30
  compileOptions {
    sourceCompatibility JavaVersion.VERSION_11
    targetCompatibility JavaVersion.VERSION_11
  }
  // For Kotlin projects
  kotlinOptions {
    jvmTarget = "11"
  }
}
// build.gradle.kts
android {
  compileSdkVersion(30)
  compileOptions {
    sourceCompatibility(JavaVersion.VERSION_11)
    targetCompatibility(JavaVersion.VERSION_11)
  }
  kotlinOptions {
    jvmTarget = "11"
  }
}

ডিপেন্ডেন্সি কনফিগারেশন সরানো হয়েছে

AGP 7.0-এ, নিম্নলিখিত কনফিগারেশন (বা ডিপেন্ডেন্সি স্কোপ) সরিয়ে দেওয়া হয়েছে:

  • compile
    ব্যবহারের উপর নির্ভর করে, এটি api বা implementation দ্বারা পরিবর্তন করা হয়েছে।
    এছাড়াও *Compile ভেরিয়েন্টের ক্ষেত্রে প্রযোজ্য, যেমন: debugCompile।
  • provided
    এটি compileOnly দ্বারা প্রতিস্থাপিত হয়েছে।
    এছাড়াও, *প্রদান করা ভেরিয়েন্টের ক্ষেত্রে প্রযোজ্য, যেমন: releaseProvided.
  • apk
    এটি runtimeOnly দ্বারা প্রতিস্থাপিত হয়েছে।
  • publish
    এটি runtimeOnly দ্বারা প্রতিস্থাপিত হয়েছে।

বেশিরভাগ ক্ষেত্রে, AGP আপগ্রেড অ্যাসিস্ট্যান্ট অটোমেটিক আপনার প্রোজেক্ট নতুন কনফিগারেশনে মাইগ্রেট করবে।

Android Gradle প্লাগ-ইন ব্যবহার করে কম্পাইল করার সময় ক্লাসপাথ পরিবর্তন

আপনি Android Gradle প্লাগ-ইনের সাথে কম্পাইল করলে, আপনার কম্পাইল ক্লাসপাথ পরিবর্তন হতে পারে। যেহেতু AGP এখন ইন্টার্নালি api/implementation কনফিগারেশন ব্যবহার করে, তাই আপনার কম্পাইল ক্লাসপাথ থেকে কিছু আর্টিফ্যাক্ট সরিয়ে দেওয়া হতে পারে। কম্পাইল-টাইমে আপনি AGP ডিপেন্ডেন্সির উপর নির্ভর করলে, এটি এক্সপ্লিসিট ডিপেন্ডেন্সি হিসেবে যোগ করতে ভুলবেন না।

Java রিসোর্স ফোল্ডারে JNI লাইব্রেরি যোগ করার সুবিধা কাজ করে না

আগে, আপনি Java রিসোর্স ফোল্ডারে JNI লাইব্রেরি যোগ করতে পারতেন এবং android.sourceSets.main.resources.srcDirs ব্যবহার করে ফোল্ডারটি রেজিস্টার করতে পারতেন যাতে JNI লাইব্রেরি এক্সট্র্যাক্ট করা যায় এবং ফাইনাল APK-তে যোগ করা যায়। AGP 7.0 থেকে শুরু করে, এটি কাজ করে না এবং Java রিসোর্স ফোল্ডারে JNI লাইব্রেরি এড়িয়ে যাওয়া হয়। পরিবর্তে, JNI লাইব্রেরির জন্য উদ্দিষ্ট DSL পদ্ধতি ব্যবহার করুন, android.sourceSets.main.jniLibs.srcDirs। আরও তথ্যের জন্য, কীভাবে সোর্স সেট কনফিগার করতে হয় দেখুন।

পরিচিত সমস্যা

এই বিভাগে Android Gradle প্লাগ-ইন 7.0.0-এ থাকা পরিচিত সমস্যাগুলি বর্ণনা করা হয়েছে।

1.4.x Kotlin Multiplatform প্লাগ-ইনের সাথে মানানসই নয়

Android Gradle প্লাগ-ইন 7.0.0 Kotlin Multiplatform প্লাগ-ইন 1.5.0 এবং তার পরবর্তী ভার্সনের সাথে মানানসই। Kotlin মাল্টিপ্ল্যাটফর্ম সাপোর্ট ব্যবহার করে এমন প্রোজেক্টকে Android Gradle প্লাগ-ইন 7.0.0 ব্যবহার করার জন্য Kotlin 1.5.0-এ আপডেট করতে হবে। বিকল্প হিসেবে, আপনি Android Gradle প্লাগ-ইন ডাউনগ্রেড করে 4.2.x ভার্সনে নিয়ে যেতে পারেন, যদিও এটি সাজেস্ট করা হয় না।

আরও তথ্যের জন্য, KT-43944 দেখুন।

লিন্ট আউটপুট নেই

লিন্ট টাস্ক আপ-টু-ডেট থাকলে, stdout-এ কোনও লিন্ট টেক্সট আউটপুট প্রিন্ট করা হয় না (সমস্যা #১৯১৮৯৭৭০৮)। আরও প্রসঙ্গের জন্য, লিন্টের জন্য আচরণগত পরিবর্তন দেখুন। এই সমস্যাটি Android Gradle প্লাগ-ইন 7.1-এ সমাধান করা হবে।

সব ডায়নামিক-ফিচার লাইব্রেরি ডিপেন্ডেন্সি লিন্ট চেক করা হয় না

অ্যাপ মডিউল থেকে checkDependencies = true-এর সাথে লিন্ট রান করার সময়, ডায়নামিক-ফিচার লাইব্রেরি ডিপেন্ডেন্সি চেক করা হয় না, যদি না সেগুলি অ্যাপ ডিপেন্ডেন্সিও হয় (সমস্যা #১৯১৯৭৭৮৮৮)। বিকল্প হিসেবে, লিন্ট টাস্ক সেইসব লাইব্রেরিতে রান করা যেতে পারে। আরও প্রসঙ্গের জন্য, লিন্টের জন্য আচরণগত পরিবর্তন দেখুন।