অ্যান্ড্রয়েড গ্রেডল প্লাগইন 4.0.0 (এপ্রিল 2020)

অ্যান্ড্রয়েড প্লাগইনের এই সংস্করণটির জন্য নিম্নলিখিতগুলি প্রয়োজন:

4.0.1 (জুলাই 2020)

এই ছোটখাট আপডেটটি Android 11-এ প্যাকেজ দৃশ্যমানতার জন্য নতুন ডিফল্ট সেটিংস এবং বৈশিষ্ট্যগুলির সাথে সামঞ্জস্যপূর্ণতা সমর্থন করে৷

অ্যান্ড্রয়েডের পূর্ববর্তী সংস্করণগুলিতে, একটি ডিভাইসে ইনস্টল করা সমস্ত অ্যাপের একটি তালিকা দেখা সম্ভব ছিল। অ্যান্ড্রয়েড 11 (এপিআই লেভেল 30) দিয়ে শুরু করে, ডিফল্টভাবে অ্যাপগুলি শুধুমাত্র ইনস্টল করা প্যাকেজগুলির একটি ফিল্টার করা তালিকায় অ্যাক্সেস করতে পারে। সিস্টেমে অ্যাপগুলির একটি বিস্তৃত তালিকা দেখতে, আপনাকে এখন আপনার অ্যাপ বা লাইব্রেরির Android ম্যানিফেস্টে একটি <queries> উপাদান যোগ করতে হবে।

Android Gradle প্লাগইন 4.1+ ইতিমধ্যেই নতুন <queries> ঘোষণার সাথে সামঞ্জস্যপূর্ণ; যাইহোক, পুরানো সংস্করণগুলি সামঞ্জস্যপূর্ণ নয়। আপনি যদি <queries> এলিমেন্ট যোগ করেন বা আপনি যদি Android 11 কে টার্গেট করা সমর্থন করে এমন একটি লাইব্রেরি বা SDK-এর উপর নির্ভর করা শুরু করেন, তাহলে আপনার অ্যাপ তৈরি করার সময় আপনি ম্যানিফেস্ট মার্জিং ত্রুটির সম্মুখীন হতে পারেন।

এই সমস্যাটির সমাধান করার জন্য, আমরা AGP 3.3 এবং উচ্চতর প্যাচগুলির একটি সেট প্রকাশ করছি৷ আপনি যদি AGP-এর একটি পুরানো সংস্করণ ব্যবহার করেন তবে নিম্নলিখিত সংস্করণগুলির মধ্যে একটিতে আপগ্রেড করুন :

ন্যূনতম সংস্করণ ডিফল্ট সংস্করণ নোট
গ্রেডল 6.1.1 6.1.1 আরও জানতে, Gradle আপডেট করা দেখুন।
SDK বিল্ড টুলস 29.0.2 29.0.2 SDK বিল্ড টুল ইনস্টল বা কনফিগার করুন

এই নতুন বৈশিষ্ট্য সম্পর্কে আরও তথ্যের জন্য, Android 11-এ প্যাকেজ দৃশ্যমানতা দেখুন।

নতুন বৈশিষ্ট্য

অ্যান্ড্রয়েড গ্রেডল প্লাগইনের এই সংস্করণে নিম্নলিখিত নতুন বৈশিষ্ট্যগুলি অন্তর্ভুক্ত রয়েছে৷

অ্যান্ড্রয়েড স্টুডিও বিল্ড অ্যানালাইজারের জন্য সমর্থন

বিল্ড অ্যানালাইজার উইন্ডো আপনাকে আপনার বিল্ড প্রক্রিয়ার সমস্যাগুলি বুঝতে এবং নির্ণয় করতে সহায়তা করে, যেমন অক্ষম অপ্টিমাইজেশন এবং ভুলভাবে কনফিগার করা কাজগুলি। আপনি যখন Android Gradle প্লাগইন 4.0.0 এবং উচ্চতর ব্যবহার করেন তখন এই বৈশিষ্ট্যটি পাওয়া যায়। আপনি অ্যান্ড্রয়েড স্টুডিও থেকে বিল্ড অ্যানালাইজার উইন্ডো খুলতে পারেন:

  1. আপনি যদি ইতিমধ্যে এটি না করে থাকেন তবে মেনু বার থেকে Build > Make Project নির্বাচন করে আপনার অ্যাপ তৈরি করুন।
  2. মেনু বার থেকে দেখুন > টুল উইন্ডোজ > বিল্ড নির্বাচন করুন।
  3. বিল্ড উইন্ডোতে, বিল্ড বিশ্লেষক উইন্ডোটি নিম্নলিখিত উপায়ে একটিতে খুলুন:
    • অ্যান্ড্রয়েড স্টুডিও আপনার প্রকল্প তৈরি শেষ করার পরে, বিল্ড অ্যানালাইজার ট্যাবে ক্লিক করুন।
    • অ্যান্ড্রয়েড স্টুডিও আপনার প্রোজেক্ট তৈরি করা শেষ করার পরে, বিল্ড আউটপুট উইন্ডোর ডান দিকের লিঙ্কে ক্লিক করুন।

