অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৩.০.০ (অক্টোবর ২০১৭)
অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৩.০.০-তে বিভিন্ন পরিবর্তন আনা হয়েছে, যার লক্ষ্য হলো বড় প্রজেক্টগুলোর পারফরম্যান্স সংক্রান্ত সমস্যাগুলোর সমাধান করা।
উদাহরণস্বরূপ, প্রায় ১৩০টি মডিউল এবং প্রচুর সংখ্যক এক্সটার্নাল ডিপেন্ডেন্সি সহ একটি নমুনা স্কেলেটন প্রোজেক্টে (কিন্তু কোনো কোড বা রিসোর্স ছাড়া), আপনি নিম্নলিখিতগুলির অনুরূপ পারফরম্যান্সের উন্নতি অনুভব করতে পারেন:
| অ্যান্ড্রয়েড প্লাগইন সংস্করণ + গ্রেডল সংস্করণ | অ্যান্ড্রয়েড প্লাগইন ২.২.০ + গ্রেডল ২.১৪.১ | অ্যান্ড্রয়েড প্লাগইন ২.৩.০ + গ্রেডল ৩.৩ | অ্যান্ড্রয়েড প্লাগইন ৩.০.০ + গ্রেডল ৪.১ |
|---|---|---|---|
কনফিগারেশন (যেমন ./gradlew --help চালানো) | ~২ মিনিট | ~৯ সেকেন্ড | ~২.৫ সেকেন্ড |
| ১-লাইনের জাভা পরিবর্তন (বাস্তবায়ন পরিবর্তন) | ~২ মিনিট ১৫ সেকেন্ড | ~২৯ সেকেন্ড | ~৬.৪ সেকেন্ড |
এই পরিবর্তনগুলোর কয়েকটি বিদ্যমান বিল্ডগুলোকে অকার্যকর করে দেয়। তাই, আপনার বিবেচনা করা উচিত...
নতুন প্লাগইনটি ব্যবহার করার আগে আপনার প্রজেক্টটি মাইগ্রেট করার প্রচেষ্টা।
আপনি যদি উপরে বর্ণিত পারফরম্যান্সের উন্নতি অনুভব না করেন, তাহলে অনুগ্রহ করে একটি বাগ রিপোর্ট করুন এবং Gradle Profiler ব্যবহার করে আপনার বিল্ডের একটি ট্রেস অন্তর্ভুক্ত করুন।
অ্যান্ড্রয়েড প্লাগইনের এই সংস্করণটির জন্য নিম্নলিখিত বিষয়গুলো প্রয়োজন:
| সর্বনিম্ন সংস্করণ | ডিফল্ট সংস্করণ | নোট | |
|---|---|---|---|
| গ্রেডল | ৪.১ | ৪.১ | আরও জানতে, Gradle আপডেট করা দেখুন। |
| এসডিকে বিল্ড টুলস | ২৬.০.২ | ২৬.০.২ | এসডিকে বিল্ড টুলস ইনস্টল বা কনফিগার করুন । এই আপডেটের ফলে, বিল্ড টুলসের জন্য আর কোনো ভার্সন নির্দিষ্ট করার প্রয়োজন নেই—প্লাগইনটি ডিফল্টরূপে সর্বনিম্ন প্রয়োজনীয় ভার্সনটি ব্যবহার করে। তাই, আপনি এখন android.buildToolsVersion প্রপার্টিটি সরিয়ে ফেলতে পারেন। |
৩.০.১ (নভেম্বর ২০১৭)
এটি অ্যান্ড্রয়েড স্টুডিও ৩.০.১ সমর্থন করার জন্য একটি ছোট আপডেট, এবং এতে সাধারণ বাগ সংশোধন ও কর্মক্ষমতার উন্নতি অন্তর্ভুক্ত রয়েছে।
অপ্টিমাইজেশন
- একটি সূক্ষ্ম টাস্ক গ্রাফের মাধ্যমে বহু-মডিউল প্রোজেক্টের জন্য উন্নততর সমান্তরালতা।
- ডিপেন্ডেন্সিতে পরিবর্তন আনার সময়, গ্রেডল সেইসব মডিউলকে পুনরায় কম্পাইল করে না যাদের সেই ডিপেন্ডেন্সির API-তে অ্যাক্সেস নেই, যার ফলে বিল্ড দ্রুততর হয়। গ্রেডলের নতুন ডিপেন্ডেন্সি কনফিগারেশন—
implementation,api,compileOnly, এবংruntimeOnlyব্যবহার করে আপনার উচিত কোন কোন ডিপেন্ডেন্সি অন্য মডিউলে তাদের API লিক করতে পারবে তা সীমাবদ্ধ করা। - প্রতি-ক্লাস ডেক্সিং-এর কারণে ইনক্রিমেন্টাল বিল্ডের গতি দ্রুততর। এখন প্রতিটি ক্লাস আলাদা DEX ফাইলে কম্পাইল করা হয়, এবং শুধুমাত্র পরিবর্তিত ক্লাসগুলোই পুনরায় ডেক্স করা হয়। এছাড়াও, যেসব অ্যাপ
minSdkVersion২০ বা তার কম সেট করে এবং লিগ্যাসি মাল্টি-ডেক্স ব্যবহার করে, সেগুলোর বিল্ডের গতিও উন্নত হবে বলে আশা করা যায়। - ক্যাশে করা আউটপুট ব্যবহার করার জন্য নির্দিষ্ট কিছু টাস্ক অপ্টিমাইজ করে বিল্ডের গতি উন্নত করা হয়েছে। এই অপ্টিমাইজেশনের সুবিধা পেতে, আপনাকে প্রথমে গ্রেডল বিল্ড ক্যাশে সক্রিয় করতে হবে।
- AAPT2 ব্যবহার করে উন্নত ইনক্রিমেন্টাল রিসোর্স প্রসেসিং করা হয়েছে, যা এখন ডিফল্টরূপে সক্রিয় থাকে। AAPT2 ব্যবহার করার সময় আপনি যদি কোনো সমস্যার সম্মুখীন হন, তবে অনুগ্রহ করে একটি বাগ রিপোর্ট করুন । এছাড়াও, আপনি আপনার
gradle.propertiesফাইলেandroid.enableAapt2=falseসেট করে এবং কমান্ড লাইন থেকে./gradlew --stopচালিয়ে Gradle ডেমন পুনরায় চালু করে AAPT2 নিষ্ক্রিয় করতে পারেন।
নতুন বৈশিষ্ট্য
- ভ্যারিয়েন্ট-সচেতন ডিপেন্ডেন্সি ম্যানেজমেন্ট । কোনো মডিউলের একটি নির্দিষ্ট ভ্যারিয়েন্ট বিল্ড করার সময়, প্লাগইনটি এখন স্বয়ংক্রিয়ভাবে লোকাল লাইব্রেরি মডিউল ডিপেন্ডেন্সিগুলোর ভ্যারিয়েন্টগুলোকে আপনার বিল্ড করা মডিউলের ভ্যারিয়েন্টের সাথে মিলিয়ে নেয়।
- অ্যান্ড্রয়েড ইনস্ট্যান্ট অ্যাপস এবং অ্যান্ড্রয়েড ইনস্ট্যান্ট অ্যাপস এসডিকে (যা আপনি এসডিকে ম্যানেজার ব্যবহার করে ডাউনলোড করতে পারেন) সমর্থন করার জন্য এতে একটি নতুন ফিচার মডিউল প্লাগইন অন্তর্ভুক্ত রয়েছে। নতুন প্লাগইনটি দিয়ে ফিচার মডিউল তৈরি করার বিষয়ে আরও জানতে, “একাধিক ফিচার সহ একটি ইনস্ট্যান্ট অ্যাপের কাঠামো” পড়ুন।
- নির্দিষ্ট কিছু জাভা ৮ ল্যাঙ্গুয়েজ ফিচার এবং জাভা ৮ লাইব্রেরি ব্যবহারের জন্য বিল্ট-ইন সাপোর্ট। জ্যাক (Jack) এখন ডেপ্রিকেটেড এবং এর আর প্রয়োজন নেই , এবং ডিফল্ট টুলচেইনে বিল্ট-ইন উন্নত জাভা ৮ সাপোর্ট ব্যবহার করার জন্য আপনার প্রথমে জ্যাক নিষ্ক্রিয় করা উচিত। আরও তথ্যের জন্য, “জাভা ৮ ল্যাঙ্গুয়েজ ফিচার ব্যবহার করুন ” পড়ুন।
অ্যান্ড্রয়েড টেস্ট অর্কেস্ট্রেটর (Android Test Orchestrator) দিয়ে টেস্ট চালানোর সুবিধা যোগ করা হয়েছে, যা আপনাকে আপনার অ্যাপের প্রতিটি টেস্টকে ইন্সট্রুমেন্টেশনের নিজস্ব ইনভোকেশনের মধ্যে চালানোর সুযোগ দেয়। যেহেতু প্রতিটি টেস্ট তার নিজস্ব ইন্সট্রুমেন্টেশন ইনস্ট্যান্সে চলে, তাই টেস্টগুলোর মধ্যেকার কোনো শেয়ার্ড স্টেট আপনার ডিভাইসের সিপিইউ বা মেমরিতে জমা হয় না। এবং, এমনকি যদি কোনো একটি টেস্ট ক্র্যাশও করে, তবে এটি শুধুমাত্র তার নিজস্ব ইন্সট্রুমেন্টেশন ইনস্ট্যান্সটিকেই ডাউন করে, ফলে আপনার অন্যান্য টেস্টগুলো চলতে থাকে।
- অন-ডিভাইস টেস্ট অর্কেস্ট্রেশন ব্যবহার করা হবে কিনা তা নির্ধারণ করতে
testOptions.executionযোগ করা হয়েছে। আপনি যদি Android Test Orchestrator ব্যবহার করতে চান, তাহলে আপনাকেANDROID_TEST_ORCHESTRATORনির্দিষ্ট করতে হবে, যেমনটি নিচে দেখানো হয়েছে। ডিফল্টরূপে, এই প্রপার্টিটিHOSTএ সেট করা থাকে, যা অন-ডিভাইস অর্কেস্ট্রেশন নিষ্ক্রিয় করে এবং এটি টেস্ট চালানোর একটি প্রচলিত পদ্ধতি।
গ্রুভি
android { testOptions { execution 'ANDROID_TEST_ORCHESTRATOR' } }
কোটলিন
android { testOptions { execution = "ANDROID_TEST_ORCHESTRATOR" } }
- অন-ডিভাইস টেস্ট অর্কেস্ট্রেশন ব্যবহার করা হবে কিনা তা নির্ধারণ করতে
নতুন
androidTestUtilডিপেন্ডেন্সি কনফিগারেশন আপনাকে আপনার ইন্সট্রুমেন্টেশন টেস্টগুলো চালানোর আগে আরেকটি টেস্ট হেল্পার APK ইনস্টল করার সুযোগ দেয়, যেমন Android Test Orchestrator:গ্রুভি
dependencies { androidTestUtil 'com.android.support.test:orchestrator:1.0.0' ... }
কোটলিন
dependencies { androidTestUtil("com.android.support.test:orchestrator:1.0.0") ... }
Roboelectric-এর মতো অ্যান্ড্রয়েড রিসোর্সের প্রয়োজন হয় এমন ইউনিট টেস্ট সমর্থন করার জন্য
testOptions.unitTests.includeAndroidResourcesযোগ করা হয়েছে। আপনি যখন এই প্রপার্টিটি 'trueসেট করবেন, তখন প্লাগইনটি আপনার ইউনিট টেস্ট চালানোর আগে রিসোর্স, অ্যাসেট এবং ম্যানিফেস্ট মার্জিং সম্পন্ন করবে। এরপর আপনার টেস্টগুলো ক্লাসপাথে থাকাcom/android/tools/test_config.propertiesফাইলটিতে নিম্নলিখিত কী-গুলো পরীক্ষা করতে পারবে:android_merged_assets: মার্জ করা অ্যাসেট ডিরেক্টরির সম্পূর্ণ পাথ।দ্রষ্টব্য: লাইব্রেরি মডিউলগুলির ক্ষেত্রে, মার্জ করা অ্যাসেটগুলিতে ডিপেন্ডেন্সিগুলির অ্যাসেট অন্তর্ভুক্ত থাকে না ( ইস্যু #65550419 দেখুন)।
android_merged_manifest: মার্জ করা ম্যানিফেস্ট ফাইলের অ্যাবসোলিউট পাথ।android_merged_resources: মার্জ করা রিসোর্স ডিরেক্টরির সম্পূর্ণ পাথ, যেখানে মডিউল এবং এর সমস্ত নির্ভরতার সমস্ত রিসোর্স থাকে।android_custom_package: চূড়ান্ত R ক্লাসের প্যাকেজ নাম। আপনি যদি অ্যাপ্লিকেশন আইডি গতিশীলভাবে পরিবর্তন করেন, তাহলে এই প্যাকেজ নামটি অ্যাপের ম্যানিফেস্টে থাকাpackageঅ্যাট্রিবিউটের সাথে নাও মিলতে পারে।
- রিসোর্স হিসেবে ফন্টের সমর্থন (যা অ্যান্ড্রয়েড ৮.০ (এপিআই লেভেল ২৬) -এ প্রবর্তিত একটি নতুন বৈশিষ্ট্য)।
- অ্যান্ড্রয়েড ইনস্ট্যান্ট অ্যাপস এসডিকে ১.১ এবং তার পরবর্তী সংস্করণগুলোতে ভাষা-নির্দিষ্ট এপিকে-এর জন্য সমর্থন রয়েছে।
আপনি এখন আপনার এক্সটার্নাল নেটিভ বিল্ড প্রজেক্টের আউটপুট ডিরেক্টরি পরিবর্তন করতে পারেন, যেমনটি নিচে দেখানো হয়েছে:
গ্রুভি
android { ... externalNativeBuild { // For ndk-build, instead use the ndkBuild block. cmake { ... // Specifies a relative path for outputs from external native // builds. You can specify any path that's not a subdirectory // of your project's temporary build/ directory. buildStagingDirectory "./outputs/cmake" } } }
কোটলিন
android { ... externalNativeBuild { // For ndk-build, instead use the ndkBuild block. cmake { ... // Specifies a relative path for outputs from external native // builds. You can specify any path that's not a subdirectory // of your project's temporary build/ directory. buildStagingDirectory = "./outputs/cmake" } } }
- এখন থেকে অ্যান্ড্রয়েড স্টুডিও থেকে নেটিভ প্রজেক্ট বিল্ড করার জন্য আপনি CMake 3.7 বা তার উচ্চতর সংস্করণ ব্যবহার করতে পারবেন।
নতুন
lintChecksডিপেন্ডেন্সি কনফিগারেশন আপনাকে কাস্টম লিন্ট রুল সংজ্ঞায়িত করে একটি JAR তৈরি করতে এবং সেটিকে আপনার AAR ও APK প্রোজেক্টে প্যাকেজ করার সুযোগ দেয়।আপনার কাস্টম লিন্ট রুলগুলো অবশ্যই একটি আলাদা প্রজেক্টের অন্তর্ভুক্ত হতে হবে, যেটি একটিমাত্র JAR ফাইল আউটপুট করে এবং যাতে শুধুমাত্র
compileOnlyডিপেন্ডেন্সিগুলো থাকে। এরপর অন্যান্য অ্যাপ এবং লাইব্রেরি মডিউলগুলোlintChecksকনফিগারেশন ব্যবহার করে আপনার লিন্ট প্রজেক্টের উপর নির্ভর করতে পারবে।গ্রুভি
dependencies { // This tells the Gradle plugin to build ':lint-checks' into a lint.jar file // and package it with your module. If the module is an Android library, // other projects that depend on it automatically use the lint checks. // If the module is an app, lint includes these rules when analyzing the app. lintChecks project(':lint-checks') }
কোটলিন
dependencies { // This tells the Gradle plugin to build ':lint-checks' into a lint.jar file // and package it with your module. If the module is an Android library, // other projects that depend on it automatically use the lint checks. // If the module is an app, lint includes these rules when analyzing the app. lintChecks(project(":lint-checks")) }
আচরণের পরিবর্তন
- অ্যান্ড্রয়েড প্লাগইন 3.0.0 কিছু নির্দিষ্ট API সরিয়ে দিয়েছে, এবং সেগুলি ব্যবহার করলে আপনার বিল্ড ভেঙে যাবে। উদাহরণস্বরূপ, আপনি এখন আর
outputFile()অবজেক্ট অ্যাক্সেস করতে ভ্যারিয়েন্টস API ব্যবহার করতে পারবেন না, অথবা প্রতিটি ভ্যারিয়েন্টের ম্যানিফেস্ট ফাইল পেতেprocessManifest.manifestOutputFile()ব্যবহার করতে পারবেন না। আরও জানতে, এপিআই পরিবর্তনসমূহ পড়ুন। - বিল্ড টুলসের জন্য এখন আর কোনো ভার্সন নির্দিষ্ট করার প্রয়োজন নেই (তাই, আপনি এখন
android.buildToolsVersionপ্রপার্টিটি সরিয়ে ফেলতে পারেন)। ডিফল্টরূপে, প্লাগইনটি আপনার ব্যবহৃত অ্যান্ড্রয়েড প্লাগইনের ভার্সনের জন্য স্বয়ংক্রিয়ভাবে সর্বনিম্ন প্রয়োজনীয় বিল্ড টুলস ভার্সনটি ব্যবহার করে। - এখন আপনি
buildTypesব্লকে PNG ক্রাঞ্চিং চালু/বন্ধ করতে পারবেন, যেমনটি নিচে দেখানো হয়েছে। ডিবাগ বিল্ড ছাড়া অন্য সব বিল্ডের জন্য PNG ক্রাঞ্চিং ডিফল্টরূপে চালু থাকে, কারণ এটি সেইসব প্রোজেক্টের বিল্ড টাইম বাড়িয়ে দেয় যেগুলিতে অনেক PNG ফাইল থাকে। তাই, অন্যান্য বিল্ড টাইপের জন্য বিল্ড টাইম উন্নত করতে, আপনার হয় PNG ক্রাঞ্চিং বন্ধ করে দেওয়া উচিত অথবা আপনার ইমেজগুলিকে WebP-তে রূপান্তর করা উচিত ।গ্রুভি
android { buildTypes { release { // Disables PNG crunching for the release build type. crunchPngs false } } }
কোটলিন
android { buildTypes { release { // Disables PNG crunching for the release build type. isCrunchPngs = false } } }
- অ্যান্ড্রয়েড প্লাগইনটি এখন আপনার বাহ্যিক CMake প্রজেক্টগুলিতে কনফিগার করা এক্সিকিউটেবল টার্গেটগুলিকে স্বয়ংক্রিয়ভাবে বিল্ড করে।
- এখন আপনাকে অবশ্যই
annotationProcessorডিপেন্ডেন্সি কনফিগারেশন ব্যবহার করে প্রসেসর ক্লাসপাথে অ্যানোটেশন প্রসেসরগুলো যুক্ত করতে হবে। - অপ্রচলিত
ndkCompileব্যবহার এখন আরও সীমাবদ্ধ। এর পরিবর্তে, আপনার APK-তে প্যাকেজ করতে চাওয়া নেটিভ কোড কম্পাইল করার জন্য CMake বা ndk-build ব্যবহার শুরু করা উচিত। আরও জানতে, “Migrate from ndkcompile” পড়ুন।