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

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

৭.০.১ (আগস্ট ২০২১)

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

সামঞ্জস্যতা

সর্বনিম্ন সংস্করণ ডিফল্ট সংস্করণ নোট
গ্রেডল ৭.০.২ ৭.০.২ আরও জানতে, Gradle আপডেট করা দেখুন।
এসডিকে বিল্ড টুলস ৩০.০.২ ৩০.০.২ এসডিকে বিল্ড টুলস ইনস্টল বা কনফিগার করুন
এনডিকে প্রযোজ্য নয় ২১.৪.৭০৭৫৫২৯ NDK-এর একটি ভিন্ন সংস্করণ ইনস্টল বা কনফিগার করুন
জেডিকে ১১ ১১ আরও জানতে, JDK সংস্করণ নির্ধারণ দেখুন।

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

আপনার অ্যাপ বিল্ড করার জন্য অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৭.০ ব্যবহার করার সময়, গ্রেডল চালানোর জন্য এখন জেডিকে ১১ প্রয়োজন। অ্যান্ড্রয়েড স্টুডিও আর্কটিক ফক্স জেডিকে ১১ বান্ডল করে এবং ডিফল্টরূপে এটি ব্যবহার করার জন্য গ্রেডলকে কনফিগার করে দেয়, যার অর্থ হলো বেশিরভাগ অ্যান্ড্রয়েড স্টুডিও ব্যবহারকারীকে তাদের প্রোজেক্টে কোনো কনফিগারেশন পরিবর্তন করতে হয় না।

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

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

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

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

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

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

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

এই অংশে অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৭.০.০-তে লিন্ট (Lint)-এর আচরণে আনা একাধিক পরিবর্তন বর্ণনা করা হয়েছে।

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

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

গ্রুভি

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

কোটলিন

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

লিন্ট টাস্কগুলো এখন হালনাগাদ করা যাবে।

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

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

ডাইনামিক-ফিচার মডিউলগুলিতে লিন্ট চালানো হচ্ছে

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

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

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

R8 শ্রিনকারে অনুপস্থিত ক্লাস সতর্কতা

R8 অনুপস্থিত ক্লাস এবং -dontwarn অপশনটিকে আরও নির্ভুলভাবে ও সামঞ্জস্যপূর্ণভাবে পরিচালনা করে। অতএব, আপনার R8 দ্বারা নির্গত অনুপস্থিত ক্লাসের সতর্কতাগুলো মূল্যায়ন করা শুরু করা উচিত।

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

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

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

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

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

আপনার proguard-rules.pro ফাইলে একটি -dontwarn রুল যোগ করে আপনি ক্লাস অনুপস্থিত থাকার সতর্কতা উপেক্ষা করতে পারেন। উদাহরণস্বরূপ:

-dontwarn java.lang.instrument.ClassFileTransformer

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

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

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

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

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

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

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

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

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

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

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

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

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

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

এই অংশে অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৭.০.০-এ বিদ্যমান জ্ঞাত সমস্যাগুলো বর্ণনা করা হয়েছে।

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

অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৭.০.০, কোটলিন মাল্টিপ্ল্যাটফর্ম প্লাগইন ১.৫.০ এবং এর উচ্চতর সংস্করণগুলোর সাথে সামঞ্জস্যপূর্ণ। যেসব প্রজেক্টে কোটলিন মাল্টিপ্ল্যাটফর্ম সাপোর্ট ব্যবহৃত হয়, অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৭.০.০ ব্যবহার করার জন্য সেগুলোকে কোটলিন ১.৫.০-তে আপডেট করতে হবে। একটি বিকল্প সমাধান হিসেবে, আপনি অ্যান্ড্রয়েড গ্রেডল প্লাগইনটিকে ৪.২.x সংস্করণে ডাউনগ্রেড করতে পারেন, যদিও এটি সুপারিশ করা হয় না।

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

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

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

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

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