অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৪.০.০ (এপ্রিল ২০২০)
অ্যান্ড্রয়েড প্লাগইনের এই সংস্করণটির জন্য নিম্নলিখিত বিষয়গুলো প্রয়োজন:
গ্রেডল ৬.১.১ । আরও জানতে, গ্রেডল আপডেট করার অংশটি পড়ুন।
এসডিকে বিল্ড টুলস ২৯.০.২ বা উচ্চতর সংস্করণ।
৪.০.১ (জুলাই ২০২০)
এই ছোট আপডেটটি অ্যান্ড্রয়েড ১১-এর প্যাকেজ দৃশ্যমানতার নতুন ডিফল্ট সেটিংস এবং ফিচারগুলোর সাথে সামঞ্জস্যতা সমর্থন করে।
অ্যান্ড্রয়েডের পূর্ববর্তী সংস্করণগুলিতে, ডিভাইসে ইনস্টল করা সমস্ত অ্যাপের একটি তালিকা দেখা যেত। অ্যান্ড্রয়েড ১১ (এপিআই লেভেল ৩০) থেকে, ডিফল্টরূপে অ্যাপগুলি শুধুমাত্র ইনস্টল করা প্যাকেজগুলির একটি ফিল্টার করা তালিকা দেখতে পায়। সিস্টেমে থাকা অ্যাপগুলির একটি বিস্তৃত তালিকা দেখতে, এখন আপনাকে আপনার অ্যাপ বা লাইব্রেরির অ্যান্ড্রয়েড ম্যানিফেস্টে একটি <queries> এলিমেন্ট যোগ করতে হবে।
অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৪.১+ ইতিমধ্যে নতুন <queries> ডিক্লারেশনের সাথে সামঞ্জস্যপূর্ণ; তবে, পুরোনো সংস্করণগুলো সামঞ্জস্যপূর্ণ নয়। আপনি যদি <queries> এলিমেন্টটি যোগ করেন অথবা অ্যান্ড্রয়েড ১১ টার্গেট করে এমন কোনো লাইব্রেরি বা SDK ব্যবহার করা শুরু করেন, তাহলে আপনার অ্যাপ বিল্ড করার সময় ম্যানিফেস্ট মার্জিং ত্রুটির সম্মুখীন হতে পারেন।
এই সমস্যাটির সমাধানের জন্য, আমরা AGP 3.3 এবং এর পরবর্তী সংস্করণগুলোর জন্য একগুচ্ছ প্যাচ প্রকাশ করছি। আপনি যদি AGP-এর কোনো পুরোনো সংস্করণ ব্যবহার করে থাকেন, তবে নিম্নলিখিত সংস্করণগুলোর যেকোনো একটিতে আপগ্রেড করুন :
| সর্বনিম্ন সংস্করণ | ডিফল্ট সংস্করণ | নোট | |
|---|---|---|---|
| গ্রেডল | ৬.১.১ | ৬.১.১ | আরও জানতে, Gradle আপডেট করা দেখুন। |
| এসডিকে বিল্ড টুলস | ২৯.০.২ | ২৯.০.২ | এসডিকে বিল্ড টুলস ইনস্টল বা কনফিগার করুন । |
এই নতুন ফিচারটি সম্পর্কে আরও তথ্যের জন্য, Android 11-এ প্যাকেজ ভিজিবিলিটি দেখুন।
নতুন বৈশিষ্ট্য
অ্যান্ড্রয়েড গ্রেডল প্লাগইনের এই সংস্করণে নিম্নলিখিত নতুন বৈশিষ্ট্যগুলো অন্তর্ভুক্ত করা হয়েছে।
অ্যান্ড্রয়েড স্টুডিও বিল্ড অ্যানালাইজারের জন্য সমর্থন
বিল্ড অ্যানালাইজার উইন্ডো আপনাকে আপনার বিল্ড প্রক্রিয়ার সমস্যাগুলো বুঝতে ও নির্ণয় করতে সাহায্য করে, যেমন নিষ্ক্রিয় অপটিমাইজেশন এবং ভুলভাবে কনফিগার করা টাস্ক। এই ফিচারটি তখনই পাওয়া যায় যখন আপনি অ্যান্ড্রয়েড স্টুডিও ৪.০ বা তার উচ্চতর সংস্করণের সাথে অ্যান্ড্রয়েড গ্রেডল প্লাগইন 4.0.0 বা তার উচ্চতর সংস্করণ ব্যবহার করেন। আপনি অ্যান্ড্রয়েড স্টুডিও থেকে নিম্নলিখিত উপায়ে বিল্ড অ্যানালাইজার উইন্ডোটি খুলতে পারেন:
- যদি আপনি ইতিমধ্যে তা না করে থাকেন, তাহলে মেনু বার থেকে Build > Make Project নির্বাচন করে আপনার অ্যাপটি বিল্ড করুন।
- মেনু বার থেকে ভিউ > টুল উইন্ডোজ > বিল্ড নির্বাচন করুন।
- বিল্ড উইন্ডোতে, নিম্নলিখিত উপায়গুলির মধ্যে যেকোনো একটিতে বিল্ড অ্যানালাইজার উইন্ডোটি খুলুন:
- অ্যান্ড্রয়েড স্টুডিও আপনার প্রজেক্ট বিল্ড করা শেষ করলে, বিল্ড অ্যানালাইজার ট্যাবে ক্লিক করুন।
- অ্যান্ড্রয়েড স্টুডিও আপনার প্রজেক্ট বিল্ড করা শেষ করলে, বিল্ড আউটপুট উইন্ডোর ডানদিকের লিঙ্কে ক্লিক করুন।