বিল্ড অ্যানালাইজার উইন্ডোটি বাম দিকের একটি গাছে সম্ভাব্য বিল্ড সমস্যাগুলি সংগঠিত করে। আপনি ডানদিকের প্যানেলে প্রতিটি সমস্যার বিবরণ তদন্ত করতে পরিদর্শন এবং ক্লিক করতে পারেন। যখন অ্যান্ড্রয়েড স্টুডিও আপনার বিল্ড বিশ্লেষণ করে, তখন এটি বিল্ডের সময়কাল নির্ধারণ করে এমন কাজের সেট গণনা করে এবং এই প্রতিটি কাজের প্রভাব বুঝতে সাহায্য করার জন্য একটি ভিজ্যুয়ালাইজেশন প্রদান করে। আপনি সতর্কতা নোড প্রসারিত করে সতর্কতা সম্পর্কে বিশদও পেতে পারেন।

আরও জানতে, বিল্ড স্পিড রিগ্রেশন সনাক্ত করুন পড়ুন।

D8 এবং R8 এ জাভা 8 লাইব্রেরি ডিসুগারিং

অ্যান্ড্রয়েড গ্রেডল প্লাগইনে এখন আপনার অ্যাপের জন্য ন্যূনতম API স্তরের প্রয়োজন ছাড়াই বেশ কয়েকটি জাভা 8 ভাষার API ব্যবহার করার জন্য সমর্থন অন্তর্ভুক্ত রয়েছে।

ডিসুগারিং নামক একটি প্রক্রিয়ার মাধ্যমে, অ্যান্ড্রয়েড স্টুডিও 3.0 এবং উচ্চতর DEX কম্পাইলার, D8 ইতিমধ্যেই জাভা 8 ভাষার বৈশিষ্ট্যগুলির জন্য যথেষ্ট সমর্থন প্রদান করেছে (যেমন ল্যাম্বডা এক্সপ্রেশন, ডিফল্ট ইন্টারফেস পদ্ধতি, সংস্থানগুলির সাথে চেষ্টা করুন এবং আরও অনেক কিছু)। অ্যান্ড্রয়েড স্টুডিও 4.0-এ, ডিসুগারিং ইঞ্জিনটি জাভা ল্যাঙ্গুয়েজ এপিআই ডিসুগার করতে সক্ষম হওয়ার জন্য প্রসারিত করা হয়েছে। এর মানে হল যে আপনি এখন স্ট্যান্ডার্ড ল্যাঙ্গুয়েজ এপিআইগুলি অন্তর্ভুক্ত করতে পারেন যা শুধুমাত্র সাম্প্রতিক অ্যান্ড্রয়েড রিলিজে (যেমন java.util.streams ) উপলব্ধ ছিল যা Android এর পুরানো সংস্করণগুলিকে সমর্থন করে৷

নিম্নলিখিত API-এর সেট এই রিলিজে সমর্থিত:

  • অনুক্রমিক স্ট্রীম ( java.util.stream )
  • java.time এর একটি উপসেট
  • java.util.function
  • java.util.{Map,Collection,Comparator}
  • ঐচ্ছিক ( java.util.Optional , java.util.OptionalInt এবং java.util.OptionalDouble ) এবং উপরের এপিআইগুলির সাথে উপযোগী কিছু নতুন ক্লাস
  • java.util.concurrent.atomic এ কিছু সংযোজন ( AtomicInteger , AtomicLong এবং AtomicReference এ নতুন পদ্ধতি)
  • ConcurrentHashMap (Android 5.0 এর জন্য বাগ ফিক্স সহ)

এই ভাষা APIগুলিকে সমর্থন করার জন্য, D8 একটি পৃথক লাইব্রেরি DEX ফাইল কম্পাইল করে যাতে অনুপস্থিত APIগুলির একটি বাস্তবায়ন থাকে এবং এটি আপনার অ্যাপে অন্তর্ভুক্ত করে। ডিসুগারিং প্রক্রিয়া রানটাইমে এই লাইব্রেরিটি ব্যবহার করার পরিবর্তে আপনার অ্যাপের কোড পুনরায় লিখবে।

