অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৪.১.০ (আগস্ট ২০২০)

সামঞ্জস্যতা

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

<p>This version of the Android plugin requires the following:</p>
<ul>
  <li>
    <p><a href="https://docs.gradle.org/6.5.1/release-notes.html">Gradle 6.5</a>.
    To learn more, read the section about <a href="#updating-gradle">updating
    Gradle</a>.</p>
  </li>
  <li>
    <p><a href="/studio/releases/build-tools.html#notes">SDK Build Tools
    29.0.2</a> or higher.</p>
  </li>
</ul>
<p>The default NDK version in this release is 21.1.6352462. To install a
different NDK version, see <a href="/studio/projects/install-ndk#specific-version">Install a specific version of the NDK</a>.</p>

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

অ্যান্ড্রয়েড গ্রেডল প্লাগইনের এই সংস্করণে নিম্নলিখিত নতুন বৈশিষ্ট্যগুলো অন্তর্ভুক্ত করা হয়েছে।

কোটলিন স্ক্রিপ্ট ডিএসএল সমর্থন

কোটলিন বিল্ডস্ক্রিপ্ট ব্যবহারকারীদের সম্পাদনার অভিজ্ঞতা উন্নত করার লক্ষ্যে, অ্যান্ড্রয়েড গ্র্যাডল প্লাগইন ৪.১-এর ডিএসএল এবং এপিআই-গুলো এখন তাদের ইমপ্লিমেন্টেশন ক্লাস থেকে আলাদাভাবে এক সেট কোটলিন ইন্টারফেসে সংজ্ঞায়িত করা হয়েছে। এর মানে হলো:

  • এখন কোটলিন টাইপগুলিতে নালেবিলিটি এবং মিউটেবিলিটি স্পষ্টভাবে ঘোষণা করা হয়।
  • এই ইন্টারফেসগুলো থেকে তৈরি ডকুমেন্টেশন কোটলিন এপিআই রেফারেন্স- এ প্রকাশিত হয়।
  • অ্যান্ড্রয়েড গ্রেডল প্লাগইনের এপিআই কাঠামো সুস্পষ্টভাবে সংজ্ঞায়িত করা হয়েছে, যাতে ভবিষ্যতে অ্যান্ড্রয়েড বিল্ড সম্প্রসারণ করা কম ঝুঁকিপূর্ণ হয়।

গুরুত্বপূর্ণ: আপনি যদি ইতিমধ্যেই KTS বিল্ড স্ক্রিপ্ট গ্রহণ করে থাকেন অথবা buildSrc এ Kotlin ব্যবহার করেন, তাহলে কিছু নির্দিষ্ট ত্রুটির ক্ষেত্রে সোর্স সামঞ্জস্যে সমস্যা দেখা দিতে পারে, যেগুলো পূর্ববর্তী রিলিজগুলোতে রান-টাইম ত্রুটি হিসেবে প্রকাশ পেত।

DSL-এ পরিবর্তনযোগ্য হিসেবে ডিজাইন করা কালেকশন টাইপগুলোকে এখন অভিন্নভাবে নিম্নরূপে সংজ্ঞায়িত করা হয়েছে:

val collection: MutableCollectionType

এর মানে হলো, কিছু কালেকশনের জন্য যা আগে সমর্থন করত, এখন থেকে কোটলিন স্ক্রিপ্টে নিম্নলিখিতটি লেখা আর সম্ভব হবে না:

collection = collectionTypeOf(...)

তবে, কালেকশন পরিবর্তন করা এখন সর্বত্র সমর্থিত, তাই collection += … এবং collection.add(...) এখন সব জায়গায় কাজ করার কথা।

অ্যান্ড্রয়েড গ্রেডল প্লাগইন কোটলিন এপিআই এবং ডিএসএল ব্যবহার করে এমন কোনো প্রজেক্ট আপগ্রেড করার সময় যদি আপনি কোনো সমস্যা খুঁজে পান, তাহলে অনুগ্রহ করে একটি বাগ রিপোর্ট করুন

AAR থেকে C/C++ নির্ভরতা রপ্তানি করুন

অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৪.০-তে AAR ডিপেন্ডেন্সিতে প্রিফ্যাব প্যাকেজ ইম্পোর্ট করার সুবিধা যোগ করা হয়েছে। AGP ৪.১-এ, এখন একটি অ্যান্ড্রয়েড লাইব্রেরি প্রজেক্টের জন্য আপনার এক্সটার্নাল নেটিভ বিল্ড থেকে লাইব্রেরিগুলোকে একটি AAR-এ এক্সপোর্ট করা সম্ভব।

আপনার নেটিভ লাইব্রেরিগুলো এক্সপোর্ট করতে, আপনার লাইব্রেরি প্রজেক্টের build.gradle ফাইলের android ব্লকে নিম্নলিখিতটি যোগ করুন:

buildFeatures {
    prefabPublishing true
}