বিল্ড অ্যানালাইজার উইন্ডোটি বাম দিকে একটি ট্রি-এর আকারে সম্ভাব্য বিল্ড সমস্যাগুলো সাজিয়ে রাখে। আপনি ডান দিকের প্যানেলে প্রতিটি সমস্যা পরিদর্শন করতে এবং সেটিতে ক্লিক করে তার বিস্তারিত তথ্য খতিয়ে দেখতে পারেন। অ্যান্ড্রয়েড স্টুডিও যখন আপনার বিল্ড বিশ্লেষণ করে, তখন এটি বিল্ডের সময়কাল নির্ধারণকারী কাজগুলোর একটি সেট গণনা করে এবং এই কাজগুলোর প্রত্যেকটির প্রভাব বুঝতে আপনাকে সাহায্য করার জন্য একটি ভিজ্যুয়ালাইজেশন প্রদান করে। আপনি ওয়ার্নিংস নোডটি এক্সপ্যান্ড করে ওয়ার্নিংগুলোর বিস্তারিত তথ্যও পেতে পারেন।
আরও জানতে, ‘বিল্ড স্পিড রিগ্রেশন শনাক্তকরণ’ পড়ুন।
D8 এবং R8-এ জাভা 8 লাইব্রেরির ডিসুগারিং
অ্যান্ড্রয়েড গ্র্যাডল প্লাগইনটিতে এখন আপনার অ্যাপের জন্য কোনো ন্যূনতম এপিআই লেভেলের প্রয়োজন ছাড়াই বেশ কিছু জাভা ৮ ল্যাঙ্গুয়েজ এপিআই ব্যবহারের সুবিধা অন্তর্ভুক্ত করা হয়েছে।
ডিসুগারিং নামক একটি প্রক্রিয়ার মাধ্যমে, অ্যান্ড্রয়েড স্টুডিও ৩.০ এবং তার পরবর্তী সংস্করণগুলিতে থাকা DEX কম্পাইলার, D8, ইতোমধ্যেই জাভা ৮ ভাষার বৈশিষ্ট্যগুলির (যেমন ল্যাম্বডা এক্সপ্রেশন, ডিফল্ট ইন্টারফেস মেথড, ট্রাই উইথ রিসোর্স, এবং আরও অনেক কিছু) জন্য যথেষ্ট সমর্থন প্রদান করত। অ্যান্ড্রয়েড স্টুডিও ৪.০-তে, ডিসুগারিং ইঞ্জিনটিকে জাভা ভাষার এপিআই ডিসুগার করার জন্য আরও উন্নত করা হয়েছে। এর মানে হলো, আপনি এখন অ্যান্ড্রয়েডের পুরোনো সংস্করণ সমর্থনকারী অ্যাপগুলিতে এমন সব স্ট্যান্ডার্ড ল্যাঙ্গুয়েজ এপিআই অন্তর্ভুক্ত করতে পারবেন, যেগুলো আগে শুধুমাত্র সাম্প্রতিক অ্যান্ড্রয়েড রিলিজগুলিতে উপলব্ধ ছিল (যেমন java.util.streams )।
এই রিলিজে নিম্নলিখিত এপিআইগুলো সমর্থিত:
- ক্রমিক স্ট্রিম (
java.util.stream) -
java.timeএর একটি উপসেট -
java.util.function -
java.util.{Map,Collection,Comparator}-এ সাম্প্রতিক সংযোজনসমূহ - অপশনাল (
java.util.Optional,java.util.OptionalIntএবংjava.util.OptionalDouble) এবং উপরোক্ত API-গুলোর সাথে ব্যবহারযোগ্য আরও কিছু নতুন ক্লাস। -
java.util.concurrent.atomicএ কিছু সংযোজন (AtomicInteger,AtomicLongএবংAtomicReferenceএর উপর নতুন মেথড) -
ConcurrentHashMap(অ্যান্ড্রয়েড ৫.০-এর জন্য ত্রুটি সংশোধন সহ)
এই ল্যাঙ্গুয়েজ এপিআইগুলোকে সাপোর্ট করার জন্য, D8 একটি আলাদা লাইব্রেরি DEX ফাইল কম্পাইল করে, যেটিতে অনুপস্থিত এপিআইগুলোর ইমপ্লিমেন্টেশন থাকে এবং এটিকে আপনার অ্যাপে অন্তর্ভুক্ত করে। ডিসুগারিং প্রক্রিয়াটি আপনার অ্যাপের কোডকে এমনভাবে পুনর্লিখন করে, যাতে রানটাইমে এর পরিবর্তে এই লাইব্রেরিটি ব্যবহৃত হয়।
এই ল্যাঙ্গুয়েজ এপিআইগুলোর জন্য সাপোর্ট চালু করতে, আপনার অ্যাপ মডিউলের build.gradle ফাইলে নিম্নলিখিত বিষয়গুলো অন্তর্ভুক্ত করুন:
android {
defaultConfig {
// Required when setting minSdkVersion to 20 or lower
multiDexEnabled true
}
compileOptions {
// Flag to enable support for the new language APIs
coreLibraryDesugaringEnabled true
// Sets Java compatibility to Java 8
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
}
}
dependencies {
coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:1.0.4'
}
android {
defaultConfig {
// Required when setting minSdkVersion to 20 or lower
multiDexEnabled = true
}
compileOptions {
// Flag to enable support for the new language APIs
isCoreLibraryDesugaringEnabled = true
// Sets Java compatibility to Java 8
sourceCompatibility = JavaVersion.VERSION_1_8
targetCompatibility = JavaVersion.VERSION_1_8
}
}
dependencies {
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.0.4")
}
মনে রাখবেন যে, একটি লাইব্রেরি মডিউলের build.gradle ফাইলে উপরের কোড স্নিপেটটি অন্তর্ভুক্ত করার প্রয়োজন হতে পারে যদি
লাইব্রেরি মডিউলের ইন্সট্রুমেন্টেড টেস্টগুলো এই ল্যাঙ্গুয়েজ এপিআইগুলো ব্যবহার করে (সরাসরি অথবা লাইব্রেরি মডিউল বা এর ডিপেন্ডেন্সিগুলোর মাধ্যমে)। এর ফলে আপনার ইন্সট্রুমেন্টেড টেস্ট এপিকে-তে অনুপস্থিত এপিআইগুলো সরবরাহ করা হয়।
আপনি লাইব্রেরি মডিউলটিতে আলাদাভাবে লিন্ট চালাতে চান। এর ফলে লিন্ট ল্যাঙ্গুয়েজ এপিআই-এর সঠিক ব্যবহার চিনতে পারে এবং ভুল সতর্কবার্তা দেখানো এড়ানো যায়।
বিল্ড ফিচার চালু বা বন্ধ করার নতুন বিকল্প
অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৪.০.০ একটি নতুন উপায় চালু করেছে যার মাধ্যমে আপনি ভিউ বাইন্ডিং এবং ডেটা বাইন্ডিং-এর মতো কোন বিল্ড ফিচারগুলো চালু বা বন্ধ করতে চান তা নিয়ন্ত্রণ করতে পারবেন। যখন নতুন ফিচার যোগ করা হবে, তখন সেগুলো ডিফল্টরূপে বন্ধ থাকবে। এরপর আপনি buildFeatures ব্লক ব্যবহার করে শুধুমাত্র আপনার পছন্দের ফিচারগুলো চালু করতে পারবেন, যা আপনার প্রোজেক্টের বিল্ড পারফরম্যান্স অপ্টিমাইজ করতে সাহায্য করবে। আপনি মডিউল-লেভেলের build.gradle ফাইলে প্রতিটি মডিউলের জন্য অপশনগুলো নিম্নরূপভাবে সেট করতে পারেন:
android {
// The default value for each feature is shown below. You can change the value to
// override the default behavior.
buildFeatures {
// Determines whether to generate a BuildConfig class.
buildConfig = true
// Determines whether to support View Binding.
// Note that the viewBinding.enabled property is now deprecated.
viewBinding = false
// Determines whether to support Data Binding.
// Note that the dataBinding.enabled property is now deprecated.
dataBinding = false
// Determines whether to generate binder classes for your AIDL files.
aidl = true
// Determines whether to support RenderScript.
renderScript = true
// Determines whether to support injecting custom variables into the module’s R class.
resValues = true
// Determines whether to support shader AOT compilation.
shaders = true
}
}android {
// The default value for each feature is shown below. You can change the value to
// override the default behavior.
buildFeatures {
// Determines whether to generate a BuildConfig class.
buildConfig = true
// Determines whether to support View Binding.
// Note that the viewBinding.enabled property is now deprecated.
viewBinding = false
// Determines whether to support Data Binding.
// Note that the dataBinding.enabled property is now deprecated.
dataBinding = false
// Determines whether to generate binder classes for your AIDL files.
aidl = true
// Determines whether to support RenderScript.
renderScript = true
// Determines whether to support injecting custom variables into the module’s R class.
resValues = true
// Determines whether to support shader AOT compilation.
shaders = true
}
}আপনি আপনার প্রোজেক্টের gradle.properties ফাইলে নিচের এক বা একাধিক লাইন অন্তর্ভুক্ত করে একটি প্রোজেক্টের সমস্ত মডিউলের জন্য এই ফিচারগুলোর ডিফল্ট সেটিংও নির্দিষ্ট করতে পারেন, যেমনটি নিচে দেখানো হয়েছে। মনে রাখবেন, আপনি মডিউল-স্তরের build.gradle ফাইলে buildFeatures ব্লক ব্যবহার করে এই প্রোজেক্ট-ব্যাপী ডিফল্ট সেটিংগুলোকে ওভাররাইড করতে পারবেন।
android.defaults.buildfeatures.buildconfig=true
android.defaults.buildfeatures.aidl=true
android.defaults.buildfeatures.renderscript=true
android.defaults.buildfeatures.resvalues=true
android.defaults.buildfeatures.shaders=trueফিচার-অন-ফিচার নির্ভরতা
অ্যান্ড্রয়েড গ্রেডল প্লাগইনের পূর্ববর্তী সংস্করণগুলিতে, সমস্ত ফিচার মডিউল শুধুমাত্র অ্যাপের বেস মডিউলের উপর নির্ভর করতে পারত। অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৪.০.০ ব্যবহার করার সময়, এখন আপনি এমন একটি ফিচার মডিউল অন্তর্ভুক্ত করতে পারেন যা অন্য একটি ফিচার মডিউলের উপর নির্ভর করে। অর্থাৎ, একটি :video ফিচার :camera ফিচারের উপর নির্ভর করতে পারে, যা আবার বেস মডিউলের উপর নির্ভরশীল, যেমনটি নিচের চিত্রে দেখানো হয়েছে।

