Android Gradle Plugin 4.0.0 (এপ্রিল, ২০২০)

Android প্লাগ-ইনের এই ভার্সনের জন্য নিম্নলিখিত বিষয়গুলি প্রয়োজন:

4.0.1 (জুলাই, ২০২০)

এই মাইনর আপডেট নতুন ডিফল্ট সেটিংস ও প্যাকেজ দৃশ্যমানতার জন্য Android 11-এর সাথে মানানসই হওয়ার ব্যাপারে সহায়তা করে।

Android-এর আগের ভার্সনে, ডিভাইসে ইনস্টল করা সব অ্যাপের একটি তালিকা দেখা যেত। Android 11 (API লেভেল 30) থেকে শুরু করে, ডিফল্ট হিসেবে অ্যাপের কাছে শুধুমাত্র ইনস্টল করা প্যাকেজের ফিল্টার করা তালিকার অ্যাক্সেস থাকে। সিস্টেমে অ্যাপের আরও বড় তালিকা দেখতে, আপনাকে এখন অ্যাপ বা লাইব্রেরির Android ম্যানিফেস্টে একটি <queries> এলিমেন্ট যোগ করতে হবে।

Android Gradle প্লাগ-ইন 4.1+ ভার্সন নতুন <queries> ঘোষণার সাথে আগেই মানানসই; তবে, পুরনো ভার্সন মানানসই নয়। আপনি <queries> এলিমেন্ট যোগ করলে অথবা আপনি Android 11-এ টার্গেট করার সুবিধা দেয় এমন কোনও লাইব্রেরি বা SDK ব্যবহার করা শুরু করলে, আপনার অ্যাপ তৈরি করার সময় ম্যানিফেস্ট মার্জ করা সংক্রান্ত সমস্যা হতে পারে।

এই সমস্যার সমাধান করতে, আমরা AGP 3.3 ও এর পরের যেকোনও ভার্সনের জন্য প্যাচের একটি সেট রিলিজ করছি। আপনি AGP-র পুরনো ভার্সন ব্যবহার করলে, আপগ্রেড করে নিম্নলিখিত ভার্সনের যেকোনও একটিতে পরিবর্তন করুন:

ন্যূনতম ভার্সন ডিফল্ট ভার্সন নোট
Gradle ৬.১.১ ৬.১.১ আরও জানতে, Gradle আপডেট করা দেখুন।
SDK Build Tools 29.0.2 29.0.2 SDK বিল্ড টুল ইনস্টল বা কনফিগার করুন।

এই নতুন ফিচার সম্পর্কে আরও জানতে, Android 11-এ প্যাকেজ ভিজিবিলিটি দেখুন।

নতুন বৈশিষ্ট্য

Android Gradle প্লাগ-ইনের এই ভার্সনে নিম্নলিখিত নতুন ফিচার অন্তর্ভুক্ত রয়েছে।

Android Studio Build Analyzer-এর জন্য সহায়তা

বিল্ড অ্যানালাইজার উইন্ডো আপনাকে বিল্ড প্রসেস সংক্রান্ত সমস্যা বুঝতে ও তা নির্ণয় করতে সাহায্য করে। যেমন, অপ্টিমাইজেশন বন্ধ করা এবং ভুলভাবে কনফিগার করা টাস্ক। Android Studio 4.0 ও তার পরবর্তী যেকোনও ভার্সনের সাথে Android Gradle প্লাগ-ইন 4.0.0 ও তার পরবর্তী যেকোনও ভার্সন ব্যবহার করলে এই ফিচার উপলভ্য হয়। আপনি Android Studio থেকে নিম্নলিখিত উপায়ে বিল্ড অ্যানালাইজার উইন্ডো খুলতে পারবেন:

  1. আপনি আগে থেকে এটি না করে থাকলে, মেনু বার থেকে বিল্ড করুন > তৈরি করুন প্রোজেক্ট বিকল্প বেছে নিয়ে আপনার অ্যাপ তৈরি করুন।
  2. মেনু বার থেকে দেখুন > টুল উইন্ডো > বিল্ড করুন বিকল্প বেছে নিন।
  3. বিল্ড উইন্ডোতে, নিম্নলিখিত উপায়গুলির মধ্যে কোনও একটিতে বিল্ড অ্যানালাইজার উইন্ডো খুলুন:
    • Android Studio আপনার প্রোজেক্ট তৈরি করা সম্পূর্ণ করলে, তৈরি করুন অ্যানালাইজার ট্যাবে ক্লিক করুন।
    • Android Studio আপনার প্রোজেক্ট তৈরি করা শেষ করলে, বিল্ড আউটপুট উইন্ডোর ডানদিকে লিঙ্কে ক্লিক করুন।

