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

আচরণের পরিবর্তন
প্লাগইনটির এই সংস্করণটি ব্যবহার করার সময়, আপনি এর আচরণে নিম্নলিখিত পরিবর্তনগুলো লক্ষ্য করতে পারেন।
নেটিভ লাইব্রেরিগুলি ডিফল্টরূপে অসংকুচিতভাবে প্যাকেজ করা হয়
আপনি যখন আপনার অ্যাপ বিল্ড করেন, তখন প্লাগইনটি এখন ডিফল্টরূপে extractNativeLibs কে "false" সেট করে দেয়। অর্থাৎ, আপনার নেটিভ লাইব্রেরিগুলো পেজ অ্যালাইনড এবং আনকমপ্রেসড অবস্থায় প্যাকেজ করা হয়। যদিও এর ফলে আপলোড সাইজ বড় হয়, আপনার ব্যবহারকারীরা নিম্নলিখিত সুবিধাগুলো পান:
- অ্যাপটির ইনস্টল সাইজ ছোট হয়, কারণ প্ল্যাটফর্মটি লাইব্রেরিগুলোর কোনো কপি তৈরি না করেই সরাসরি ইনস্টল করা APK থেকে নেটিভ লাইব্রেরিগুলো অ্যাক্সেস করতে পারে।
- আপনার APK বা অ্যান্ড্রয়েড অ্যাপ বান্ডেলে অসংকুচিত নেটিভ লাইব্রেরি অন্তর্ভুক্ত করলে প্লে স্টোরের কম্প্রেশন সাধারণত ভালো কাজ করে, যার ফলে ডাউনলোডের আকার ছোট হয়।
আপনি যদি চান যে অ্যান্ড্রয়েড গ্রেডল প্লাগইনটি সংকুচিত নেটিভ লাইব্রেরিগুলো প্যাকেজ করুক, তাহলে আপনার অ্যাপের ম্যানিফেস্টে নিম্নলিখিতটি অন্তর্ভুক্ত করুন:
<application
android:extractNativeLibs="true"
... >
</application>
দ্রষ্টব্য: extractNativeLibs ম্যানিফেস্ট অ্যাট্রিবিউটটি useLegacyPackaging DSL অপশন দ্বারা প্রতিস্থাপিত হয়েছে। আরও তথ্যের জন্য, "Use the DSL to package compressed native libraries " রিলিজ নোটটি দেখুন।
ডিফল্ট NDK সংস্করণ
আপনি যদি NDK-এর একাধিক সংস্করণ ডাউনলোড করেন, তাহলে Android Gradle প্লাগইন এখন আপনার সোর্স কোড ফাইলগুলো কম্পাইল করার জন্য একটি ডিফল্ট সংস্করণ নির্বাচন করে। পূর্বে, প্লাগইনটি NDK-এর সর্বশেষ ডাউনলোড করা সংস্করণটি নির্বাচন করত। প্লাগইন-নির্বাচিত ডিফল্ট সংস্করণটিকে ওভাররাইড করতে মডিউলের build.gradle ফাইলে android.ndkVersion প্রপার্টিটি ব্যবহার করুন।
সরলীকৃত R ক্লাস তৈরি
অ্যান্ড্রয়েড গ্র্যাডল প্লাগইন আপনার প্রোজেক্টের প্রতিটি লাইব্রেরি মডিউলের জন্য শুধুমাত্র একটি R ক্লাস তৈরি করে এবং সেই R ক্লাসগুলো অন্যান্য মডিউল ডিপেন্ডেন্সির সাথে শেয়ার করার মাধ্যমে কম্পাইল ক্লাসপাথকে সরল করে। এই অপটিমাইজেশনের ফলে বিল্ড দ্রুততর হওয়ার কথা, কিন্তু এর জন্য আপনাকে নিম্নলিখিত বিষয়গুলো মনে রাখতে হবে:
- যেহেতু কম্পাইলার আপস্ট্রিম মডিউল ডিপেন্ডেন্সিগুলোর সাথে R ক্লাস শেয়ার করে, তাই আপনার প্রোজেক্টের প্রতিটি মডিউলের জন্য একটি অনন্য প্যাকেজ নাম ব্যবহার করা গুরুত্বপূর্ণ।
- একটি লাইব্রেরিকে ডিপেন্ডেন্সি হিসেবে অন্তর্ভুক্ত করার জন্য ব্যবহৃত কনফিগারেশনের উপর নির্ভর করে, প্রজেক্টের অন্যান্য ডিপেন্ডেন্সিগুলোর কাছে সেই লাইব্রেরির R ক্লাসটি দৃশ্যমান থাকবে কিনা। উদাহরণস্বরূপ, যদি লাইব্রেরি A, লাইব্রেরি B-কে একটি 'api' ডিপেন্ডেন্সি হিসেবে অন্তর্ভুক্ত করে, তাহলে লাইব্রেরি A এবং এর উপর নির্ভরশীল অন্যান্য লাইব্রেরিগুলো লাইব্রেরি B-এর R ক্লাসটি ব্যবহার করতে পারবে। তবে, যদি লাইব্রেরি A
implementationডিপেন্ডেন্সি' কনফিগারেশন ব্যবহার করে, তাহলে অন্যান্য লাইব্রেরিগুলো লাইব্রেরি B-এর R ক্লাসটি ব্যবহার করতে নাও পারে। এ বিষয়ে আরও জানতে, ডিপেন্ডেন্সি কনফিগারেশন সম্পর্কে পড়ুন।
ডিফল্ট কনফিগারেশন থেকে অনুপস্থিত রিসোর্সগুলি সরান
লাইব্রেরি মডিউলের ক্ষেত্রে, যদি আপনি এমন কোনো ভাষার জন্য রিসোর্স অন্তর্ভুক্ত করেন যা ডিফল্ট রিসোর্স সেটে নেই—উদাহরণস্বরূপ, যদি আপনি /values-es/strings.xml এ hello_world একটি স্ট্রিং রিসোর্স হিসেবে অন্তর্ভুক্ত করেন কিন্তু /values/strings.xml এ সেই রিসোর্সটি সংজ্ঞায়িত না করেন—তাহলে অ্যান্ড্রয়েড গ্রেডল প্লাগইন আপনার প্রজেক্ট কম্পাইল করার সময় আর সেই রিসোর্সটি অন্তর্ভুক্ত করবে না। এই আচরণগত পরিবর্তনের ফলে Resource Not Found রানটাইম এক্সেপশন কমবে এবং বিল্ডের গতি বাড়বে।
D8 এখন অ্যানোটেশনের জন্য CLASS ধারণ নীতি মেনে চলে।
আপনার অ্যাপ কম্পাইল করার সময়, D8 এখন অ্যানোটেশনগুলোর ক্লাস রিটেনশন পলিসি মেনে চলে, এবং সেই অ্যানোটেশনগুলো রানটাইমে আর উপলব্ধ থাকে না। অ্যাপের টার্গেট SDK এপিআই লেভেল ২৩-এ সেট করলেও এই আচরণটি দেখা যায়, যা আগে অ্যান্ড্রয়েড গ্রেডল প্লাগইন এবং D8-এর পুরোনো সংস্করণ ব্যবহার করে অ্যাপ কম্পাইল করার সময় রানটাইমে এই অ্যানোটেশনগুলো অ্যাক্সেস করার সুযোগ দিত।
অন্যান্য আচরণগত পরিবর্তন
-
aaptOptions.noCompressএখন আর সব প্ল্যাটফর্মে (APK এবং বান্ডেল উভয়ের জন্য) কেস-সেনসিটিভ নয় এবং এটি বড় হাতের অক্ষর ব্যবহার করা পাথকেও সম্মান করে। ডেটা বাইন্ডিং এখন ডিফল্টরূপে ইনক্রিমেন্টাল। আরও জানতে, ইস্যু #110061530 দেখুন।
রোবোইলেকট্রিক ইউনিট টেস্ট সহ সকল ইউনিট টেস্ট এখন সম্পূর্ণরূপে ক্যাশেযোগ্য। আরও জানতে, ইস্যু #115873047 দেখুন।
বাগ সংশোধন
অ্যান্ড্রয়েড গ্র্যাডল প্লাগইনের এই সংস্করণে নিম্নলিখিত বাগগুলো সংশোধন করা হয়েছে:
- ডেটা বাইন্ডিং ব্যবহারকারী লাইব্রেরি মডিউলগুলিতে এখন রোবোইলেকট্রিক ইউনিট টেস্ট সমর্থিত। আরও জানতে, ইস্যু #126775542 দেখুন।
- এখন গ্রেডলের প্যারালাল এক্সিকিউশন মোড চালু থাকা অবস্থায় আপনি একাধিক মডিউল জুড়ে
connectedAndroidTestটাস্ক চালাতে পারবেন।
পরিচিত সমস্যা
এই অংশে অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৩.৬.০-তে বিদ্যমান জ্ঞাত সমস্যাগুলো বর্ণনা করা হয়েছে।
অ্যান্ড্রয়েড লিন্ট টাস্কের ধীর পারফরম্যান্স
এর পার্সিং পরিকাঠামোর একটি ত্রুটির কারণে কিছু প্রজেক্টে অ্যান্ড্রয়েড লিন্ট সম্পন্ন হতে অনেক বেশি সময় লাগতে পারে, যার ফলে নির্দিষ্ট কিছু কোড কাঠামোতে ল্যাম্বডার জন্য অনুমানকৃত টাইপগুলোর গণনা ধীর হয়ে যায়।
সমস্যাটি IDEA-তে একটি বাগ হিসেবে চিহ্নিত করা হয়েছে এবং এটি Android Gradle Plugin 4.0-এ সমাধান করা হবে।
অনুপস্থিত ম্যানিফেস্ট ক্লাস {:#agp-missing-manifest}
আপনার অ্যাপ যদি তার ম্যানিফেস্টে কাস্টম পারমিশন নির্ধারণ করে, তাহলে অ্যান্ড্রয়েড গ্রেডল প্লাগইন সাধারণত একটি Manifest.java ক্লাস তৈরি করে, যেখানে আপনার কাস্টম পারমিশনগুলো স্ট্রিং কনস্ট্যান্ট হিসেবে অন্তর্ভুক্ত থাকে। প্লাগইনটি এই ক্লাসটিকে আপনার অ্যাপের সাথে প্যাকেজ করে, ফলে আপনি রানটাইমে আরও সহজে সেই পারমিশনগুলো রেফারেন্স করতে পারেন।
অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৩.৬.০-তে ম্যানিফেস্ট ক্লাস তৈরি করার প্রক্রিয়াটি ত্রুটিপূর্ণ। আপনি যদি প্লাগইনের এই সংস্করণটি দিয়ে আপনার অ্যাপ বিল্ড করেন এবং এটি ম্যানিফেস্ট ক্লাসকে রেফারেন্স করে, তাহলে আপনি একটি 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"; } }