এই ভাষা APIগুলির জন্য সমর্থন সক্ষম করতে, আপনার অ্যাপ মডিউলের 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 ফাইলে অন্তর্ভুক্ত করতে হতে পারে যদি

  • লাইব্রেরি মডিউলের ইনস্ট্রুমেন্টেড পরীক্ষাগুলি এই ভাষা APIগুলি ব্যবহার করে (হয় সরাসরি বা লাইব্রেরি মডিউল বা এর নির্ভরতার মাধ্যমে)। এটি যাতে অনুপস্থিত APIগুলি আপনার ইনস্ট্রুমেন্টেড টেস্ট APK এর জন্য প্রদান করা হয়।

  • আপনি বিচ্ছিন্নভাবে লাইব্রেরি মডিউলে লিন্ট চালাতে চান। এটি লিন্টকে ভাষা API-এর বৈধ ব্যবহার সনাক্ত করতে এবং মিথ্যা সতর্কতা প্রতিবেদন করা এড়াতে সহায়তা করার জন্য।

বিল্ড বৈশিষ্ট্য সক্রিয় বা নিষ্ক্রিয় করার জন্য নতুন বিকল্প

অ্যান্ড্রয়েড গ্রেডল প্লাগইন 4.0.0 আপনি কোন বিল্ড বৈশিষ্ট্যগুলিকে সক্ষম এবং অক্ষম করতে চান তা নিয়ন্ত্রণ করার একটি নতুন উপায় প্রবর্তন করে, যেমন ভিউ বাইন্ডিং এবং ডেটা বাইন্ডিং৷ যখন নতুন বৈশিষ্ট্য যোগ করা হয়, তখন সেগুলি ডিফল্টরূপে অক্ষম করা হবে৷ তারপরে আপনি শুধুমাত্র আপনার পছন্দসই বৈশিষ্ট্যগুলি সক্ষম করতে 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

ফিচার-অন-ফিচার নির্ভরতা

অ্যান্ড্রয়েড গ্রেডল প্লাগইনের পূর্ববর্তী সংস্করণগুলিতে, সমস্ত বৈশিষ্ট্য মডিউল শুধুমাত্র অ্যাপের বেস মডিউলের উপর নির্ভর করতে পারে। Android Gradle প্লাগইন 4.0.0 ব্যবহার করার সময়, আপনি এখন একটি বৈশিষ্ট্য মডিউল অন্তর্ভুক্ত করতে পারেন যা অন্য বৈশিষ্ট্য মডিউলের উপর নির্ভর করে। অর্থাৎ, একটি :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"))
    ...
}

অতিরিক্তভাবে, মেনু বার থেকে সহায়তা > কাস্টম VM বিকল্পগুলি সম্পাদনা করুন ক্লিক করে এবং নিম্নলিখিতগুলি সহ আপনার Android স্টুডিওতে বৈশিষ্ট্য-অন-ফিচার নির্ভরতা বৈশিষ্ট্য সক্রিয় করা উচিত (উদাহরণস্বরূপ রান কনফিগারেশন সম্পাদনা করার সময় বৈশিষ্ট্যটিকে সমর্থন করার জন্য)

-Drundebug.feature.on.feature=true

নির্ভরতা মেটাডেটা

Android Gradle প্লাগইন 4.0.0 এবং উচ্চতর ব্যবহার করে আপনার অ্যাপ তৈরি করার সময়, প্লাগইনে মেটাডেটা অন্তর্ভুক্ত থাকে যা আপনার অ্যাপে কম্পাইল করা নির্ভরতা বর্ণনা করে। আপনার অ্যাপ আপলোড করার সময়, প্লে কনসোল আপনাকে নিম্নলিখিত সুবিধাগুলি প্রদান করতে এই মেটাডেটা পরীক্ষা করে:

  • আপনার অ্যাপ ব্যবহার করে SDK এবং নির্ভরতাগুলির সাথে পরিচিত সমস্যাগুলির জন্য সতর্কতা পান
  • এই সমস্যাগুলি সমাধান করার জন্য কার্যকর প্রতিক্রিয়া পান

