অ্যান্ড্রয়েড গ্রেডল প্লাগইন ৩.৬.০ (ফেব্রুয়ারী ২০২০)

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

সর্বনিম্ন সংস্করণ ডিফল্ট সংস্করণ মন্তব্য
গ্রেডল ৫.৬.৪ ৫.৬.৪ আরও জানতে, Gradle আপডেট করা দেখুন।
SDK বিল্ড টুলস ২৮.০.৩ ২৮.০.৩ SDK বিল্ড টুল ইনস্টল বা কনফিগার করুন

৩.৬.৪ (জুলাই ২০২০)

এই ছোট আপডেটটি অ্যান্ড্রয়েড ১১-এ প্যাকেজ দৃশ্যমানতার জন্য নতুন ডিফল্ট সেটিংস এবং বৈশিষ্ট্যগুলির সাথে সামঞ্জস্যতা সমর্থন করে।

বিস্তারিত জানার জন্য 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 ট্রেস আউটপুট করতে পারে যাতে আপনি আপনার প্রোজেক্ট তৈরি করতে কতটা সময় লাগে তা আরও ভালভাবে বুঝতে পারেন। এই বিল্ড অ্যাট্রিবিউশন ফাইলটি আউটপুট করতে, নিম্নলিখিতগুলি করুন:

  1. Gradle বিল্ড চালানোর সময় -Pandroid.enableProfileJson=true ফ্ল্যাগটি যোগ করুন। উদাহরণস্বরূপ:

    gradlew assembleDebug -Pandroid.enableProfileJson=true

  2. ক্রোম ব্রাউজারটি খুলুন এবং সার্চ বারে chrome://tracing টাইপ করুন।

  3. লোড বোতামে ক্লিক করুন এবং ফাইলটি খুঁজে পেতে <var>project-root</var>/build/android-profile এ যান। ফাইলটির নাম profile-<var>timestamp</var>.json.gz

আপনি ভিউয়ারের উপরের দিকে নেটিভ বিল্ড অ্যাট্রিবিউশন ডেটা দেখতে পাবেন:

Chrome-এ নেটিভ বিল্ড অ্যাট্রিবিউশন ট্রেস

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

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

ডিফল্টরূপে আনকম্প্রেসড নেটিভ লাইব্রেরি প্যাকেজ করা হয়েছে

যখন আপনি আপনার অ্যাপ তৈরি করেন, তখন প্লাগইনটি এখন extractNativeLibs ডিফল্টরূপে "false" এ সেট করে। অর্থাৎ, আপনার নেটিভ লাইব্রেরিগুলি পৃষ্ঠা সারিবদ্ধ এবং আনকম্প্রেসড প্যাকেজ করা হয়। যদিও এর ফলে আপলোডের আকার বড় হয়, আপনার ব্যবহারকারীরা নিম্নলিখিত সুবিধাগুলি থেকে উপকৃত হন:

  • অ্যাপ ইনস্টলের আকার ছোট কারণ প্ল্যাটফর্মটি লাইব্রেরির একটি কপি তৈরি না করেই ইনস্টল করা APK থেকে সরাসরি নেটিভ লাইব্রেরিগুলি অ্যাক্সেস করতে পারে।
  • আপনার APK বা অ্যান্ড্রয়েড অ্যাপ বান্ডেলে আনকম্প্রেসড নেটিভ লাইব্রেরি অন্তর্ভুক্ত করলে প্লে স্টোর কম্প্রেশন সাধারণত ভালো হয় বলে ডাউনলোডের আকার ছোট।

যদি আপনি চান যে Android Gradle প্লাগইনটি কম্প্রেসড নেটিভ লাইব্রেরি প্যাকেজ করুক, তাহলে আপনার অ্যাপের ম্যানিফেস্টে নিম্নলিখিতগুলি অন্তর্ভুক্ত করুন:

        <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 নির্ভরতা কনফিগারেশন ব্যবহার করে। আরও জানতে, নির্ভরতা কনফিগারেশন সম্পর্কে পড়ুন।

ডিফল্ট কনফিগারেশন থেকে অনুপস্থিত সম্পদগুলি সরান

লাইব্রেরি মডিউলের ক্ষেত্রে, যদি আপনি এমন একটি ভাষার জন্য একটি রিসোর্স অন্তর্ভুক্ত করেন যা আপনি ডিফল্ট রিসোর্স সেটে অন্তর্ভুক্ত করেন না—উদাহরণস্বরূপ, যদি আপনি /values-es/strings.xmlhello_world স্ট্রিং রিসোর্স হিসেবে অন্তর্ভুক্ত করেন কিন্তু /values/strings.xml এ সেই রিসোর্সটি সংজ্ঞায়িত না করেন—তাহলে আপনার প্রকল্পটি কম্পাইল করার সময় Android Gradle প্লাগইনটি আর সেই রিসোর্সটি অন্তর্ভুক্ত করবে না। এই আচরণ পরিবর্তনের ফলে Resource Not Found রানটাইম ব্যতিক্রম কম হবে এবং বিল্ড গতি উন্নত হবে।