বিল্ড অ্যানালাইজার উইন্ডো সম্ভাব্য বিল্ড সংক্রান্ত সমস্যাগুলিকে বাঁদিকে একটি ট্রি-তে সাজায়। আপনি ডানদিকের প্যানেলে প্রতিটি সমস্যা পরীক্ষা করে দেখতে এবং তার বিবরণ জানতে ক্লিক করতে পারবেন। Android Studio আপনার বিল্ড বিশ্লেষণ করার সময়, এটি সেইসব টাস্কের সেট কম্পিউট করে যেগুলি বিল্ডের সময়সীমা নির্ধারণ করে এবং আপনাকে এইসব টাস্কের প্রত্যেকটির প্রভাব বুঝতে সাহায্য করার জন্য একটি ভিজ্যুয়ালাইজেশন প্রদান করে। এছাড়াও, সতর্কতা নোড বড় করে আপনি সতর্কতা সম্পর্কিত বিবরণ দেখতে পাবেন।

আরও জানতে, বিল্ড স্পিড রিগ্রেশন শনাক্ত করা নিবন্ধটি পড়ুন।

D8 ও R8-এ Java 8 লাইব্রেরি ডিসুগারিং

Android Gradle প্লাগ-ইনে এখন একাধিক Java 8 ভাষা API ব্যবহার করার সুবিধা অন্তর্ভুক্ত করা হয়েছে, এর জন্য আপনার অ্যাপের ন্যূনতম API লেভেলের প্রয়োজন নেই।

ডিসেগারিং নামক একটি প্রসেসের মাধ্যমে, Android Studio 3.0 ও এর পরের যেকোনও ভার্সনে থাকা DEX কম্পাইলার, D8, ইতিমধ্যেই Java 8 ল্যাঙ্গুয়েজ ফিচারের জন্য যথেষ্ট সহায়তা প্রদান করেছে (যেমন, ল্যাম্বডা এক্সপ্রেশন, ডিফল্ট ইন্টারফেস মেথড, রিসোর্স সহ চেষ্টা করা এবং আরও অনেক কিছু)। Android Studio 4.0-এ, জাভা ল্যাঙ্গুয়েজ API-কে ডিসুগার করার জন্য ডিসুগারিং ইঞ্জিনকে আরও উন্নত করা হয়েছে। এর অর্থ হল, আপনি এখন এমন অ্যাপে স্ট্যান্ডার্ড ল্যাঙ্গুয়েজ API যোগ করতে পারবেন যা শুধুমাত্র সাম্প্রতিক Android রিলিজেই (যেমন, java.util.streams) উপলভ্য ছিল এবং যা Android-এর পুরনো ভার্সনে কাজ করে।

এই রিলিজের ক্ষেত্রে নিম্নলিখিত API-এর সেট কাজ করে:

  • সিকোয়েন্সিয়াল স্ট্রিম (java.util.stream)
  • java.time-এর সাবসেট
  • java.util.function
  • java.util.{Map,Collection,Comparator}-এ সম্প্রতি যোগ করা হয়েছে
  • ঐচ্ছিক (java.util.Optional, java.util.OptionalInt এবং java.util.OptionalDouble) এবং উপরে উল্লেখ করা API-এর সাথে ব্যবহারযোগ্য অন্যান্য নতুন ক্লাস
  • java.util.concurrent.atomic-এ কিছু সংযোজন (নতুন পদ্ধতি AtomicInteger, AtomicLong ও AtomicReference)
  • ConcurrentHashMap (Android 5.0-এর জন্য সমস্যার সমাধান সহ)

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