ডেটা সংকুচিত হয়, একটি Google Play সাইনিং কী দ্বারা এনক্রিপ্ট করা হয় এবং আপনার রিলিজ অ্যাপের সাইনিং ব্লকে সংরক্ষণ করা হয়। যাইহোক, আপনি নিম্নলিখিত ডিরেক্টরিতে স্থানীয় মধ্যবর্তী বিল্ড ফাইলগুলিতে নিজেই মেটাডেটা পরীক্ষা করতে পারেন: <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++ লাইব্রেরি আমদানি করতে পারেন। যখন আপনি নীচে বর্ণিত কনফিগারেশন পদক্ষেপগুলি অনুসরণ করেন, গ্রেডল স্বয়ংক্রিয়ভাবে এই নেটিভ লাইব্রেরিগুলিকে আপনার বাহ্যিক নেটিভ বিল্ড সিস্টেমের সাথে ব্যবহার করার জন্য উপলব্ধ করে, যেমন CMake। মনে রাখবেন যে Gradle শুধুমাত্র এই লাইব্রেরিগুলি আপনার বিল্ডে উপলব্ধ করে; আপনাকে এখনও আপনার বিল্ড স্ক্রিপ্টগুলি ব্যবহার করার জন্য কনফিগার করতে হবে।

Prefab প্যাকেজ বিন্যাস ব্যবহার করে লাইব্রেরি রপ্তানি করা হয়।

প্রতিটি নির্ভরতা সর্বাধিক একটি Prefab প্যাকেজ প্রকাশ করতে পারে, যার মধ্যে এক বা একাধিক মডিউল রয়েছে। একটি প্রিফ্যাব মডিউল হল একটি একক লাইব্রেরি, যেটি হয় শেয়ার করা, স্ট্যাটিক বা হেডার-অনলি লাইব্রেরি হতে পারে।

সাধারণত, প্যাকেজ নামটি Maven আর্টিফ্যাক্ট নামের সাথে মেলে এবং মডিউল নামটি লাইব্রেরির নামের সাথে মেলে তবে এটি সর্বদা সত্য নয়। যেহেতু আপনাকে লাইব্রেরিগুলির প্যাকেজ এবং মডিউলের নাম জানতে হবে, সেই নামগুলি কী তা নির্ধারণ করতে আপনাকে নির্ভরতার ডকুমেন্টেশনের সাথে পরামর্শ করতে হতে পারে।

আপনার বাহ্যিক নেটিভ বিল্ড সিস্টেম কনফিগার করুন

আপনাকে যে ধাপগুলি অনুসরণ করতে হবে তা দেখতে, আপনি যে বাহ্যিক নেটিভ বিল্ড সিস্টেমটি ব্যবহার করার পরিকল্পনা করছেন তার জন্য নীচের পদক্ষেপগুলি অনুসরণ করুন৷

আপনার অ্যাপের প্রতিটি AAR নির্ভরতা যার মধ্যে নেটিভ কোড রয়েছে একটি Android.mk ফাইল প্রকাশ করে যা আপনাকে আপনার ndk-build প্রকল্পে আমদানি করতে হবে। আপনি import&endash;module কমান্ড ব্যবহার করে এই ফাইলটি আমদানি করেন, যা আপনার ndk-build প্রকল্পে import&endash;add&endash;path বৈশিষ্ট্য ব্যবহার করে আপনার নির্দিষ্ট করা পাথগুলি অনুসন্ধান করে। উদাহরণস্বরূপ, যদি আপনার অ্যাপ্লিকেশন libapp.so সংজ্ঞায়িত করে এবং এটি কার্ল ব্যবহার করে, তাহলে আপনার Android.mk ফাইলে নিম্নলিখিতগুলি অন্তর্ভুক্ত করা উচিত:

  1. CMake এর জন্য:

    add_library(app SHARED app.cpp)

    # Add these two lines. find_package(curl REQUIRED CONFIG) target_link_libraries(app curl::curl)

  2. 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 প্রকল্পে উন্মুক্ত হয়। এই মানটি Gradle দ্বারা স্বয়ংক্রিয়ভাবে সেট করা হবে যখন CMake আহ্বান করা হবে, তাই যদি আপনার বিল্ড সিস্টেম এই ভেরিয়েবলটি পরিবর্তন করে, তাহলে এটিকে বরাদ্দ না করে যুক্ত করতে ভুলবেন না।

