অ্যান্ড্রয়েড গ্রেডল প্লাগইন 3.6.0 (ফেব্রুয়ারি 2020)
অ্যান্ড্রয়েড প্লাগইনের এই সংস্করণটির জন্য নিম্নলিখিতগুলি প্রয়োজন:
গ্রেডেল 5.6.4 । আরও জানতে, Gradle আপডেট করার বিষয়ে বিভাগটি পড়ুন।
SDK বিল্ড টুল 28.0.3 বা উচ্চতর।
3.6.4 (জুলাই 2020)
এই ছোটখাট আপডেটটি Android 11-এ প্যাকেজ দৃশ্যমানতার জন্য নতুন ডিফল্ট সেটিংস এবং বৈশিষ্ট্যগুলির সাথে সামঞ্জস্যপূর্ণতা সমর্থন করে৷
বিস্তারিত জানার জন্য 4.0.1 রিলিজ নোট দেখুন।
নতুন বৈশিষ্ট্য
অ্যান্ড্রয়েড গ্রেডল প্লাগইনের এই সংস্করণে নিম্নলিখিত নতুন বৈশিষ্ট্যগুলি অন্তর্ভুক্ত রয়েছে৷
বাইন্ডিং দেখুন
ভিউ বাইন্ডিং আপনার কোডে ভিউ উল্লেখ করার সময় কম্পাইল-টাইম নিরাপত্তা প্রদান করে। আপনি এখন findViewById()
স্বয়ংক্রিয়-উত্পন্ন বাইন্ডিং ক্লাস রেফারেন্স দিয়ে প্রতিস্থাপন করতে পারেন। ভিউ বাইন্ডিং ব্যবহার শুরু করতে, প্রতিটি মডিউলের build.gradle
ফাইলে নিম্নলিখিতগুলি অন্তর্ভুক্ত করুন:
android { viewBinding.enabled = true }
android { viewBinding.enabled = true }
আরও জানতে, ভিউ বাইন্ডিং ডকুমেন্টেশন পড়ুন।
Maven পাবলিশ প্লাগইনের জন্য সমর্থন
অ্যান্ড্রয়েড গ্রেডল প্লাগইনে মাভেন পাবলিশ গ্রেডল প্লাগইনের জন্য সমর্থন অন্তর্ভুক্ত রয়েছে, যা আপনাকে Apache Maven সংগ্রহস্থলে বিল্ড আর্টিফ্যাক্ট প্রকাশ করতে দেয়। অ্যান্ড্রয়েড গ্রেডল প্লাগইন আপনার অ্যাপ বা লাইব্রেরি মডিউলে প্রতিটি বিল্ড বৈকল্পিক আর্টিফ্যাক্টের জন্য একটি উপাদান তৈরি করে যা আপনি একটি ম্যাভেন রিপোজিটরিতে একটি প্রকাশনা কাস্টমাইজ করতে ব্যবহার করতে পারেন।
আরও জানতে, কিভাবে Maven Publish প্লাগইন ব্যবহার করবেন সে সম্পর্কে পৃষ্ঠায় যান।
নতুন ডিফল্ট প্যাকেজিং টুল
আপনার অ্যাপের ডিবাগ সংস্করণ তৈরি করার সময়, প্লাগইনটি আপনার APK তৈরি করতে zipflinger নামে একটি নতুন প্যাকেজিং টুল ব্যবহার করে। এই নতুন টুল বিল্ড গতি উন্নতি প্রদান করা উচিত. যদি নতুন প্যাকেজিং টুল আপনার প্রত্যাশা অনুযায়ী কাজ না করে, অনুগ্রহ করে একটি বাগ রিপোর্ট করুন । আপনি আপনার gradle.properties
ফাইলে নিম্নলিখিতগুলি অন্তর্ভুক্ত করে পুরানো প্যাকেজিং টুল ব্যবহার করে ফিরে যেতে পারেন:
android.useNewApkCreator=false
নেটিভ বিল্ড অ্যাট্রিবিউশন
আপনি এখন আপনার প্রকল্পে প্রতিটি C/C++ ফাইল তৈরি করতে এবং লিঙ্ক করতে ক্ল্যাং কত সময় নেয় তা নির্ধারণ করতে পারেন। 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 বিকল্প দ্বারা প্রতিস্থাপিত হয়েছে। আরও তথ্যের জন্য, রিলিজ নোট দেখুন সংকুচিত নেটিভ লাইব্রেরি প্যাকেজ করতে DSL ব্যবহার করুন ।
ডিফল্ট NDK সংস্করণ
আপনি যদি NDK-এর একাধিক সংস্করণ ডাউনলোড করেন, তাহলে Android Gradle প্লাগইন এখন আপনার সোর্স কোড ফাইল কম্পাইল করার জন্য একটি ডিফল্ট সংস্করণ নির্বাচন করে। পূর্বে, প্লাগইনটি NDK এর সর্বশেষ ডাউনলোড করা সংস্করণ নির্বাচন করেছিল। প্লাগইন-নির্বাচিত ডিফল্ট ওভাররাইড করতে মডিউলের build.gradle
ফাইলে android.ndkVersion
বৈশিষ্ট্য ব্যবহার করুন।
সরলীকৃত R শ্রেণীর প্রজন্ম
অ্যান্ড্রয়েড গ্রেডল প্লাগইন আপনার প্রোজেক্টের প্রতিটি লাইব্রেরি মডিউলের জন্য শুধুমাত্র একটি R ক্লাস তৈরি করে এবং সেই R ক্লাসগুলিকে অন্যান্য মডিউল নির্ভরতার সাথে ভাগ করে কম্পাইল ক্লাসপথকে সহজ করে। এই অপ্টিমাইজেশনের ফলে দ্রুত বিল্ড হওয়া উচিত, তবে এর জন্য আপনাকে নিম্নলিখিতগুলি মনে রাখতে হবে:
- যেহেতু কম্পাইলার আপস্ট্রিম মডিউল নির্ভরতার সাথে R ক্লাসগুলি ভাগ করে, এটি গুরুত্বপূর্ণ যে আপনার প্রকল্পের প্রতিটি মডিউল একটি অনন্য প্যাকেজ নাম ব্যবহার করে।
- একটি লাইব্রেরির R ক্লাসের অন্যান্য প্রকল্প নির্ভরতার দৃশ্যমানতা লাইব্রেরীকে নির্ভরতা হিসাবে অন্তর্ভুক্ত করার জন্য ব্যবহৃত কনফিগারেশন দ্বারা নির্ধারিত হয়। উদাহরণস্বরূপ, যদি লাইব্রেরি A লাইব্রেরি B কে 'api' নির্ভরতা হিসাবে অন্তর্ভুক্ত করে, লাইব্রেরি A এবং অন্যান্য লাইব্রেরিগুলি যেগুলি লাইব্রেরি A-এর উপর নির্ভর করে লাইব্রেরি B-এর R ক্লাসে অ্যাক্সেস রয়েছে। যাইহোক, অন্যান্য লাইব্রেরির লাইব্রেরি B এর R ক্লাসে অ্যাক্সেস নাও থাকতে পারে। যদি লাইব্রেরি A
implementation
নির্ভরতা কনফিগারেশন ব্যবহার করে। আরো জানতে, নির্ভরতা কনফিগারেশন সম্পর্কে পড়ুন।
ডিফল্ট কনফিগারেশন থেকে অনুপস্থিত সংস্থানগুলি সরান৷
লাইব্রেরি মডিউলগুলির জন্য, যদি আপনি এমন একটি ভাষার জন্য একটি সংস্থান অন্তর্ভুক্ত করেন যা আপনি সম্পদের ডিফল্ট সেটে অন্তর্ভুক্ত করেন না—উদাহরণস্বরূপ, আপনি যদি hello_world
একটি স্ট্রিং সম্পদ হিসাবে /values-es/strings.xml
এ অন্তর্ভুক্ত করেন কিন্তু আপনি সংজ্ঞায়িত করেন না /values/strings.xml
এ সেই রিসোর্স - আপনার প্রোজেক্ট কম্পাইল করার সময় Android Gradle প্লাগইন আর সেই রিসোর্সটি অন্তর্ভুক্ত করে না। এই আচরণের পরিবর্তনের ফলে কম Resource Not Found
রানটাইম ব্যতিক্রম এবং উন্নত বিল্ড গতি।
D8 এখন টীকাগুলির জন্য CLASS ধরে রাখার নীতিকে সম্মান করে৷
আপনার অ্যাপ কম্পাইল করার সময়, যখন টীকাগুলি একটি CLASS ধরে রাখার নীতি প্রয়োগ করে তখন D8 সম্মান করে এবং সেই টীকাগুলি আর রানটাইমে উপলব্ধ থাকে না। অ্যাপের টার্গেট SDK-কে API লেভেল 23-এ সেট করার সময়ও এই আচরণটি বিদ্যমান, যা আগে Android Gradle প্লাগইন এবং D8-এর পুরানো সংস্করণ ব্যবহার করে আপনার অ্যাপ কম্পাইল করার সময় রানটাইম চলাকালীন এই টীকাগুলিতে অ্যাক্সেসের অনুমতি দিয়েছিল।
অন্যান্য আচরণ পরিবর্তন
-
aaptOptions.noCompress
সমস্ত প্ল্যাটফর্মে (এপিকে এবং বান্ডেল উভয়ের জন্য) আর কেস সংবেদনশীল নয় এবং বড় হাতের অক্ষর ব্যবহার করে এমন পাথগুলিকে সম্মান করে৷ ডেটা বাইন্ডিং এখন ডিফল্টরূপে ক্রমবর্ধমান। আরও জানতে, সংখ্যা #110061530 দেখুন।
Roboelectric ইউনিট পরীক্ষা সহ সমস্ত ইউনিট পরীক্ষা, এখন সম্পূর্ণরূপে ক্যাশেযোগ্য। আরও জানতে, সংখ্যা #115873047 দেখুন।
বাগ ফিক্স
অ্যান্ড্রয়েড গ্রেডল প্লাগইনের এই সংস্করণে নিম্নলিখিত বাগ সংশোধনগুলি অন্তর্ভুক্ত রয়েছে:
- রোবোলেক্ট্রিক ইউনিট পরীক্ষাগুলি এখন লাইব্রেরি মডিউলগুলিতে সমর্থিত যা ডেটা বাইন্ডিং ব্যবহার করে। আরও জানতে, সংখ্যা #126775542 দেখুন।
- Gradle এর সমান্তরাল এক্সিকিউশন মোড সক্রিয় থাকা অবস্থায় আপনি এখন একাধিক মডিউল জুড়ে
connectedAndroidTest
কাজ চালাতে পারবেন।
পরিচিত সমস্যা
এই বিভাগে Android Gradle প্লাগইন 3.6.0-এ বিদ্যমান পরিচিত সমস্যাগুলি বর্ণনা করা হয়েছে।
অ্যান্ড্রয়েড লিন্ট টাস্কের ধীর কর্মক্ষমতা
অ্যান্ড্রয়েড লিন্ট এর পার্সিং পরিকাঠামোতে রিগ্রেশনের কারণে কিছু প্রকল্পে সম্পূর্ণ হতে অনেক বেশি সময় নিতে পারে, যার ফলে নির্দিষ্ট কোড কনস্ট্রাক্টে ল্যাম্বডাসের জন্য অনুমানকৃত প্রকারের গণনা ধীর হয়।
সমস্যাটি IDEA-তে একটি বাগ হিসাবে রিপোর্ট করা হয়েছে এবং Android Gradle Plugin 4.0-এ ঠিক করা হবে।
অনুপস্থিত ম্যানিফেস্ট ক্লাস {:#agp-missing-manifest}
যদি আপনার অ্যাপটি তার ম্যানিফেস্টে কাস্টম অনুমতিগুলি সংজ্ঞায়িত করে, তাহলে Android Gradle প্লাগইন সাধারণত একটি Manifest.java
ক্লাস তৈরি করে যা স্ট্রিং ধ্রুবক হিসাবে আপনার কাস্টম অনুমতিগুলিকে অন্তর্ভুক্ত করে। প্লাগইনটি আপনার অ্যাপের সাথে এই ক্লাসটি প্যাকেজ করে, যাতে আপনি রানটাইমে সেই অনুমতিগুলি আরও সহজে উল্লেখ করতে পারেন।
ম্যানিফেস্ট ক্লাস তৈরি করা অ্যান্ড্রয়েড গ্রেডল প্লাগইন 3.6.0-এ ভাঙা হয়েছে। আপনি যদি প্লাগইনটির এই সংস্করণটি দিয়ে আপনার অ্যাপ তৈরি করেন এবং এটি ম্যানিফেস্ট ক্লাসের উল্লেখ করে, আপনি একটি 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"; } }