Android Gradle প্লাগ-ইন ৩.৬.০ (ফেব্রুয়ারি ২০২০)
Android প্লাগ-ইনের এই ভার্সনের জন্য নিম্নলিখিতগুলি প্রয়োজন:
| সর্বনিম্ন ভার্সন | ডিফল্ট ভার্সন | নোট | |
|---|---|---|---|
| Gradle | 5.6.4 | 5.6.4 | আরও জানতে, Gradle আপডেট করা দেখুন। |
| SDK বিল্ড টুল | ২৮.০.৩ | ২৮.০.৩ | SDK বিল্ড টুল ইনস্টল বা কনফিগার করুন। |
এই ছোট আপডেটটি নতুন ডিফল্ট সেটিংস এবং ফিচারের সাথে সামঞ্জস্যপূর্ণ Android 11-এ প্যাকেজের দৃশ্যমানতা।
আরও তথ্যের জন্য 4.0.1 রিলিজ নোট দেখুন।
নতুন বৈশিষ্ট্য
Android Gradle প্লাগ-ইনের এই ভার্সনে নিম্নলিখিত নতুন ফিচার রয়েছে।
বাইন্ডিং দেখুন
আপনার কোডে ভিউ রেফারেন্স করার সময় ভিউ বাইন্ডিং কম্পাইল-টাইম নিরাপত্তা প্রদান করে। আপনি এখন অটোমেটিক জেনারেট হওয়া বাইন্ডিং ক্লাস রেফারেন্সের সাথে
findViewById() পরিবর্তন করতে পারবেন। ভিউ বাইন্ডিং ব্যবহার করা শুরু করতে,
প্রতিটি মডিউলের build.gradle ফাইলে নিম্নলিখিতগুলি অন্তর্ভুক্ত করুন:
android { viewBinding.enabled = true }
android { viewBinding.enabled = true }
আরও জানতে, ভিউ বাইন্ডিং ডকুমেন্টেশন পড়ুন।
Maven Publish প্লাগ-ইনের জন্য সহায়তা
Android Gradle প্লাগ-ইনে Maven Publish Gradle প্লাগ-ইন-এর জন্য সহায়তা অন্তর্ভুক্ত থাকে, যা আপনাকে Apache Maven রিপোজিটরিতে বিল্ড আর্টিফ্যাক্ট প্রকাশ করার অনুমতি দেয়। Android Gradle প্লাগ-ইন আপনার অ্যাপ বা লাইব্রেরি মডিউলে প্রতিটি বিল্ড ভেরিয়েন্ট আর্টিফ্যাক্টের জন্য একটি কম্পোনেন্ট তৈরি করে যা আপনি Maven রিপোজিটরিতে একটি প্রকাশনা কাস্টমাইজ করতে ব্যবহার করতে পারেন।
আরও জানতে, কীভাবে Maven Publish প্লাগ-ইন ব্যবহার করবেন সেই সম্পর্কিত পৃষ্ঠায় যান।
নতুন ডিফল্ট প্যাকেজিং টুল
আপনার অ্যাপের ডিবাগ ভার্সন তৈরি করার সময়, প্লাগ-ইন আপনার APK তৈরি করতে
zipflinger নামক একটি নতুন প্যাকেজিং টুল ব্যবহার করে। এই নতুন
টুল বিল্ড স্পিড উন্নত করবে। নতুন প্যাকেজিং টুল
আপনার প্রত্যাশা অনুযায়ী কাজ না করলে,
সমস্যার বিষয়ে অভিযোগ জানান। আপনার gradle.properties ফাইলে নিম্নলিখিতগুলি অন্তর্ভুক্ত করে
আপনি পুরনো প্যাকেজিং টুল ব্যবহার করার
বিকল্পে ফিরে যেতে পারেন:
android.useNewApkCreator=false
নেটিভ বিল্ড অ্যাট্রিবিউশন
আপনার প্রোজেক্টে প্রতিটি C/C++ ফাইল তৈরি ও লিঙ্ক করতে Clang-এর কত সময় লাগে তা এখন আপনি নির্ধারণ করতে পারবেন। Gradle একটি Chrome ট্রেস আউটপুট করতে পারে যেটিতে এই কম্পাইলার ইভেন্টের জন্য টাইমস্ট্যাম্প থাকে যাতে আপনি আরও ভালভাবে আপনার প্রোজেক্ট তৈরি করতে প্রয়োজনীয় সময় বুঝতে পারেন। এই বিল্ড অ্যাট্রিবিউশন ফাইল আউটপুট করতে, নিম্নলিখিত ধাপগুলি অনুসরণ করুন:
-
Gradle বিল্ড রান করার সময়
-Pandroid.enableProfileJson=trueফ্ল্যাগ যোগ করুন। যেমন:gradlew assembleDebug -Pandroid.enableProfileJson=true -
Chrome ব্রাউজার খুলে সার্চ বারে
chrome://tracingটাইপ করুন। -
লোড করুন বোতামে ক্লিক করুন এবং ফাইলটি খুঁজতে
<var>project-root</var>/build/android-profileনেভিগেট করুন। ফাইলটির নামprofile-<var>timestamp</var>.json.gz।
ভিউয়ারের উপরের দিকে আপনি নেটিভ বিল্ড অ্যাট্রিবিউশন ডেটা দেখতে পাবেন:

আচরণগত পরিবর্তন
প্লাগ-ইনের এই ভার্সন ব্যবহার করার সময়, আপনি আচরণে নিম্নলিখিত পরিবর্তন দেখতে পেতে পারেন।
নেটিভ লাইব্রেরি সাধারণত কম্প্রেস না করেই প্যাকেজ করা হয়
আপনি অ্যাপ তৈরি করার সময়, প্লাগ-ইন এখন ডিফল্ট হিসেবে
extractNativeLibs-কে "false"-এ
সেট করে। অর্থাৎ, আপনার নেটিভ লাইব্রেরিগুলি পৃষ্ঠা সারিবদ্ধ এবং কম্প্রেস করা হয়নি এমন
প্যাকেজ করা। এর ফলে আপলোডের সাইজ বড় হলেও, আপনার ব্যবহারকারীরা
নিম্নলিখিত সুবিধা পান:
- অ্যাপ ইনস্টল করার সাইজ ছোট হয় কারণ প্ল্যাটফর্মটি ইনস্টল করা APK থেকে সরাসরি নেটিভ লাইব্রেরি অ্যাক্সেস করতে পারে, লাইব্রেরির কপি তৈরি করার প্রয়োজন হয় না।
- ডাউনলোড সাইজ ছোট হয় কারণ আপনার APK বা Android App Bundle-এ আনকমপ্রেসড নেটিভ লাইব্রেরি অন্তর্ভুক্ত করলে, Play Store কমপ্রেশন সাধারণত আরও ভালো হয়।
আপনি যদি চান যে Android Gradle প্লাগ-ইন কম্প্রেস করা নেটিভ লাইব্রেরি প্যাকেজ করুক, তাহলে আপনার অ্যাপের ম্যানিফেস্টে নিম্নলিখিতগুলি অন্তর্ভুক্ত করুন:
<application
android:extractNativeLibs="true"
... >
</application>
মনে রাখবেন: extractNativeLibs ম্যানিফেস্ট
অ্যাট্রিবিউট useLegacyPackaging DSL
বিকল্প দ্বারা পরিবর্তন করা হয়েছে। আরও তথ্যের জন্য, রিলিজ নোট দেখুন
কমপ্রেস করা নেটিভ লাইব্রেরি প্যাকেজ করতে
DSL ব্যবহার করুন।
ডিফল্ট NDK ভার্সন
আপনি NDK-এর একাধিক ভার্সন ডাউনলোড করলে, Android Gradle প্লাগ-ইন
এখন আপনার সোর্স কোড ফাইল কম্পাইল করার জন্য ব্যবহার করার জন্য একটি ডিফল্ট ভার্সন বেছে নেয়।
আগে, প্লাগ-ইন NDK-এর লেটেস্ট ডাউনলোড করা ভার্সন বেছে নিত।
প্লাগ-ইন-বেছে নেওয়া ডিফল্ট ওভাররাইড করতে, মডিউলের
build.gradle ফাইলে android.ndkVersion প্রপার্টি ব্যবহার করুন।
সরলীকৃত R ক্লাস জেনারেশন
Android Gradle প্লাগ-ইন আপনার প্রোজেক্টের প্রতিটি লাইব্রেরি মডিউলের জন্য শুধুমাত্র একটি R ক্লাস তৈরি করে এবং অন্যান্য মডিউল ডিপেন্ডেন্সির সাথে সেই R ক্লাসগুলি শেয়ার করে কম্পাইল ক্লাসপাথকে সহজ করে তোলে। এই অপ্টিমাইজেশনের ফলে আরও দ্রুত বিল্ড তৈরি করা যাবে, তবে আপনাকে নিম্নলিখিত বিষয়গুলি মনে রাখতে হবে:
- যেহেতু কম্পাইলার আপস্ট্রিম মডিউল ডিপেন্ডেন্সির সাথে R ক্লাস শেয়ার করে, তাই আপনার প্রোজেক্টের প্রতিটি মডিউল যাতে অনন্য প্যাকেজের নাম ব্যবহার করে তা নিশ্চিত করা গুরুত্বপূর্ণ।
- অন্য প্রোজেক্ট ডিপেন্ডেন্সির ক্ষেত্রে লাইব্রেরির R ক্লাসের দৃশ্যমানতা
ডিপেন্ডেন্সি হিসেবে লাইব্রেরি অন্তর্ভুক্ত করার জন্য ব্যবহৃত কনফিগারেশন দ্বারা
নির্ধারিত হয়। যেমন, লাইব্রেরি A-তে যদি 'api' ডিপেন্ডেন্সি হিসেবে লাইব্রেরি B অন্তর্ভুক্ত থাকে, তাহলে লাইব্রেরি A এবং লাইব্রেরি A-এর উপর নির্ভর করে এমন অন্যান্য লাইব্রেরির
লাইব্রেরি B-এর R ক্লাসে অ্যাক্সেস থাকে। তবে, অন্যান্য লাইব্রেরির কাছে হয়ত
লাইব্রেরি B-এর R ক্লাসের অ্যাক্সেস নেই। যদি লাইব্রেরি A
implementationডিপেন্ডেন্সি কনফিগারেশন ব্যবহার করে। আরও জানতে, ডিপেন্ডেন্সি কনফিগারেশন সম্পর্কে পড়ুন।
ডিফল্ট কনফিগারেশন থেকে বাদ পড়া রিসোর্স সরান
লাইব্রেরি মডিউলের ক্ষেত্রে, আপনি যদি এমন কোনও ভাষার জন্য রিসোর্স অন্তর্ভুক্ত করেন যা
রিসোর্সের ডিফল্ট সেটে অন্তর্ভুক্ত করেন না (যেমন, আপনি যদি
hello_world-কে স্ট্রিং রিসোর্স হিসেবে
/values-es/strings.xml-এ অন্তর্ভুক্ত করেন কিন্তু সেই রিসোর্সকে
/values/strings.xml-এ সংজ্ঞায়িত না করেন), তাহলে আপনার প্রোজেক্ট কম্পাইল করার সময় Android Gradle প্লাগইন আর
সেই রিসোর্স অন্তর্ভুক্ত করে না। এই আচরণগত পরিবর্তনের ফলে
Resource Not Found রানটাইম ব্যতিক্রম কম হওয়া
এবং বিল্ড স্পিড উন্নত হওয়া উচিত।
D8 এখন অ্যানোটেশনের জন্য CLASS রিটেনশন নীতি মেনে চলে
আপনার অ্যাপ কম্পাইল করার সময়, D8 এখন অ্যানোটেশন CLASS রিটেনশন নীতি প্রয়োগ করলে তা মেনে চলে এবং রানটাইমে সেইসব অ্যানোটেশন আর উপলভ্য থাকে না। অ্যাপের টার্গেট SDK-কে API লেভেল 23-এ সেট করার সময়ও এই আচরণ দেখা যায়, যা আগে Android Gradle প্লাগ-ইন ও D8-এর পুরনো ভার্সন ব্যবহার করে আপনার অ্যাপ কম্পাইল করার সময় রানটাইমে এইসব অ্যানোটেশনে অ্যাক্সেস করার অনুমতি দিত।
আচরণে অন্যান্য পরিবর্তন
-
aaptOptions.noCompressআর সব প্ল্যাটফর্মে (APK এবং বান্ডেল দুটির জন্যই) ছোট ও বড় হাতের অক্ষরের মধ্যে পার্থক্য করে না এবং বড় হাতের অক্ষর ব্যবহার করা পাথকে সম্মান করে। -
ডেটা বাইন্ডিং এখন ডিফল্ট হিসেবে ইনক্রিমেন্টাল। আরও জানতে, সমস্যা #১১০০৬১৫৩০ দেখুন।
-
Roboelectric ইউনিট টেস্ট সহ সব ইউনিট টেস্ট এখন সম্পূর্ণভাবে ক্যাশে করা যাবে। আরও জানতে, সমস্যা #১১৫৮৭৩০৪৭ দেখুন।
সমস্যার সমাধান
Android Gradle প্লাগ-ইনের এই ভার্সনে নিম্নলিখিত সমস্যার সমাধান করা হয়েছে:
- Robolectric ইউনিট টেস্ট এখন লাইব্রেরি মডিউলে কাজ করে যা ডেটা বাইন্ডিং ব্যবহার করে। আরও জানতে, সমস্যা #১২৬৭৭৫৫৪২ দেখুন।
- Gradle-এর প্যারালাল
এক্সিকিউশন মোড চালু থাকাকালীন
আপনি এখন একাধিক মডিউল জুড়ে
connectedAndroidTestটি টাস্ক রান করতে পারবেন।
পরিচিত সমস্যা
এই বিভাগে Android Gradle প্লাগ-ইন 3.6.0-এ থাকা পরিচিত সমস্যাগুলি বর্ণনা করা হয়েছে।
Android Lint টাস্কের পারফর্ম্যান্স স্লো হয়ে যাওয়া
Android Lint কিছু প্রোজেক্টে সম্পূর্ণ হতে অনেক বেশি সময় নিতে পারে কারণ এর পার্সিং ইনফ্রাস্ট্রাকচারে রিগ্রেশন হয়েছে, যার ফলে নির্দিষ্ট কোড কনস্ট্রাক্টে ল্যাম্বডার জন্য ইনফার্ড টাইপের কম্পিউটেশন ধীরগতির হয়।
সমস্যাটি IDEA-তে একটি বাগ হিসেবে রিপোর্ট করা হয়েছে এবং Android Gradle প্লাগ-ইন 4.0-এ ঠিক করা হবে।
ম্যানিফেস্ট ক্লাস নেই {:#agp-missing-manifest}
আপনার অ্যাপ যদি ম্যানিফেস্টে কাস্টম অনুমতি সংজ্ঞায়িত করে, তাহলে Android
Gradle প্লাগ-ইন সাধারণত একটি Manifest.java ক্লাস তৈরি করে,
যেখানে স্ট্রিং কনস্ট্যান্ট হিসেবে আপনার কাস্টম অনুমতি অন্তর্ভুক্ত থাকে। প্লাগ-ইন আপনার অ্যাপের সাথে এই ক্লাসকে
প্যাকেজ করে, যাতে আপনি রানটাইমে আরও সহজে সেইসব
অনুমতি রেফারেন্স করতে পারেন।
Android Gradle প্লাগ-ইন ৩.৬.০-এ ম্যানিফেস্ট ক্লাস তৈরি করার প্রসেস কাজ করছে না।
আপনি যদি প্লাগ-ইনের এই ভার্সন দিয়ে অ্যাপ তৈরি করেন এবং এটি ম্যানিফেস্ট ক্লাসকে রেফারেন্স করে,
তাহলে আপনি হয়ত ClassNotFoundException
ব্যতিক্রম দেখতে পাবেন। এই সমস্যার সমাধান করতে, নিম্নলিখিতগুলির মধ্যে একটি করুন:
-
আপনার কাস্টম অনুমতিকে তার সম্পূর্ণ-যোগ্য নাম দ্বারা রেফারেন্স করুন। যেমন,
"com.example.myapp.permission.DEADLY_ACTIVITY"। -
নিচে দেখানো উদাহরণ অনুযায়ী আপনার নিজস্ব কনস্ট্যান্ট নির্ধারণ করুন:
public final class CustomPermissions { public static final class permission { public static final String DEADLY_ACTIVITY="com.example.myapp.permission.DEADLY_ACTIVITY"; } }