প্রতিটি নির্ভরতা আপনার CMake বিল্ডে একটি কনফিগার-ফাইল প্যাকেজ {: .external} প্রকাশ করে, যা আপনি find_package {: .external} কমান্ডের মাধ্যমে আমদানি করেন। এই কমান্ডটি প্রদত্ত প্যাকেজের নাম এবং সংস্করণের সাথে মেলে এমন কনফিগার-ফাইল প্যাকেজগুলি অনুসন্ধান করে এবং এটি আপনার বিল্ডে ব্যবহার করার জন্য নির্ধারিত লক্ষ্যগুলিকে প্রকাশ করে। উদাহরণস্বরূপ, যদি আপনার অ্যাপ্লিকেশন libapp.so সংজ্ঞায়িত করে এবং এটি কার্ল ব্যবহার করে, তাহলে আপনার 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 প্যাকেজ করে। অতিরিক্ত তথ্যের জন্য, curl prefab নমুনা {:.external} পড়ুন।

আচরণ পরিবর্তন

প্লাগইনটির এই সংস্করণটি ব্যবহার করার সময়, আপনি আচরণে নিম্নলিখিত পরিবর্তনগুলির সম্মুখীন হতে পারেন৷

v1/v2 সাইনিং কনফিগারেশন আপডেট

signingConfig ব্লকে অ্যাপ সাইনিং কনফিগারেশনের আচরণ নিম্নলিখিতগুলিতে পরিবর্তিত হয়েছে:

v1 স্বাক্ষর

  • যদি v1SigningEnabled স্পষ্টভাবে সক্ষম করা হয়, AGP v1 অ্যাপ সাইনিং করে।
  • যদি v1SigningEnabled ব্যবহারকারী দ্বারা স্পষ্টভাবে অক্ষম করা হয়, তাহলে v1 অ্যাপ সাইনিং করা হয় না।
  • যদি ব্যবহারকারী স্পষ্টভাবে v1 সাইনিং সক্ষম না করে থাকে, তাহলে minSdk এবং targetSdk উপর ভিত্তি করে এটি স্বয়ংক্রিয়ভাবে অক্ষম করা যেতে পারে।

v2 স্বাক্ষর

  • যদি v2SigningEnabled স্পষ্টভাবে সক্ষম করা হয়, AGP v2 অ্যাপ সাইনিং সঞ্চালন করে।
  • যদি v2SigningEnabled ব্যবহারকারী দ্বারা স্পষ্টভাবে অক্ষম করা হয়, v2 অ্যাপ সাইনিং করা হয় না।
  • যদি ব্যবহারকারী স্পষ্টভাবে v2 সাইনিং সক্ষম না করে থাকে, তাহলে এটি targetSdk উপর ভিত্তি করে স্বয়ংক্রিয়ভাবে অক্ষম করা যেতে পারে।

এই পরিবর্তনগুলি ব্যবহারকারী স্পষ্টভাবে এই ফ্ল্যাগগুলিকে সক্ষম করেছে কিনা তার উপর ভিত্তি করে স্বাক্ষর করার প্রক্রিয়াটি নিষ্ক্রিয় করে বিল্ডগুলিকে অপ্টিমাইজ করার অনুমতি দেয়৷ এই প্রকাশের আগে, স্পষ্টভাবে সক্রিয় থাকা সত্ত্বেও v1Signing নিষ্ক্রিয় করা সম্ভব ছিল, যা বিভ্রান্তিকর হতে পারে।

feature এবং instantapp অ্যান্ড্রয়েড গ্রেডল প্লাগইনগুলি সরানো হয়েছে৷

অ্যান্ড্রয়েড গ্রেডল প্লাগইন 3.6.0 ফিচার প্লাগইন ( com.android.feature ) এবং ইনস্ট্যান্ট অ্যাপ প্লাগইন ( com.android.instantapp ) নির্মাণ এবং প্যাকেজ করার জন্য ডায়নামিক ফিচার প্লাগইন ( com.android.dynamic-feature ) ব্যবহার করার পক্ষে বাতিল করেছে অ্যান্ড্রয়েড অ্যাপ বান্ডেল ব্যবহার করে আপনার তাত্ক্ষণিক অ্যাপ।

অ্যান্ড্রয়েড গ্রেডল প্লাগইন 4.0.0 এবং উচ্চতর, এই অবহেলিত প্লাগইনগুলি সম্পূর্ণরূপে সরানো হয়েছে৷ তাই, সর্বশেষ Android Gradle প্লাগইন ব্যবহার করতে, আপনাকে Android App Bundles সমর্থন করতে আপনার তাত্ক্ষণিক অ্যাপ স্থানান্তর করতে হবে। আপনার তাত্ক্ষণিক অ্যাপ্লিকেশানগুলি স্থানান্তর করার মাধ্যমে, আপনি অ্যাপ বান্ডিলগুলির সুবিধাগুলি লাভ করতে পারেন এবং আপনার অ্যাপের মডুলার ডিজাইনকে সরল করতে পারেন

