Android Gradle Plugin 7.0.0 (জুলাই 2021)

অ্যান্ড্রয়েড গ্রেডল প্লাগইন 7.0.0 একটি বড় রিলিজ যাতে বিভিন্ন ধরনের নতুন বৈশিষ্ট্য এবং উন্নতি রয়েছে।

7.0.1 (আগস্ট 2021)

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

সামঞ্জস্য

ন্যূনতম সংস্করণ ডিফল্ট সংস্করণ
গ্রেডল 7.0.2 7.0.2
SDK বিল্ড টুলস 30.0.2 30.0.2
এনডিকে N/A 21.4.7075529
জেডিকে 11 11

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

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

আপনি যদি অ্যান্ড্রয়েড স্টুডিওর ভিতরে AGP দ্বারা ব্যবহৃত JDK সংস্করণটি ম্যানুয়ালি সেট করতে চান তবে আপনাকে JDK 11 বা উচ্চতর ব্যবহার করতে হবে।

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

মনে রাখবেন যে অবরুদ্ধ SDK টুলস প্যাকেজে SDK ম্যানেজার এবং AVD ম্যানেজার JDK 11-এর সাথে কাজ করে না। AGP 7.0 এবং উচ্চতর SDK ম্যানেজার এবং AVD ম্যানেজার ব্যবহার করা চালিয়ে যেতে, আপনাকে টুলগুলির নতুন সংস্করণগুলিতে স্যুইচ করতে হবে বর্তমান অ্যান্ড্রয়েড SDK কমান্ড-লাইন টুলস প্যাকেজ

ভেরিয়েন্ট এপিআই স্থিতিশীল

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

আমরা নতুন কার্যকারিতা যোগ করে এবং কাস্টমাইজেশনের জন্য উপলব্ধ মধ্যবর্তী শিল্পকর্মের সংখ্যা বৃদ্ধি করে ভেরিয়েন্ট API প্রসারিত করা চালিয়ে যাব।

লিন্টের জন্য আচরণ পরিবর্তন

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

লাইব্রেরি নির্ভরতার জন্য উন্নত লিন্ট

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

গ্রোভি

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

কোটলিন

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

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

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

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

গতিশীল-বৈশিষ্ট্য মডিউলে লিন্ট চলছে

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

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

চলমান ./gradlew :app:lint এখন শুধুমাত্র ডিফল্ট ভেরিয়েন্টের জন্য lint চালায়। এজিপির পূর্ববর্তী সংস্করণগুলিতে, এটি সমস্ত রূপের জন্য লিন্ট চালাবে।

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

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

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

অ্যান্ড্রয়েড গ্রেডল প্লাগইন বিল্ড ক্যাশে সরানো হয়েছে

AGP বিল্ড ক্যাশে AGP 4.1 এ সরানো হয়েছে। গ্র্যাডল বিল্ড ক্যাশে পরিপূরক করার জন্য পূর্বে এজিপি 2.3 এ প্রবর্তন করা হয়েছিল, এজিপি বিল্ড ক্যাশে সম্পূর্ণভাবে এজিপি 4.1-এ গ্রেডল বিল্ড ক্যাশে দ্বারা বাতিল করা হয়েছিল। এই পরিবর্তন বিল্ড সময় প্রভাবিত করে না.

AGP 7.0 এ, android.enableBuildCache প্রপার্টি, android.buildCacheDir প্রপার্টি এবং cleanBuildCache টাস্ক মুছে ফেলা হয়েছে।

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

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

এই বৈশিষ্ট্যটি সক্ষম করতে, পছন্দসই জাভা সংস্করণে compileOptions সেট করুন এবং compileSdkVersion 30 বা তার উপরে সেট করুন:

// 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 দ্বারা প্রতিস্থাপিত হয়েছে।
    এছাড়াও *কম্পাইল ভেরিয়েন্টে প্রযোজ্য, উদাহরণস্বরূপ: debugCompile
  • provided
    এটি compileOnly দ্বারা প্রতিস্থাপিত হয়েছে।
    এছাড়াও *প্রদত্ত ভেরিয়েন্টের ক্ষেত্রে প্রযোজ্য, উদাহরণস্বরূপ: releaseProvided
  • apk
    এটি runtimeOnly দ্বারা প্রতিস্থাপিত হয়েছে।
  • publish
    এটি runtimeOnly দ্বারা প্রতিস্থাপিত হয়েছে।

বেশিরভাগ ক্ষেত্রে, AGP আপগ্রেড সহকারী স্বয়ংক্রিয়ভাবে আপনার প্রকল্পটিকে নতুন কনফিগারেশনে স্থানান্তরিত করবে।

অ্যান্ড্রয়েড গ্রেডল প্লাগইনের বিরুদ্ধে কম্পাইল করার সময় ক্লাসপথ পরিবর্তন

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

জাভা রিসোর্স ফোল্ডারে নেটিভ লাইব্রেরি যোগ করা সমর্থিত নয়

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

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

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

1.4.x কোটলিন মাল্টিপ্ল্যাটফর্ম প্লাগইনের সাথে অসঙ্গতি

অ্যান্ড্রয়েড গ্রেডল প্লাগইন 7.0.0 কোটলিন মাল্টিপ্ল্যাটফর্ম প্লাগইন 1.5.0 এবং উচ্চতরের সাথে সামঞ্জস্যপূর্ণ। কোটলিন মাল্টিপ্ল্যাটফর্ম সমর্থন ব্যবহার করে এমন প্রকল্পগুলিকে অ্যান্ড্রয়েড গ্রেডল প্লাগইন 7.0.0 ব্যবহার করতে Kotlin 1.5.0-এ আপডেট করতে হবে। একটি সমাধান হিসাবে, আপনি Android Gradle প্লাগইনটিকে 4.2.x এ ডাউনগ্রেড করতে পারেন, যদিও এটি সুপারিশ করা হয় না।

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

লিন্ট আউটপুট অনুপস্থিত

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

সমস্ত গতিশীল-বৈশিষ্ট্য লাইব্রেরি নির্ভরতা লিন্ট চেক করা হয় না

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