prefab { <var>mylibrary</var&;gt { headers "src/main/cpp/<var>mylibrary</var>/include" }

<var>myotherlibrary</var> {
    headers "src/main/cpp/<var>myotherlibrary</var>/include"
}

}

buildFeatures {
    prefabPublishing = true
}

prefab { create("<var>mylibrary</var>") { headers = "src/main/cpp/<var>mylibrary</var>/include" }

create("<var>myotherlibrary</var>") {
    headers = "src/main/cpp/<var>myotherlibrary</var>/include"
}

}

এই উদাহরণে, আপনার ndk-build অথবা CMake এক্সটার্নাল নেটিভ বিল্ড থেকে mylibrary এবং myotherlibrary লাইব্রেরিগুলো আপনার বিল্ড দ্বারা উৎপাদিত AAR-এ প্যাকেজ করা হবে, এবং প্রতিটি নির্দিষ্ট ডিরেক্টরি থেকে হেডারগুলো তাদের নির্ভরশীল লাইব্রেরিগুলোতে এক্সপোর্ট করবে।

দ্রষ্টব্য: অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৪.০ এবং তার পরবর্তী সংস্করণের ব্যবহারকারীদের জন্য, প্রি-বিল্ট নেটিভ লাইব্রেরি ইম্পোর্ট করার কনফিগারেশন সেটিংসে পরিবর্তন আনা হয়েছে। আরও তথ্যের জন্য, ৪.০ রিলিজ নোট দেখুন।

কোটলিন মেটাডেটার জন্য R8 সমর্থন

কোটলিন তার নিজস্ব ভাষার গঠন শনাক্ত করার জন্য জাভা ক্লাস ফাইলে কাস্টম মেটাডেটা ব্যবহার করে। R8-এ এখন kotlin-reflect ব্যবহার করে কোটলিন লাইব্রেরি ও অ্যাপ্লিকেশন সংকুচিত করার সম্পূর্ণ সহায়তার জন্য কোটলিন মেটাডেটা রক্ষণাবেক্ষণ এবং পুনর্লিখনের সুবিধা রয়েছে।

Kotlin মেটাডেটা সংরক্ষণ করতে, নিম্নলিখিত কিপ রুলগুলো যোগ করুন:

-keep class kotlin.Metadata { *; }

-keepattributes RuntimeVisibleAnnotations

এটি R8-কে সরাসরি সংরক্ষিত সমস্ত ক্লাসের কোটলিন মেটাডেটা সংরক্ষণ করার নির্দেশ দেবে।

আরও তথ্যের জন্য, Medium-এ Shrinking Kotlin libraries and applications using Kotlin reflection with R8 {:.external} দেখুন।

ডিবাগ বিল্ডে অ্যাসারশন

আপনি যখন অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৪.১.০ এবং তার উচ্চতর সংস্করণ ব্যবহার করে আপনার অ্যাপের ডিবাগ সংস্করণ বিল্ড করেন, তখন বিল্ট-ইন কম্পাইলার (D8) কম্পাইল টাইমে অ্যাসারশন সক্রিয় করার জন্য আপনার অ্যাপের কোড পুনর্লিখন করে, ফলে আপনার অ্যাসারশন চেকগুলো সর্বদা সক্রিয় থাকে।

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

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

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

cleanBuildCache টাস্ক এবং android.enableBuildCacheandroid.buildCacheDir প্রপার্টিগুলো এখন অপ্রচলিত এবং AGP 7.0 থেকে সরিয়ে দেওয়া হবে। android.enableBuildCache প্রপার্টিটির বর্তমানে কোনো কার্যকারিতা নেই, তবে android.buildCacheDir প্রপার্টি এবং cleanBuildCache টাস্কটি বিদ্যমান যেকোনো AGP বিল্ড ক্যাশের বিষয়বস্তু মুছে ফেলার জন্য AGP 7.0 পর্যন্ত কার্যকর থাকবে।

কোড সঙ্কুচিতকরণ ব্যবহারকারী অ্যাপগুলির আকার উল্লেখযোগ্যভাবে হ্রাস পেয়েছে।

এই রিলিজ থেকে, R ক্লাসের ফিল্ডগুলো আর ডিফল্টভাবে রাখা হবে না , যার ফলে যেসব অ্যাপে কোড সঙ্কুচিত করার সুবিধা আছে, তাদের APK ফাইলের আকার উল্লেখযোগ্যভাবে কমে যেতে পারে। এর ফলে আচরণে কোনো পরিবর্তন আসার কথা নয়, যদি না আপনি রিফ্লেকশনের মাধ্যমে R ক্লাসগুলো অ্যাক্সেস করেন; সেক্ষেত্রে ওই R ক্লাসগুলোর জন্য কিপ রুল যোগ করা আবশ্যক।

android.namespacedRClass প্রপার্টির নাম পরিবর্তন করে android.nonTransitiveRClass রাখা হয়েছে।