দ্রষ্টব্য: অ্যান্ড্রয়েড স্টুডিও 4.0 এবং উচ্চতর প্ল্যাগইনগুলি ব্যবহার করে এমন প্রকল্পগুলি খুলতে, প্রকল্পটিকে অবশ্যই Android গ্রেডল প্লাগইন 3.6.0 বা তার চেয়ে কম ব্যবহার করতে হবে৷

পৃথক টীকা প্রক্রিয়াকরণ বৈশিষ্ট্য সরানো হয়েছে৷

একটি ডেডিকেটেড টাস্কে টীকা প্রক্রিয়াকরণকে আলাদা করার ক্ষমতা সরিয়ে দেওয়া হয়েছে। এই বিকল্পটি ক্রমবর্ধমান জাভা সংকলন বজায় রাখার জন্য ব্যবহার করা হয়েছিল যখন জাভা-শুধুমাত্র প্রকল্পগুলিতে নন-ইনক্রিমেন্টাল টীকা প্রসেসর ব্যবহার করা হয়; এটি gradle.properties ফাইলে android.enableSeparateAnnotationProcessing কে true সেট করে সক্ষম করা হয়েছিল, যা আর কাজ করে না।

পরিবর্তে, বিল্ড কর্মক্ষমতা উন্নত করতে আপনার ক্রমবর্ধমান টীকা প্রসেসর ব্যবহার করে মাইগ্রেট করা উচিত।

CompileClasspath অন্তর্ভুক্ত করা হয়েছে

অ্যান্ড্রয়েড গ্রেডল প্লাগইনটি আর পরীক্ষা করে না বা কম্পাইল ক্লাসপথে আপনি ঘোষণা করা টীকা প্রসেসর অন্তর্ভুক্ত করে এবং annotationProcessorOptions.includeCompileClasspath DSL প্রপার্টি আর কোনো প্রভাব ফেলে না। আপনি কম্পাইল ক্লাসপথে টীকা প্রসেসর অন্তর্ভুক্ত করলে, আপনি নিম্নলিখিত ত্রুটি পেতে পারেন:

Error: Annotation processors must be explicitly declared now.

এই সমস্যাটি সমাধান করতে, আপনাকে অবশ্যই আপনার build.gradle ফাইলগুলিতে annotationProcessor নির্ভরতা কনফিগারেশন ব্যবহার করে টীকা প্রসেসর অন্তর্ভুক্ত করতে হবে। আরও জানতে, টীকা প্রসেসর যুক্ত করুন পড়ুন।

CMake দ্বারা ব্যবহৃত পূর্বনির্মাণ নির্ভরতার স্বয়ংক্রিয় প্যাকেজিং

অ্যান্ড্রয়েড গ্রেডল প্লাগইনের পূর্ববর্তী সংস্করণগুলির জন্য প্রয়োজন যে আপনি স্পষ্টভাবে jniLibs ব্যবহার করে আপনার CMake বাহ্যিক নেটিভ বিল্ড দ্বারা ব্যবহৃত যে কোনও পূর্বনির্মাণ লাইব্রেরি প্যাকেজ করুন৷ আপনার মডিউলের 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"))
  }
}

Android Gradle Plugin 4.0 এর সাথে, উপরের কনফিগারেশনটির আর প্রয়োজন নেই এবং এর ফলে বিল্ড ব্যর্থ হবে:

* 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 কনফিগারেশনটি সরিয়ে দিন।

পরিচিত সমস্যা

এই বিভাগে Android Gradle প্লাগইন 4.0.0-এ বিদ্যমান পরিচিত সমস্যাগুলি বর্ণনা করা হয়েছে।

গ্রেডল কর্মী প্রক্রিয়ায় রেসের অবস্থা

অ্যান্ড্রয়েড গ্রেডল প্লাগইন 4.0-এর পরিবর্তনগুলি গ্র্যাডেলে একটি রেস কন্ডিশন ট্রিগার করতে পারে যখন &endash;&endash;no&endash;daemon এবং Gradle 6.3 বা তার নিচের সংস্করণগুলির সাথে চলছে, যার ফলে বিল্ডগুলি শেষ হওয়ার পরে হ্যাং হয়ে যায়৷

এই সমস্যাটি Gradle 6.4 এ ঠিক করা হবে।