এইসব ভাষা API-এর জন্য সহায়তা চালু করতে, আপনার অ্যাপ মডিউলের build.gradle ফাইলে নিম্নলিখিত বিষয়গুলি যোগ করুন:

android {
  defaultConfig {
    // Required when setting minSdkVersion to 20 or lower
    multiDexEnabled true
  }

compileOptions { // Flag to enable support for the new language APIs coreLibraryDesugaringEnabled true // Sets Java compatibility to Java 8 sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } }

dependencies { coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.4' }

android {
  defaultConfig {
    // Required when setting minSdkVersion to 20 or lower
    multiDexEnabled = true
  }

compileOptions { // Flag to enable support for the new language APIs isCoreLibraryDesugaringEnabled = true // Sets Java compatibility to Java 8 sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } }

dependencies { coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.0.4") }

মনে রাখবেন, আপনাকে হয়ত উপরে উল্লেখ করা কোড স্নিপেট একটি লাইব্রেরি মডিউলের build.gradle ফাইলে যোগ করতে হবে, যদি

  • লাইব্রেরি মডিউলের ইন্সট্রুমেন্টেড টেস্ট এইসব ল্যাঙ্গুয়েজ API ব্যবহার করে (সরাসরি অথবা লাইব্রেরি মডিউল বা এর ডিপেন্ডেন্সির মাধ্যমে)। এর ফলে আপনার ইন্সট্রুমেন্টেড টেস্ট APK-এর জন্য অনুপস্থিত API প্রদান করা হয়।

  • আপনি আইসোলেশনে লাইব্রেরি মডিউলে লিন্ট রান করতে চান। এর ফলে lint, ল্যাঙ্গুয়েজ API-এর সঠিক ব্যবহার শনাক্ত করতে এবং ভুল সতর্কতা দেখানো এড়াতে পারে।

বিল্ড ফিচার চালু বা বন্ধ করার নতুন বিকল্প

Android Gradle plugin 4.0.0, আপনি কোন বিল্ড ফিচার চালু ও বন্ধ করতে চান তা কন্ট্রোল করার একটি নতুন উপায় নিয়ে এসেছে। যেমন, ভিউ বাইন্ডিং ও ডেটা বাইন্ডিং। নতুন ফিচার যোগ করা হলে, সেগুলি ডিফল্ট হিসেবে বন্ধ করা থাকবে। আপনি তারপরে buildFeatures ব্লক ব্যবহার করে শুধুমাত্র সেইসব ফিচার চালু করতে পারবেন যেগুলি আপনি চান এবং এটি আপনার প্রোজেক্টের জন্য বিল্ড পারফর্ম্যান্স অপ্টিমাইজ করতে সাহায্য করে। আপনি মডিউল-লেভেল build.gradle ফাইলে প্রতিটি মডিউলের জন্য বিকল্প সেট করতে পারবেন, যেমন:

android {
  // The default value for each feature is shown below. You can change the value to
  // override the default behavior.
  buildFeatures {
    // Determines whether to generate a BuildConfig class.
    buildConfig = true
    // Determines whether to support View Binding.
    // Note that the viewBinding.enabled property is now deprecated.
    viewBinding = false
    // Determines whether to support Data Binding.
    // Note that the dataBinding.enabled property is now deprecated.
    dataBinding = false
    // Determines whether to generate binder classes for your AIDL files.
    aidl = true
    // Determines whether to support RenderScript.
    renderScript = true
    // Determines whether to support injecting custom variables into the module’s R class.
    resValues = true
    // Determines whether to support shader AOT compilation.
    shaders = true
  }
}
android {
  // The default value for each feature is shown below. You can change the value to
  // override the default behavior.
  buildFeatures {
    // Determines whether to generate a BuildConfig class.
    buildConfig = true
    // Determines whether to support View Binding.
    // Note that the viewBinding.enabled property is now deprecated.
    viewBinding = false
    // Determines whether to support Data Binding.
    // Note that the dataBinding.enabled property is now deprecated.
    dataBinding = false
    // Determines whether to generate binder classes for your AIDL files.
    aidl = true
    // Determines whether to support RenderScript.
    renderScript = true
    // Determines whether to support injecting custom variables into the module’s R class.
    resValues = true
    // Determines whether to support shader AOT compilation.
    shaders = true
  }
}

এছাড়াও, আপনি কোনও প্রোজেক্টের সমস্ত মডিউল জুড়ে এইসব ফিচারের জন্য ডিফল্ট সেটিং নির্দিষ্ট করতে পারেন। এর জন্য, আপনার প্রোজেক্টের gradle.properties ফাইলে নিচে দেখানো মতো এক বা একাধিক বিষয় যোগ করুন। মনে রাখবেন, আপনি এখনও মডিউল-লেভেল build.gradle ফাইলে buildFeatures ব্লক ব্যবহার করে এইসব প্রোজেক্ট-ব্যাপী ডিফল্ট সেটিংস ওভাররাইড করতে পারবেন।

android.defaults.buildfeatures.buildconfig=true
android.defaults.buildfeatures.aidl=true
android.defaults.buildfeatures.renderscript=true
android.defaults.buildfeatures.resvalues=true
android.defaults.buildfeatures.shaders=true

ফিচার-অন-ফিচার ডিপেন্ডেন্সি

Android Gradle প্লাগ-ইনের আগের ভার্সনে, সব ফিচার মডিউল শুধুমাত্র অ্যাপের বেস মডিউলের উপর নির্ভর করতে পারত। Android Gradle plugin 4.0.0 ব্যবহার করার সময়, আপনি এখন এমন একটি ফিচার মডিউল যোগ করতে পারবেন যা অন্য একটি ফিচার মডিউলের উপর নির্ভর করে। অর্থাৎ, :video ফিচারটি :camera ফিচারের উপর নির্ভর করতে পারে, যা আবার বেস মডিউলের উপর নির্ভর করে। এটি নিচের ছবিতে দেখানো হয়েছে।

ফিচারের উপর ফিচারের নির্ভরতা

ফিচার মডিউল :video ফিচার :camera-এর উপর নির্ভর করে, যা বেস :app মডিউলের উপর নির্ভর করে।

এর অর্থ হল, আপনার অ্যাপ কোনও ফিচার মডিউল ডাউনলোড করার অনুরোধ করলে, অ্যাপটি সেইসব ফিচার মডিউলও ডাউনলোড করে যেগুলির উপর এটি নির্ভর করে। আপনার অ্যাপের জন্য ফিচার মডিউল তৈরি করার পরে, আপনি মডিউলের build.gradle ফাইলে ফিচার-অন-ফিচার নির্ভরতা ঘোষণা করতে পারবেন। যেমন, :video মডিউলটি :camera-এর উপর নির্ভরতা ঘোষণা করে, যেমন:

// In the build.gradle file of the ':video' module.
dependencies {
  // All feature modules must declare a dependency
  // on the base module.
  implementation project(':app')
  // Declares that this module also depends on the 'camera'
  // feature module.
  implementation project(':camera')
  ...
}
// In the build.gradle file of the ':video' module.
dependencies {
    // All feature modules must declare a dependency
    // on the base module.
    implementation(project(":app"))
    // Declares that this module also depends on the 'camera'
    // feature module.
    implementation(project(":camera"))
    ...
}

এছাড়াও, আপনাকে Android Studio-তে ফিচার-অন-ফিচার নির্ভরতা ফিচার চালু করতে হবে (যেমন, রান কনফিগারেশন এডিট করার সময় ফিচারকে সাপোর্ট করার জন্য) মেনু বার থেকে সহায়তা > কাস্টম VM বিকল্প এডিট করুন বিকল্পে ক্লিক করে এবং নিম্নলিখিত বিষয়গুলি অন্তর্ভুক্ত করে:

-Drundebug.feature.on.feature=true

ডিপেন্ডেন্সি মেটাডেটা

Android Gradle plugin 4.0.0 ও এর পরের যেকোনও ভার্সন ব্যবহার করে আপনার অ্যাপ তৈরি করার সময়, প্লাগ-ইন এমন মেটাডেটা অন্তর্ভুক্ত করে যা আপনার অ্যাপে কম্পাইল করা ডিপেন্ডেন্সি সম্পর্কে বর্ণনা করে। আপনার অ্যাপ আপলোড করার সময়, Play Console এই মেটাডেটা পরীক্ষা করে আপনাকে নিম্নলিখিত সুবিধা প্রদান করে:

  • আপনার অ্যাপ ব্যবহার করে এমন SDK ও ডিপেন্ডেন্সি সংক্রান্ত পরিচিত সমস্যার ব্যাপারে সতর্কতা পান
  • সেইসব সমস্যার সমাধান করার জন্য অ্যাকশন নেওয়া যায় এমন মতামত পান

ডেটা কম্প্রেস করা হয়, Google Play সই করার কী দিয়ে এনক্রিপ্ট করা হয় এবং আপনার রিলিজ অ্যাপের সই করার ব্লকে স্টোর করা হয়। তবে, আপনি মেটাডেটা নিজে থেকেই নিম্নলিখিত ডিরেক্টরির লোকাল ইন্টারমিডিয়েট বিল্ড ফাইলে চেক করতে পারবেন: <project>/<module>/build/outputs/sdk-dependencies/release/sdkDependency.txt.

আপনি এই তথ্য শেয়ার করতে না চাইলে, আপনার মডিউলের build.gradle ফাইলে নিচে উল্লেখ করা বিষয়গুলি যোগ করে বেরিয়ে আসতে পারেন:

android {
  dependenciesInfo {
      // Disables dependency metadata when building APKs.
      includeInApk = false
      // Disables dependency metadata when building Android App Bundles.
      includeInBundle = false
  }
}
android {
  dependenciesInfo {
      // Disables dependency metadata when building APKs.
      includeInApk = false
      // Disables dependency metadata when building Android App Bundles.
      includeInBundle = false
  }
}

AAR ডিপেন্ডেন্সি থেকে নেটিভ লাইব্রেরি ইমপোর্ট করা

আপনি এখন নিজের অ্যাপের AAR ডিপেন্ডেন্সি থেকে C/C++ লাইব্রেরি ইমপোর্ট করতে পারবেন। নিচে বর্ণিত কনফিগারেশন ধাপগুলি অনুসরণ করলে, Gradle অটোমেটিক এইসব নেটিভ লাইব্রেরি উপলভ্য করে তোলে যাতে CMake-এর মতো এক্সটার্নাল নেটিভ বিল্ড সিস্টেমের সাথে ব্যবহার করা যায়। মনে রাখবেন, Gradle শুধুমাত্র আপনার বিল্ডের জন্য এইসব লাইব্রেরি উপলভ্য করে তোলে; সেগুলি ব্যবহার করার জন্য আপনাকে এখনও নিজের বিল্ড স্ক্রিপ্ট কনফিগার করতে হবে।

প্রিফ্যাবপ্যাকেজ ফর্ম্যাট ব্যবহার করে লাইব্রেরি এক্সপোর্ট করা হয়।

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

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

আপনার এক্সটার্নাল নেটিভ বিল্ড সিস্টেম কনফিগার করা

আপনাকে যেসব ধাপ অনুসরণ করতে হবে সেগুলি দেখতে, আপনি যে এক্সটার্নাল নেটিভ বিল্ড সিস্টেম ব্যবহার করার পরিকল্পনা করেছেন তার জন্য নিচে দেওয়া ধাপগুলি অনুসরণ করুন।

আপনার অ্যাপের প্রতিটি AAR ডিপেন্ডেন্সি যাতে নেটিভ কোড আছে, সেটি একটি Android.mk ফাইল এক্সপোজ করে যা আপনাকে ndk-build প্রোজেক্টে ইমপোর্ট করতে হবে। আপনি import&endash;module কমান্ড ব্যবহার করে এই ফাইল ইমপোর্ট করেন, যা আপনার ndk-build প্রজেক্টে import&endash;add&endash;path প্রপার্টি ব্যবহার করে আপনার নির্দিষ্ট করা পাথ সার্চ করে। যেমন, আপনার অ্যাপ্লিকেশন যদি libapp.so নির্ধারণ করে এবং এটি curl ব্যবহার করে, তাহলে আপনার Android.mk ফাইলে নিম্নলিখিতগুলি অন্তর্ভুক্ত করতে হবে:

  1. CMake-এর জন্য:

    add_library(app SHARED app.cpp)

    # Add these two lines. find_package(curl REQUIRED CONFIG) target_link_libraries(app curl::curl)

  2. ndk-build-এর জন্য:

    include $(CLEAR_VARS)
    LOCAL_MODULE := libapp
    LOCAL_SRC_FILES := app.cpp
    # Link libcurl from the curl AAR.
    LOCAL_SHARED_LIBRARIES := curl
    include $(BUILD_SHARED_LIBRARY)

    # If you don't expect that your project will be built using versions of the NDK # older than r21, you can omit this block. ifneq ($(call ndk-major-at-least,21),true) $(call import-add-path,$(NDK_GRADLE_INJECTED_IMPORT_PATH)) endif

    # Import all modules that are included in the curl AAR. $(call import-module,prefab/curl)

AAR-এ অন্তর্ভুক্ত নেটিভ ডিপেন্ডেন্সি আপনার CMake প্রোজেক্টে CMAKE_FIND_ROOT_PATH{: .external} ভেরিয়েবলের মাধ্যমে এক্সপোজ করা হয়। CMake ইনভোক করা হলে, Gradle এই ভ্যালু অটোমেটিক সেট করবে, তাই আপনার বিল্ড সিস্টেম এই ভেরিয়েবল পরিবর্তন করলে, নিশ্চিত করুন যে আপনি সেটিতে অ্যাসাইন করার পরিবর্তে যোগ করেছেন।

প্রতিটি নির্ভরতা আপনার CMake বিল্ডে একটি config-file package{: .external} এক্সপোজ করে, যা আপনি find_package{: .external} কমান্ডের মাধ্যমে ইমপোর্ট করেন। এই কমান্ড config-file প্যাকেজ খোঁজে যা প্রদত্ত প্যাকেজের নাম ও ভার্সনের সাথে মেলে এবং আপনার বিল্ডে ব্যবহার করার জন্য এটি যেসব টার্গেট নির্ধারণ করে সেগুলি প্রকাশ করে। যেমন, আপনার অ্যাপ্লিকেশন যদি libapp.so নির্ধারণ করে এবং এটি curl ব্যবহার করে, তাহলে আপনার CMakeLists.txt ফাইলে নিম্নলিখিত বিষয়গুলি অন্তর্ভুক্ত করতে হবে:


add_library(app SHARED app.cpp)

# Add these two lines. find_package(curl REQUIRED CONFIG) target_link_libraries(app curl::curl)

আপনি এখন app.cpp-এ #include "curl/curl.h" নির্দিষ্ট করতে পারবেন। আপনি নিজের প্রোজেক্ট তৈরি করলে, আপনার এক্সটার্নাল নেটিভ বিল্ড সিস্টেম অটোমেটিক libapp.so libcurl.so-এর সাথে লিঙ্ক করে এবং APK বা অ্যাপ বান্ডেলে libcurl.so প্যাকেজ করে। আরও তথ্যের জন্য, curl প্রিফ্যাব স্যাম্পেল{:.external} দেখুন।

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

এই প্লাগ-ইনের এই ভার্সন ব্যবহার করার সময়, আপনি হয়ত আচরণে নিম্নলিখিত পরিবর্তনগুলি দেখতে পাবেন।

v1/v2 সাইনিং কনফিগারেশন আপডেট

signingConfig ব্লকে অ্যাপ সাইনিং কনফিগারেশনের আচরণ পরিবর্তিত হয়ে নিম্নলিখিত হয়েছে:

v1 সই করা

  • v1SigningEnabled স্পষ্টভাবে চালু করা থাকলে, AGP v1 অ্যাপ সাইনিং পারফর্ম করে।
  • ব্যবহারকারী v1SigningEnabled স্পষ্টভাবে বন্ধ করে দিলে, v1 অ্যাপ সই করা হয় না।
  • ব্যবহারকারী v1 সিগনেচার চালু না করে থাকলে, minSdk ও targetSdk-এর ভিত্তিতে এটি অটোমেটিক বন্ধ করা যেতে পারে।

v2 সই করা

  • v2SigningEnabled স্পষ্টভাবে চালু করা থাকলে, AGP v2 অ্যাপ সই করার প্রসেস পারফর্ম করে।
  • ব্যবহারকারী v2SigningEnabled স্পষ্টভাবে বন্ধ করে দিলে, v2 অ্যাপ সাইনিং করা হয় না।
  • ব্যবহারকারী v2 সই করার সুবিধা স্পষ্টভাবে চালু না করে থাকলে, targetSdk-এর ভিত্তিতে এটি অটোমেটিক বন্ধ করা যেতে পারে।

এইসব পরিবর্তন AGP-কে সাইনিং মেকানিজম বন্ধ করে দিয়ে বিল্ড অপ্টিমাইজ করতে দেয় ব্যবহারকারী স্পষ্টভাবে এইসব ফ্ল্যাগ চালু করেছেন কিনা তার উপর ভিত্তি করে। এই রিলিজের আগে, v1Signing স্পষ্টভাবে চালু করা থাকলেও সেটি বন্ধ করা যেত, যা বিভ্রান্তিকর হতে পারত।

feature এবং instantapp Android Gradle প্লাগ-ইন সরানো হয়েছে

Android Gradle plugin 3.6.0, আপনার ইনস্ট্যান্ট অ্যাপ তৈরি ও প্যাকেজ করার জন্য Android অ্যাপ বান্ডেল ব্যবহার করার ক্ষেত্রে Dynamic Feature plugin (com.android.dynamic-feature) ব্যবহার করার সুবিধা দিতে, Feature plugin (com.android.feature) ও Instant App plugin (com.android.instantapp) সরিয়ে দিয়েছে।

Android Gradle plugin 4.0.0 ও তার পরবর্তী যেকোনও ভার্সনে, এইসব বাতিল করা প্লাগ-ইন সম্পূর্ণভাবে সরিয়ে দেওয়া হয়েছে। তাই, লেটেস্ট Android Gradle প্লাগ-ইন ব্যবহার করতে, আপনাকে Android অ্যাপ বান্ডেল সাপোর্ট করার জন্য আপনার ইনস্ট্যান্ট অ্যাপ মাইগ্রেট করতে হবে। আপনার ইনস্ট্যান্ট অ্যাপ মাইগ্রেট করার মাধ্যমে, আপনি অ্যাপ বান্ডেল ও আপনার অ্যাপের মডুলার ডিজাইনকে আরও সহজ করার সুবিধা নিতে পারবেন।

মনে রাখবেন: Android Studio 4.0 ও এর পরের যেকোনও ভার্সনে সরিয়ে দেওয়া প্লাগ-ইন ব্যবহার করে এমন প্রোজেক্ট খুলতে, প্রোজেক্টে Android Gradle প্লাগ-ইন 3.6.0 বা এর আগের যেকোনও ভার্সন থাকতে হবে।

আলাদা অ্যানোটেশন প্রসেসিং ফিচার সরিয়ে দেওয়া হয়েছে

ডেডিকেটেড টাস্কে অ্যানোটেশন প্রসেসিং আলাদা করার ক্ষমতা সরিয়ে দেওয়া হয়েছে। এই বিকল্পটি জাভা-অনলি প্রোজেক্টে নন-ইনক্রিমেন্টাল অ্যানোটেশন প্রসেসর ব্যবহার করা হলে ইনক্রিমেন্টাল জাভা কম্পাইলেশন বজায় রাখতে ব্যবহার করা হত; এটি gradle.properties ফাইলে android.enableSeparateAnnotationProcessing-এর মান true সেট করে চালু করা হত, যা এখন আর কাজ করে না।

পরিবর্তে, বিল্ড পারফর্ম্যান্স উন্নত করতে, আপনাকে ইনক্রিমেন্টাল অ্যানোটেশন প্রসেসর ব্যবহার করার মাধ্যমে মাইগ্রেট করতে হবে।

includeCompileClasspath বন্ধ করে দেওয়া হয়েছে

Android Gradle প্লাগ-ইন আর কম্পাইল ক্ল্যাসপাথে আপনার ঘোষণা করা অ্যানোটেশন প্রসেসর চেক করে না বা অন্তর্ভুক্ত করে না এবং annotationProcessorOptions.includeCompileClasspath DSL প্রপার্টির আর কোনও প্রভাব নেই। আপনি যদি কম্পাইল ক্লাসপাতে অ্যানোটেশন প্রসেসর অন্তর্ভুক্ত করেন, তাহলে নিচে উল্লেখ করা সমস্যাটি হতে পারে:

Error: Annotation processors must be explicitly declared now.

এই সমস্যার সমাধান করতে, আপনাকে অবশ্যই annotationProcessor ডিপেন্ডেন্সি কনফিগারেশন ব্যবহার করে আপনার build.gradle ফাইলে অ্যানোটেশন প্রসেসর অন্তর্ভুক্ত করতে হবে। আরও জানতে, অ্যানোটেশন প্রসেসর যোগ করুন নিবন্ধটি পড়ুন।

CMake-এর ব্যবহার করা প্রি-বিল্ট ডিপেন্ডেন্সি অটোমেটিক প্যাকেজ করা

Android Gradle প্লাগ-ইনের আগের ভার্সনে, আপনাকে স্পষ্টভাবে CMake এক্সটার্নাল নেটিভ বিল্ডে ব্যবহৃত যেকোনও আগে থেকে তৈরি লাইব্রেরি প্যাকেজ করতে jniLibs ব্যবহার করতে হত। আপনার মডিউলের src/main/jniLibs ডিরেক্টরিতে অথবা আপনার build.gradle ফাইলে কনফিগার করা অন্য কোনও ডিরেক্টরিতে লাইব্রেরি থাকতে পারে:

sourceSets {
  main {
    // The libs directory contains prebuilt libraries that are used by the
    // app's library defined in CMakeLists.txt via an IMPORTED target.
    jniLibs.srcDirs = ['libs']
  }
}
sourceSets {
  main {
    // The libs directory contains prebuilt libraries that are used by the
    // app's library defined in CMakeLists.txt via an IMPORTED target.
    jniLibs.setSrcDirs(listOf("libs"))
  }
}

Android Gradle Plugin 4.0-এর সাথে, উপরের কনফিগারেশন আর প্রয়োজন নেই এবং এর ফলে বিল্ড তৈরি করা যাবে না:

* What went wrong:
Execution failed for task ':app:mergeDebugNativeLibs'.
  > A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade
    > More than one file was found with OS independent path 'lib/x86/libprebuilt.so'

এক্সটার্নাল নেটিভ বিল্ড এখন অটোমেটিক সেইসব লাইব্রেরি প্যাকেজ করে, তাই jniLibs-এর সাথে লাইব্রেরি প্যাকেজ করলে ডুপ্লিকেট তৈরি হয়। বিল্ড সংক্রান্ত সমস্যা এড়াতে, আগে থেকে তৈরি লাইব্রেরিটিকে jniLibs-এর বাইরে কোনও লোকেশনে সরিয়ে দিন অথবা আপনার build.gradle ফাইল থেকে jniLibs কনফিগারেশন সরিয়ে দিন।

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

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

Gradle ওয়ার্কার মেকানিজমে রেস কন্ডিশন

Android Gradle প্লাগ-ইন 4.0-এ হওয়া পরিবর্তন, Gradle-এ রেস কন্ডিশন ট্রিগার করতে পারে যখন &endash;&endash;no&endash;daemon এবং Gradle 6.3 বা তার আগের ভার্সনের সাথে রান করা হয়, এর ফলে বিল্ড সম্পূর্ণ হওয়ার পরে বিল্ড হ্যাং হয়ে যায়।

এই সমস্যাটি Gradle 6.4-এ সমাধান করা হবে।