পরীক্ষামূলক ফ্ল্যাগ android.namespacedRClass এর নাম পরিবর্তন করে android.nonTransitiveRClass রাখা হয়েছে।

gradle.properties ফাইলে সেট করা এই ফ্ল্যাগটি প্রতিটি লাইব্রেরির R ক্লাসের নেমস্পেসিং সক্ষম করে, যার ফলে এর R ক্লাসে শুধুমাত্র সেই লাইব্রেরির নিজের ঘোষিত রিসোর্সগুলোই অন্তর্ভুক্ত থাকে এবং এর ডিপেন্ডেন্সিগুলো থেকে কিছুই থাকে না। এর ফলস্বরূপ, সেই লাইব্রেরির R ক্লাসের আকার হ্রাস পায়।

Kotlin DSL: coreLibraryDesugaringEnabled-এর নাম পরিবর্তন করা হয়েছে

Kotlin DSL কম্পাইল অপশন coreLibraryDesugaringEnabled পরিবর্তন করে isCoreLibraryDesugaringEnabled করা হয়েছে। এই ফ্ল্যাগ সম্পর্কে আরও তথ্যের জন্য, Java 8+ API desugaring support (Android Gradle Plugin 4.0.0+) দেখুন।

লাইব্রেরি প্রজেক্টের BuildConfig ক্লাস থেকে ভার্সন প্রোপার্টিগুলো সরিয়ে ফেলা হয়েছে।

শুধুমাত্র লাইব্রেরি প্রোজেক্টের জন্য, তৈরি হওয়া BuildConfig ক্লাস থেকে BuildConfig.VERSION_NAME এবং BuildConfig.VERSION_CODE প্রোপার্টিগুলো সরিয়ে দেওয়া হয়েছে, কারণ এই স্ট্যাটিক মানগুলো অ্যাপ্লিকেশনের ভার্সন কোড ও নামের চূড়ান্ত মানকে প্রতিফলিত করত না এবং ফলস্বরূপ বিভ্রান্তিকর ছিল। এছাড়াও, ম্যানিফেস্ট মার্জিংয়ের সময় এই মানগুলো বাতিল করা হয়েছিল।

অ্যান্ড্রয়েড গ্রেডল প্লাগইনের একটি ভবিষ্যৎ সংস্করণে, লাইব্রেরির জন্য ব্যবহৃত ডিএসএল (DSL) থেকে versionName এবং versionCode প্রপার্টিগুলোও সরিয়ে দেওয়া হবে। বর্তমানে, কোনো লাইব্রেরি সাব-প্রজেক্ট থেকে স্বয়ংক্রিয়ভাবে অ্যাপের ভার্সন কোড/নাম অ্যাক্সেস করার কোনো উপায় নেই।

অ্যাপ্লিকেশন মডিউলগুলোর ক্ষেত্রে কোনো পরিবর্তন নেই, আপনি আগের মতোই DSL-এ versionCode এবং versionName এ মান নির্ধারণ করতে পারবেন; এই মানগুলো অ্যাপের manifest এবং BuildConfig ফিল্ডগুলোতে স্থানান্তরিত হবে।

NDK পাথ সেট করুন

আপনি আপনার মডিউলের build.gradle ফাইলে android.ndkPath প্রপার্টি ব্যবহার করে আপনার স্থানীয় NDK ইনস্টলেশনের পাথ সেট করতে পারেন।


android {
  ndkPath "your-custom-ndk-path"
}

android {
  ndkPath = "your-custom-ndk-path"
}

যদি আপনি এই প্রপার্টিটি android.ndkVersion প্রপার্টির সাথে একত্রে ব্যবহার করেন, তাহলে এই পাথে অবশ্যই android.ndkVersion সাথে মেলে এমন একটি NDK ভার্সন থাকতে হবে।

লাইব্রেরি ইউনিট টেস্টের আচরণ পরিবর্তন

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

কিছু ক্ষেত্রে, ডেটা বাইন্ডিং ব্যবহারকারী লাইব্রেরি ইউনিট টেস্টগুলোতে DataBindingComponent বা BR ক্লাস অনুপস্থিত থাকতে পারে। এই টেস্টগুলোকে androidTest প্রোজেক্টের একটি ইন্সট্রুমেন্টেড টেস্টে পোর্ট করতে হবে, কারণ ইউনিট টেস্টে এই ক্লাসগুলোর বিপরীতে কম্পাইল ও রান করলে ভুল আউটপুট আসতে পারে।

io.fabric গ্রেডল প্লাগইনটি বাতিল করা হয়েছে

io.fabric গ্রেডল প্লাগইনটি অপ্রচলিত এবং অ্যান্ড্রয়েড গ্রেডল প্লাগইনের ৪.১ সংস্করণের সাথে সামঞ্জস্যপূর্ণ নয়। অপ্রচলিত Fabric SDK এবং Firebase Crashlytics SDK-তে স্থানান্তরের বিষয়ে আরও তথ্যের জন্য, “Upgrade to the Firebase Crashlytics SDK” দেখুন।