:video ফিচার মডিউলটি : :camera ফিচারের উপর নির্ভরশীল, যা আবার :app বেস মডিউলের উপর নির্ভরশীল।
এর মানে হলো, যখন আপনার অ্যাপ কোনো ফিচার মডিউল ডাউনলোড করার জন্য অনুরোধ করে, তখন অ্যাপটি তার উপর নির্ভরশীল অন্যান্য ফিচার মডিউলগুলোও ডাউনলোড করে। আপনার অ্যাপের জন্য ফিচার মডিউল তৈরি করার পর, আপনি মডিউলটির build.gradle ফাইলে একটি ফিচার-অন-ফিচার ডিপেন্ডেন্সি ঘোষণা করতে পারেন। উদাহরণস্বরূপ, :video মডিউলটি :camera উপর নিম্নরূপভাবে একটি ডিপেন্ডেন্সি ঘোষণা করে:
// In the build.gradle file of the ':video' module.
dependencies {
// All feature modules must declare a dependency
// on the base module.
implementation project(':app')
// Declares that this module also depends on the 'camera'
// feature module.
implementation project(':camera')
...
}// In the build.gradle file of the ':video' module.
dependencies {
// All feature modules must declare a dependency
// on the base module.
implementation(project(":app"))
// Declares that this module also depends on the 'camera'
// feature module.
implementation(project(":camera"))
...
}এছাড়াও, অ্যান্ড্রয়েড স্টুডিওতে ফিচার-অন-ফিচার ডিপেন্ডেন্সি ফিচারটি সক্রিয় করতে হবে (উদাহরণস্বরূপ, রান কনফিগারেশন সম্পাদনা করার সময় ফিচারটি সমর্থন করার জন্য)। এর জন্য মেনু বার থেকে Help > Edit Custom VM Options-এ ক্লিক করুন এবং নিম্নলিখিত বিষয়গুলো অন্তর্ভুক্ত করুন:
-Drundebug.feature.on.feature=trueনির্ভরতা মেটাডেটা
অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৪.০.০ এবং তার উচ্চতর সংস্করণ ব্যবহার করে আপনার অ্যাপ বিল্ড করার সময়, প্লাগইনটি মেটাডেটা অন্তর্ভুক্ত করে যা আপনার অ্যাপে কম্পাইল হওয়া ডিপেন্ডেন্সিগুলোর বর্ণনা দেয়। আপনার অ্যাপ আপলোড করার সময়, প্লে কনসোল আপনাকে নিম্নলিখিত সুবিধাগুলো প্রদান করার জন্য এই মেটাডেটা পরীক্ষা করে:
- আপনার অ্যাপে ব্যবহৃত SDK এবং ডিপেন্ডেন্সিগুলোর পরিচিত সমস্যা সম্পর্কে অ্যালার্ট পান।
- সেই সমস্যাগুলো সমাধানের জন্য কার্যকরী মতামত গ্রহণ করুন।
ডেটাটি সংকুচিত করা হয়, একটি গুগল প্লে সাইনিং কী দ্বারা এনক্রিপ্ট করা হয় এবং আপনার রিলিজ অ্যাপের সাইনিং ব্লকে সংরক্ষণ করা হয়। তবে, আপনি নিম্নলিখিত ডিরেক্টরিতে থাকা স্থানীয় ইন্টারমিডিয়েট বিল্ড ফাইলগুলিতে নিজেই মেটাডেটা পরীক্ষা করতে পারেন: <project>/<module>/build/outputs/sdk-dependencies/release/sdkDependency.txt ।
আপনি যদি এই তথ্য শেয়ার করতে না চান, তাহলে আপনার মডিউলের build.gradle ফাইলে নিম্নলিখিতটি অন্তর্ভুক্ত করে তা থেকে বেরিয়ে আসতে পারেন:
android {
dependenciesInfo {
// Disables dependency metadata when building APKs.
includeInApk = false
// Disables dependency metadata when building Android App Bundles.
includeInBundle = false
}
}android {
dependenciesInfo {
// Disables dependency metadata when building APKs.
includeInApk = false
// Disables dependency metadata when building Android App Bundles.
includeInBundle = false
}
}AAR নির্ভরতা থেকে নেটিভ লাইব্রেরি আমদানি করুন
এখন আপনি আপনার অ্যাপের AAR ডিপেন্ডেন্সি থেকে C/C++ লাইব্রেরি ইম্পোর্ট করতে পারবেন। নিচে বর্ণিত কনফিগারেশন ধাপগুলো অনুসরণ করলে, Gradle স্বয়ংক্রিয়ভাবে এই নেটিভ লাইব্রেরিগুলোকে আপনার এক্সটার্নাল নেটিভ বিল্ড সিস্টেম, যেমন CMake-এর সাথে ব্যবহারের জন্য উপলব্ধ করে দেয়। মনে রাখবেন যে, Gradle শুধুমাত্র আপনার বিল্ডের জন্য এই লাইব্রেরিগুলো উপলব্ধ করে; এগুলো ব্যবহার করার জন্য আপনাকে আপনার বিল্ড স্ক্রিপ্টগুলো অবশ্যই কনফিগার করতে হবে।
লাইব্রেরিগুলো প্রিফ্যাব প্যাকেজ ফরম্যাট ব্যবহার করে এক্সপোর্ট করা হয়।
প্রতিটি ডিপেন্ডেন্সি সর্বাধিক একটি প্রিফ্যাব প্যাকেজ প্রকাশ করতে পারে, যা এক বা একাধিক মডিউল নিয়ে গঠিত। একটি প্রিফ্যাব মডিউল হলো একটি একক লাইব্রেরি, যা শেয়ার্ড, স্ট্যাটিক বা হেডার-অনলি লাইব্রেরি হতে পারে।
সাধারণত, প্যাকেজের নামটি মেভেন আর্টিফ্যাক্টের নামের সাথে এবং মডিউলের নামটি লাইব্রেরির নামের সাথে মিলে যায়, কিন্তু এটি সবসময় সত্যি নয়। যেহেতু লাইব্রেরিগুলোর প্যাকেজ এবং মডিউলের নাম জানা প্রয়োজন, তাই সেই নামগুলো কী তা নির্ধারণ করতে আপনাকে ডিপেন্ডেন্সির ডকুমেন্টেশন দেখতে হতে পারে।
আপনার বাহ্যিক নেটিভ বিল্ড সিস্টেম কনফিগার করুন
আপনাকে যে ধাপগুলো অনুসরণ করতে হবে তা দেখতে, আপনি যে এক্সটার্নাল নেটিভ বিল্ড সিস্টেমটি ব্যবহার করার পরিকল্পনা করছেন তার জন্য নিচের ধাপগুলো অনুসরণ করুন।
আপনার অ্যাপের প্রতিটি AAR ডিপেন্ডেন্সি, যেগুলোতে নেটিভ কোড অন্তর্ভুক্ত থাকে, একটি Android.mk ফাইল প্রকাশ করে যা আপনাকে আপনার ndk-build প্রজেক্টে ইম্পোর্ট করতে হবে। আপনি import&endash;module কমান্ড ব্যবহার করে এই ফাইলটি ইম্পোর্ট করেন, যা আপনার ndk-build প্রজেক্টে import&endash;add&endash;path প্রপার্টি ব্যবহার করে নির্দিষ্ট করা পাথগুলোতে অনুসন্ধান করে। উদাহরণস্বরূপ, যদি আপনার অ্যাপ্লিকেশনটি libapp.so ডিফাইন করে এবং এটি `curl` ব্যবহার করে, তাহলে আপনার `Android.mk` ফাইলে নিম্নলিখিতটি অন্তর্ভুক্ত করা উচিত:
CMake-এর জন্য:
add_library(app SHARED app.cpp)# Add these two lines. find_package(curl REQUIRED CONFIG) target_link_libraries(app curl::curl)
ndk-buildজন্য :include $(CLEAR_VARS) LOCAL_MODULE := libapp LOCAL_SRC_FILES := app.cpp # Link libcurl from the curl AAR. LOCAL_SHARED_LIBRARIES := curl include $(BUILD_SHARED_LIBRARY)# If you don't expect that your project will be built using versions of the NDK # older than r21, you can omit this block. ifneq ($(call ndk-major-at-least,21),true) $(call import-add-path,$(NDK_GRADLE_INJECTED_IMPORT_PATH)) endif
# Import all modules that are included in the curl AAR. $(call import-module,prefab/curl)
একটি AAR-এ অন্তর্ভুক্ত নেটিভ ডিপেন্ডেন্সিগুলো CMAKE_FIND_ROOT_PATH {: .external} ভেরিয়েবলের মাধ্যমে আপনার CMake প্রোজেক্টে উন্মুক্ত করা হয়। CMake চালু করার সময় Gradle স্বয়ংক্রিয়ভাবে এই মানটি সেট করে দেয়, তাই আপনার বিল্ড সিস্টেম যদি এই ভেরিয়েবলটি পরিবর্তন করে, তবে নিশ্চিত হয়ে নেবেন যে আপনি এতে অ্যাসাইন না করে অ্যাপেন্ড করছেন।
প্রতিটি ডিপেন্ডেন্সি আপনার CMake বিল্ডের জন্য একটি কনফিগ-ফাইল প্যাকেজ {: .external} উন্মুক্ত করে, যা আপনি find_package {: .external}` কমান্ডের মাধ্যমে ইম্পোর্ট করেন। এই কমান্ডটি প্রদত্ত প্যাকেজের নাম এবং ভার্সনের সাথে মেলে এমন কনফিগ-ফাইল প্যাকেজগুলো অনুসন্ধান করে এবং আপনার বিল্ডে ব্যবহারের জন্য এর দ্বারা সংজ্ঞায়িত টার্গেটগুলো উন্মুক্ত করে। উদাহরণস্বরূপ, যদি আপনার অ্যাপ্লিকেশনটি libapp.so সংজ্ঞায়িত করে এবং `curl` ব্যবহার করে, তাহলে আপনার CMakeLists.txt ফাইলে নিম্নলিখিতটি অন্তর্ভুক্ত করা উচিত:
add_library(app SHARED app.cpp)
# Add these two lines.
find_package(curl REQUIRED CONFIG)
target_link_libraries(app curl::curl)
এখন আপনি app.cpp ফাইলে #include "curl/curl.h" উল্লেখ করতে পারেন। যখন আপনি আপনার প্রজেক্ট বিল্ড করবেন, আপনার এক্সটার্নাল নেটিভ বিল্ড সিস্টেম স্বয়ংক্রিয়ভাবে libapp.so libcurl.so এর সাথে লিঙ্ক করবে এবং APK বা অ্যাপ বান্ডেলে libcurl.so প্যাকেজ করবে। অতিরিক্ত তথ্যের জন্য, {:.external} কার্ল প্রিফ্যাব স্যাম্পলটি দেখুন।
আচরণের পরিবর্তন
প্লাগইনটির এই সংস্করণটি ব্যবহার করার সময়, আপনি এর আচরণে নিম্নলিখিত পরিবর্তনগুলো লক্ষ্য করতে পারেন।
v1/v2 স্বাক্ষর কনফিগারেশন আপডেট
signingConfig ব্লকে অ্যাপ সাইনিং কনফিগারেশনের আচরণ নিম্নলিখিতভাবে পরিবর্তিত হয়েছে:
v1 স্বাক্ষর
- যদি
v1SigningEnabledস্পষ্টভাবে সক্রিয় করা হয়, তাহলে AGP v1 অ্যাপ সাইনিং সম্পাদন করে। - যদি ব্যবহারকারী
v1SigningEnabledস্পষ্টভাবে নিষ্ক্রিয় করে দেন, তাহলে v1 অ্যাপ স্বাক্ষর করা হয় না। - যদি ব্যবহারকারী স্পষ্টভাবে v1 সাইনিং সক্ষম না করে থাকেন, তাহলে এটি
minSdkএবংtargetSdkউপর ভিত্তি করে স্বয়ংক্রিয়ভাবে নিষ্ক্রিয় হয়ে যেতে পারে।
v2 স্বাক্ষর
- যদি
v2SigningEnabledস্পষ্টভাবে সক্রিয় করা হয়, তাহলে AGP v2 অ্যাপ সাইনিং সম্পাদন করে। - যদি ব্যবহারকারী
v2SigningEnabledস্পষ্টভাবে নিষ্ক্রিয় করে দেন, তাহলে v2 অ্যাপ স্বাক্ষর করা হয় না। - যদি ব্যবহারকারী স্পষ্টভাবে v2 সাইনিং সক্রিয় না করে থাকেন, তাহলে
targetSdkউপর ভিত্তি করে এটি স্বয়ংক্রিয়ভাবে নিষ্ক্রিয় হয়ে যেতে পারে।
এই পরিবর্তনগুলোর ফলে, ব্যবহারকারী স্পষ্টভাবে এই ফ্ল্যাগগুলো সক্রিয় করেছেন কিনা তার উপর ভিত্তি করে সাইনিং প্রক্রিয়াটি নিষ্ক্রিয় করার মাধ্যমে AGP বিল্ড অপ্টিমাইজ করতে পারে। এই রিলিজের আগে, স্পষ্টভাবে সক্রিয় করা সত্ত্বেও v1Signing নিষ্ক্রিয় হয়ে যাওয়ার সম্ভাবনা ছিল, যা বিভ্রান্তিকর হতে পারত।
feature এবং instantapp অ্যান্ড্রয়েড গ্রেডল প্লাগইনগুলি সরানো হয়েছে
অ্যান্ড্রয়েড গ্র্যাডল প্লাগইন ৩.৬.০, অ্যান্ড্রয়েড অ্যাপ বান্ডেল ব্যবহার করে আপনার ইনস্ট্যান্ট অ্যাপগুলো বিল্ড ও প্যাকেজ করার জন্য ফিচার প্লাগইন ( com.android.feature ) এবং ইনস্ট্যান্ট অ্যাপ প্লাগইন ( com.android.instantapp )-কে অপ্রচলিত ঘোষণা করেছে এবং এর পরিবর্তে ডাইনামিক ফিচার প্লাগইন ( com.android.dynamic-feature ) ব্যবহারের পরামর্শ দিয়েছে।
অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৪.০.০ এবং এর পরবর্তী সংস্করণগুলোতে এই ডেপ্রিকেটেড প্লাগইনগুলো সম্পূর্ণরূপে সরিয়ে ফেলা হয়েছে। তাই, সর্বশেষ অ্যান্ড্রয়েড গ্রেডল প্লাগইন ব্যবহার করার জন্য, আপনাকে আপনার ইনস্ট্যান্ট অ্যাপটিকে অ্যান্ড্রয়েড অ্যাপ বান্ডেল সমর্থন করার জন্য মাইগ্রেট করতে হবে। আপনার ইনস্ট্যান্ট অ্যাপগুলো মাইগ্রেট করার মাধ্যমে, আপনি অ্যাপ বান্ডেলের সুবিধাগুলো কাজে লাগাতে পারবেন এবং আপনার অ্যাপের মডিউলার ডিজাইনকে আরও সহজ করতে পারবেন ।
দ্রষ্টব্য: অ্যান্ড্রয়েড স্টুডিও ৪.০ এবং তার উচ্চতর সংস্করণে বাদ দেওয়া প্লাগইন ব্যবহৃত প্রজেক্টগুলো খুলতে হলে, প্রজেক্টটিতে অবশ্যই অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৩.৬.০ বা তার নিম্নতর সংস্করণ ব্যবহার করতে হবে।
পৃথক টীকা প্রক্রিয়াকরণ বৈশিষ্ট্য সরানো হয়েছে
অ্যানোটেশন প্রসেসিংকে একটি ডেডিকেটেড টাস্কে আলাদা করার ক্ষমতাটি সরিয়ে ফেলা হয়েছে। শুধুমাত্র জাভা-ভিত্তিক প্রজেক্টে নন-ইনক্রিমেন্টাল অ্যানোটেশন প্রসেসর ব্যবহার করার সময় ইনক্রিমেন্টাল জাভা কম্পাইলেশন বজায় রাখার জন্য এই অপশনটি ব্যবহৃত হতো; এটি gradle.properties ফাইলে android.enableSeparateAnnotationProcessing true সেট করার মাধ্যমে সক্রিয় করা হতো, যা এখন আর কাজ করে না।
এর পরিবর্তে, বিল্ড পারফরম্যান্স উন্নত করার জন্য আপনার ইনক্রিমেন্টাল অ্যানোটেশন প্রসেসর ব্যবহার শুরু করা উচিত।
includeCompileClasspath এখন অপ্রচলিত।
অ্যান্ড্রয়েড গ্রেডল প্লাগইন এখন আর কম্পাইল ক্লাসপাথে আপনার ঘোষিত অ্যানোটেশন প্রসেসরগুলো পরীক্ষা করে না বা অন্তর্ভুক্ত করে না, এবং annotationProcessorOptions.includeCompileClasspath DSL প্রপার্টিটিরও আর কোনো কার্যকারিতা নেই। আপনি যদি কম্পাইল ক্লাসপাথে অ্যানোটেশন প্রসেসর অন্তর্ভুক্ত করেন, তাহলে আপনি নিম্নলিখিত ত্রুটিটি পেতে পারেন:
Error: Annotation processors must be explicitly declared now.এই সমস্যাটি সমাধান করতে, আপনাকে অবশ্যই annotationProcessor ডিপেন্ডেন্সি কনফিগারেশন ব্যবহার করে আপনার build.gradle ফাইলগুলিতে অ্যানোটেশন প্রসেসর অন্তর্ভুক্ত করতে হবে। আরও জানতে, “অ্যানোটেশন প্রসেসর যোগ করুন” পড়ুন।
CMake দ্বারা ব্যবহৃত প্রি-বিল্ট ডিপেন্ডেন্সিগুলোর স্বয়ংক্রিয় প্যাকেজিং
অ্যান্ড্রয়েড গ্র্যাডল প্লাগইনের পূর্ববর্তী সংস্করণগুলিতে, আপনার CMake এক্সটার্নাল নেটিভ বিল্ডে ব্যবহৃত যেকোনো প্রি-বিল্ট লাইব্রেরি jniLibs ব্যবহার করে স্পষ্টভাবে প্যাকেজ করা আবশ্যক ছিল। আপনার লাইব্রেরিগুলি আপনার মডিউলের src/main/jniLibs ডিরেক্টরিতে, অথবা সম্ভবত আপনার build.gradle ফাইলে কনফিগার করা অন্য কোনো ডিরেক্টরিতে থাকতে পারে।
sourceSets {
main {
// The libs directory contains prebuilt libraries that are used by the
// app's library defined in CMakeLists.txt via an IMPORTED target.
jniLibs.srcDirs = ['libs']
}
}sourceSets {
main {
// The libs directory contains prebuilt libraries that are used by the
// app's library defined in CMakeLists.txt via an IMPORTED target.
jniLibs.setSrcDirs(listOf("libs"))
}
}অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৪.০-এর সাথে, উপরের কনফিগারেশনটির আর প্রয়োজন নেই এবং এর ফলে বিল্ড ব্যর্থ হবে:
* What went wrong:
Execution failed for task ':app:mergeDebugNativeLibs'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.Workers$ActionFacade
> More than one file was found with OS independent path 'lib/x86/libprebuilt.so'এক্সটার্নাল নেটিভ বিল্ড এখন স্বয়ংক্রিয়ভাবে সেই লাইব্রেরিগুলো প্যাকেজ করে, তাই jniLibs দিয়ে লাইব্রেরিটি স্পষ্টভাবে প্যাকেজ করলে একটি ডুপ্লিকেট তৈরি হয়। বিল্ড ত্রুটি এড়াতে, প্রি-বিল্ট লাইব্রেরিটি jniLibs বাইরের কোনো স্থানে সরিয়ে নিন অথবা আপনার build.gradle ফাইল থেকে jniLibs কনফিগারেশনটি মুছে ফেলুন।
পরিচিত সমস্যা
এই অংশে অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৪.০.০-এ বিদ্যমান জ্ঞাত সমস্যাগুলো বর্ণনা করা হয়েছে।
গ্রেডল ওয়ার্কার মেকানিজমে রেস কন্ডিশন
অ্যান্ড্রয়েড গ্র্যাডল প্লাগইন ৪.০-এর পরিবর্তনের ফলে &endash;&endash;no&endash;daemon এর সাথে এবং গ্র্যাডল ৬.৩ বা তার নিম্নতর সংস্করণে চালানোর সময় একটি রেস কন্ডিশন তৈরি হতে পারে, যার ফলে বিল্ড শেষ হওয়ার পরেও তা আটকে যায়।
এই সমস্যাটি গ্রেডল ৬.৪-এ সমাধান করা হবে।