D8 এখন টীকাগুলির জন্য CLASS ধরে রাখার নীতি মেনে চলে

আপনার অ্যাপ কম্পাইল করার সময়, D8 এখন অ্যানোটেশনগুলি যখন CLASS রিটেনশন নীতি প্রয়োগ করে তখন তা মেনে চলে এবং রানটাইমে সেই অ্যানোটেশনগুলি আর উপলব্ধ থাকে না। অ্যাপের টার্গেট SDK কে API লেভেল 23 এ সেট করার সময়ও এই আচরণ বিদ্যমান, যা পূর্বে Android Gradle প্লাগইন এবং D8 এর পুরানো সংস্করণ ব্যবহার করে আপনার অ্যাপ কম্পাইল করার সময় রানটাইম চলাকালীন এই অ্যানোটেশনগুলিতে অ্যাক্সেসের অনুমতি দেয়।

অন্যান্য আচরণগত পরিবর্তন

  • aaptOptions.noCompress আর সকল প্ল্যাটফর্মে (APK এবং বান্ডেল উভয়ের জন্য) কেস সংবেদনশীল নয় এবং বড় হাতের অক্ষর ব্যবহার করে এমন পাথগুলিকে সম্মান করে।
  • ডেটা বাইন্ডিং এখন ডিফল্টরূপে ক্রমবর্ধমান। আরও জানতে, সংখ্যা #110061530 দেখুন।

  • রোবোইলেকট্রিক ইউনিট পরীক্ষা সহ সকল ইউনিট পরীক্ষা এখন সম্পূর্ণরূপে ক্যাশেযোগ্য। আরও জানতে, সংখ্যা #115873047 দেখুন।

বাগ সংশোধন

অ্যান্ড্রয়েড গ্রেডল প্লাগইনের এই সংস্করণে নিম্নলিখিত বাগ সংশোধনগুলি অন্তর্ভুক্ত রয়েছে:

  • রোবোলেক্ট্রিক ইউনিট পরীক্ষা এখন লাইব্রেরি মডিউলগুলিতে সমর্থিত যা ডেটা বাইন্ডিং ব্যবহার করে। আরও জানতে, সংখ্যা #126775542 দেখুন।
  • Gradle-এর প্যারালাল এক্সিকিউশন মোড সক্রিয় থাকাকালীন আপনি এখন একাধিক মডিউল জুড়ে connectedAndroidTest টাস্ক চালাতে পারবেন।

জ্ঞাত সমস্যা

এই বিভাগটি Android Gradle প্লাগইন 3.6.0-এ বিদ্যমান জ্ঞাত সমস্যাগুলি বর্ণনা করে।

অ্যান্ড্রয়েড লিন্ট টাস্কের ধীর কর্মক্ষমতা

অ্যান্ড্রয়েড লিন্টের পার্সিং অবকাঠামোতে রিগ্রেশনের কারণে কিছু প্রকল্প সম্পূর্ণ করতে অনেক বেশি সময় লাগতে পারে, যার ফলে নির্দিষ্ট কোড কনস্ট্রাক্টে ল্যাম্বডাসের জন্য অনুমানকৃত ধরণের গণনা ধীর হয়ে যায়।

IDEA-তে সমস্যাটি একটি বাগ হিসেবে রিপোর্ট করা হয়েছে এবং Android Gradle Plugin 4.0-এ এটি ঠিক করা হবে।

ম্যানিফেস্ট ক্লাস অনুপস্থিত {:#agp-missing-manifest}

যদি আপনার অ্যাপটি তার ম্যানিফেস্টে কাস্টম অনুমতি সংজ্ঞায়িত করে, তাহলে Android Gradle প্লাগইন সাধারণত একটি Manifest.java ক্লাস তৈরি করে যা আপনার কাস্টম অনুমতিগুলিকে স্ট্রিং ধ্রুবক হিসাবে অন্তর্ভুক্ত করে। প্লাগইনটি এই ক্লাসটিকে আপনার অ্যাপের সাথে প্যাকেজ করে, যাতে আপনি রানটাইমে আরও সহজেই সেই অনুমতিগুলি উল্লেখ করতে পারেন।

Android Gradle প্লাগইন 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";
                  }
                }