বিশ্বব্যাপী বিকল্প যোগ করুন

R8 কিছু গ্লোবাল অপশন প্রদান করে যা অ্যাপ জুড়ে R8-এর অপটিমাইজেশন পরিবর্তন করে অথবা প্রতিটি কিপ রুলকে প্রভাবিত করে। এই অপশনগুলো কিপ রুলগুলোর সাথে proguard-rules.pro ফাইলে রক্ষণাবেক্ষণ করা হয়। এই গ্লোবাল অপশনগুলোর মধ্যে কয়েকটি অতিরিক্ত অপটিমাইজেশন কনফিগার করে, আবার অন্যগুলো অপটিমাইজেশনের নির্দিষ্ট কিছু দিক বন্ধ করে দেয়।

R8, ProGuard থেকে চলে আসা কিছু লিগ্যাসি অপশন গ্রহণ করলেও সেগুলোকে উপেক্ষা করে। আরও তথ্যের জন্য, “Remove legacy ProGuard options” দেখুন।

অতিরিক্ত অপ্টিমাইজেশনের জন্য বৈশ্বিক বিকল্প

নিম্নলিখিত গ্লোবাল অপশনগুলো অতিরিক্ত অপ্টিমাইজেশন সক্ষম করে:

  • -repackageclasses [<optional-package-name>] : অ্যাপের আকার কমাতে ক্লাসগুলোকে একটিমাত্র প্যাকেজে পুনরায় প্যাকেজ করে। আপনি যদি ঐচ্ছিক প্যাকেজের নাম সরবরাহ না করেন, তাহলে ক্লাসগুলো নামবিহীন (ডিফল্ট) প্যাকেজে স্থানান্তরিত হয়। অ্যাপের জন্য এটিই প্রস্তাবিত সেটিং, কারণ এটি ক্লাসের নাম থেকে প্যাকেজ প্রিফিক্স বাদ দিয়ে ছোট DEX ফাইল তৈরি করে। অ্যান্ড্রয়েড গ্রেডল প্লাগইন (AGP) 9.1 থেকে, এটি অ্যাপের জন্য ডিফল্ট কনফিগারেশন। এই অপ্টিমাইজেশনটি বাদ দিতে, -dontrepackage ব্যবহার করুন।
  • -allowaccessmodification : আরও ব্যাপক অপ্টিমাইজেশন করার জন্য R8-কে ক্লাস, ফিল্ড এবং মেথডের ভিজিবিলিটি পরিবর্তন (সাধারণত প্রসারিত) করার অনুমতি দেয়। proguard-android-optimize.txt ব্যবহার করা হলে এটি সক্রিয় হয়। অ্যান্ড্রয়েড গ্রেডল প্লাগইন (AGP) 8.2 থেকে, আপনি যদি R8-এর সাথে সম্পূর্ণ অপ্টিমাইজেশন সক্রিয় করেন, তবে এটিই ডিফল্ট কনফিগারেশন।
  • -processkotlinnullchecks [level] : R8-কে Kotlin Intrinsics-এর নাল চেক পরিবর্তন করার সুযোগ দেয়, যার মাধ্যমে হয় শুধু ত্রুটির বার্তাটি মুছে ফেলা হবে অথবা সুস্পষ্ট নাল চেকটি সম্পূর্ণরূপে সরিয়ে দেওয়া হবে।

    দুর্বলতম থেকে শক্তিশালীতম পর্যন্ত ক্রমানুসারে সাজানো level মানগুলোর নিম্নলিখিত প্রভাব রয়েছে:

    • keep চেকগুলো পরিবর্তন করে না।
    • remove_message প্রতিটি চেক মেথড কলকে তার প্রথম আর্গুমেন্টের উপর getClass() কলে পরিবর্তন করে (কার্যত নাল চেকটি বজায় রাখে, কিন্তু কোনো মেসেজ ছাড়াই)।
    • remove বিকল্পটি চেকগুলো সম্পূর্ণরূপে মুছে দেয়।

    ডিফল্টরূপে R8 remove_message ব্যবহার করে। -processkotlinnullchecks নির্দিষ্ট করলে তা এটিকে বাতিল করে দেয়। একাধিকবার নির্দিষ্ট করা হলে সবচেয়ে শক্তিশালী মানটি ব্যবহৃত হয়।

    -processkotlinnullchecks বিকল্পটি AGP 9.0.0 থেকে সমর্থিত।

নিম্নলিখিতটি অতিরিক্ত অপ্টিমাইজেশন সক্রিয় করা একটি কনফিগারেশনের উদাহরণ:

-repackageclasses
-allowaccessmodification

অপ্টিমাইজেশন সীমিত করার জন্য বৈশ্বিক বিকল্পগুলি

নিম্নলিখিত গ্লোবাল অপশনগুলো আপনাকে অ্যাপ অপটিমাইজেশনের নির্দিষ্ট কিছু দিক বন্ধ করার সুযোগ দেয়, এবং এগুলো আপনার কিপ রুলগুলো পরিমার্জন করার সময় বা প্রথমবারের মতো R8 চালু করার সময় সহায়ক হয়।

  • -dontoptimize : কোড অপটিমাইজেশন প্রতিরোধ করে, যেমন মেথড ইনলাইনিং। এই অপশনটি ডেভেলপমেন্টের সময় ব্যবহার করা যেতে পারে, কিন্তু প্রোডাকশন বিল্ডে ব্যবহার করা উচিত নয়।
  • -dontshrink : অপ্রয়োজনীয় কোড এবং কোড অপটিমাইজেশন অপসারণ প্রতিরোধ করে। এই অপশনটি ডেভেলপমেন্ট পর্যায়ে ব্যবহার করা যেতে পারে, কিন্তু প্রোডাকশন বিল্ডে ব্যবহার করা উচিত নয়।
  • -dontobfuscate : ক্লাস এবং মেথডের নাম সংক্ষিপ্ত হওয়া প্রতিরোধ করে। ডিবাগিংয়ের সময় অবফাসকেশন বন্ধ রাখা বিশেষভাবে সহায়ক হতে পারে, ফলে স্ট্যাক ট্রেস পড়া সহজ হয়। এই অপশনটি ডেভেলপমেন্টের সময় ব্যবহার করা যেতে পারে, কিন্তু প্রোডাকশন বিল্ডে ব্যবহার করা উচিত নয়।
  • -keepattributes <attributes> : যে অ্যাট্রিবিউটগুলো সংরক্ষণ করা উচিত, সেগুলোর একটি কমা-দ্বারা-বিভক্ত তালিকা গ্রহণ করে। আপনি যদি ডিফল্ট proguard-android-optimize.txt ব্যবহার না করেন, তাহলে R8 RuntimeVisibleAnnotations এবং Signature সহ সমস্ত অ্যাট্রিবিউট মুছে ফেলে। তবে, রিফ্লেকশনের মতো ক্ষেত্রে প্রয়োজন হলে এই অ্যাট্রিবিউটগুলো সংরক্ষণ করা সহায়ক হতে পারে। আপনি যে অ্যাট্রিবিউটগুলো নির্দিষ্ট করতে পারেন তার তালিকার জন্য, Keep attributes দেখুন।

বৈশিষ্ট্যগুলি রাখুন

অ্যাট্রিবিউট হলো আপনার কোডের বিভিন্ন অংশের সাথে সংযুক্ত অতিরিক্ত তথ্য। অ্যাট্রিবিউট আপনার কোডের অ্যানোটেশন এবং জেনেরিক সিগনেচারের মতো তথ্য সংরক্ষণ করে।

কিছু রিফ্লেক্টিভ অপারেশনের সফল সম্পাদনের জন্য নির্দিষ্ট অ্যাট্রিবিউট বজায় রাখা প্রয়োজন। উদাহরণস্বরূপ:

  • getEnclosingMethod() বা getDeclaredClasses() ব্যবহার করে ইনার বা আউটার ক্লাসের কাঠামো অ্যাক্সেস করার সময় EnclosingMethod এবং InnerClasses অ্যাট্রিবিউটগুলোর প্রয়োজন হয়।
  • getTypeParameters() ব্যবহার করে জেনেরিক সিগনেচার অ্যাক্সেস করার সময় Signature অ্যাট্রিবিউটটি প্রয়োজন হয়।
  • getAnnotation() ব্যবহার করে অ্যানোটেশন অ্যাক্সেস করার সময় RuntimeVisibleAnnotations অ্যাট্রিবিউটটি প্রয়োজন হয়।

সাধারণত প্রয়োজনীয় বৈশিষ্ট্য

ডিফল্ট Proguard ফাইল ( proguard-android-optimize.txt বা proguard-android.txt ) ব্যবহার করার সময়, Android Gradle প্লাগইন (AGP) নিম্নলিখিত অ্যাট্রিবিউটগুলো রাখে। উল্লেখ্য যে, এই অ্যাট্রিবিউটগুলোর কয়েকটির জন্য AGP-এর নতুন সংস্করণ প্রয়োজন:

বৈশিষ্ট্য বর্ণনা
AnnotationDefault এই অ্যাট্রিবিউটটি অ্যানোটেশন টাইপগুলোর মধ্যেই থাকে এবং এটি একটি অ্যানোটেশন এলিমেন্টের ডিফল্ট মান সংরক্ষণ করে।

দ্রষ্টব্য: AGP 7.1 থেকে এই অ্যাট্রিবিউটটি ডিফল্টরূপে রাখা হয় এবং শুধুমাত্র AGP-এর পূর্ববর্তী সংস্করণ ব্যবহারকারী অ্যাপগুলিতে এটি স্পষ্টভাবে রাখার প্রয়োজন হয়।
EnclosingMethod এই অ্যাট্রিবিউটটি সেইসব ইনার ক্লাসে উপস্থিত থাকে যেগুলো লোকাল বা অ্যানোনিমাস ক্লাস নয়। এটি সেই মেথড বা ইনিশিয়ালাইজারকে শনাক্ত করে, যা সরাসরি ক্লাসটিকে ধারণ করে।
InnerClasses এই অ্যাট্রিবিউটটি অন্য কোনো ক্লাসের মধ্যে সংজ্ঞায়িত নেস্টেড ক্লাস (যেমন—ইনার ক্লাস, স্ট্যাটিক নেস্টেড ক্লাস, লোকাল ক্লাস এবং অ্যানোনিমাস ক্লাস) সম্পর্কিত তথ্য সংরক্ষণ করে।
LineNumberTable এই অ্যাট্রিবিউটটি বাইটকোড নির্দেশাবলীকে মূল উৎস ফাইলের সংশ্লিষ্ট লাইন নম্বরের সাথে সংযুক্ত করে।

দ্রষ্টব্য: অ্যান্ড্রয়েড গ্রেডল প্লাগইন (AGP) ৮.৬ থেকে এই অ্যাট্রিবিউটটি ডিফল্টরূপে রাখা হয় এবং শুধুমাত্র AGP-এর পূর্ববর্তী সংস্করণ ব্যবহারকারী অ্যাপগুলিতে এটি স্পষ্টভাবে রাখার প্রয়োজন হয়।
RuntimeVisibleAnnotations এই অ্যাট্রিবিউটটি এমন অ্যানোটেশনগুলো সংরক্ষণ করে যা রিফ্লেকশনের মাধ্যমে রানটাইমে দৃশ্যমান হয়।

সাধারণত, রানটাইমে অ্যানোটেশন ব্যবহার করা হলে, *Annotation অ্যাট্রিবিউটগুলো থেকে শুধুমাত্র এই অ্যানোটেশনটিই অ্যাপ এবং লাইব্রেরি কনজিউমার রুলগুলোর জন্য প্রয়োজন হয়।
RuntimeVisibleParameterAnnotations এই অ্যাট্রিবিউটটি এমন অ্যানোটেশন সংরক্ষণ করে যা কোনো মেথডের প্যারামিটারগুলোর ওপর রিফ্লেকশনের মাধ্যমে রানটাইমে দৃশ্যমান হয়।
RuntimeVisibleTypeAnnotations এই অ্যাট্রিবিউটটি এমন অ্যানোটেশন সংরক্ষণ করে যা শুধু ডিক্লারেশনের ক্ষেত্রেই নয়, টাইপের ব্যবহারের ক্ষেত্রেও প্রযোজ্য। এই অ্যাট্রিবিউটটি রানটাইমে দৃশ্যমান হয়।
Signature এই অ্যাট্রিবিউটটি ক্লাস, মেথড এবং ফিল্ডের জন্য একটি আরও জেনেরিক টাইপ সিগনেচার সংরক্ষণ করে, বিশেষ করে যখন সেগুলোতে জেনেরিক ব্যবহার করা হয় (যেমন List<String> )।
SourceFile এই অ্যাট্রিবিউটটি সেই সোর্স ফাইলের ( .kt বা .java ফাইল) নাম সংরক্ষণ করে, যেখান থেকে একটি ক্লাস কম্পাইল করা হয়েছিল। কম্পাইল করা জাভা কোড স্টেপ-বাই-স্টেপ চালানোর সময় মূল সোর্স কোডের লাইনগুলো দেখানোর জন্য ডিবাগার এটি প্রধানত ব্যবহার করে। এটি ডেভেলপারদের তাদের লেখা কোড পর্যন্ত এক্সিকিউশন ট্রেস করতে সাহায্য করে।

দ্রষ্টব্য: AGP 8.2 থেকে এই অ্যাট্রিবিউটটি ডিফল্টরূপে রাখা হয় এবং শুধুমাত্র AGP-এর পূর্ববর্তী সংস্করণ ব্যবহারকারী অ্যাপগুলিতে এটি স্পষ্টভাবে রাখার প্রয়োজন হয়।

যেসব অ্যাপ proguard-android-optimize.txt ব্যবহার করে, তাদের জন্য AGP দ্বারা সংজ্ঞায়িত keep rules বেশিরভাগ ক্ষেত্রেই যথেষ্ট। তবে, আপনি যদি কোনো লাইব্রেরির জন্য কোড লেখেন, তাহলে আপনার লাইব্রেরির কনজিউমার keep rules- এ সেই লাইব্রেরির জন্য প্রয়োজনীয় সমস্ত অ্যাট্রিবিউট উল্লেখ করা উচিত, এমনকি যদি সেগুলি এই তালিকায় সংজ্ঞায়িত করা থাকে। এটি নিশ্চিত করে যে, যদি ডেভেলপাররা proguard-android-optimize.txt অন্তর্ভুক্ত না করার সিদ্ধান্ত নেয়, তাহলেও আপনার লাইব্রেরিটি সুরক্ষিত থাকবে।

অতিরিক্ত রাখার বৈশিষ্ট্য

আপনি রাখার জন্য অতিরিক্ত অ্যাট্রিবিউট নির্দিষ্ট করতে পারেন, তবে বেশিরভাগ রিফ্লেক্টিভ বা JNI অ্যাক্সেস পরিস্থিতিতে সেগুলোর প্রয়োজন হয় না। তবে, লাইব্রেরি অপ্টিমাইজ করার সময় এর মধ্যে কয়েকটি প্রায়শই ব্যবহৃত হতে পারে।

বৈশিষ্ট্য বর্ণনা
MethodParameters এই অ্যাট্রিবিউটটি একটি মেথডের প্যারামিটারগুলো সম্পর্কে তথ্য প্রদান করে, বিশেষত তাদের নাম এবং অ্যাক্সেস ফ্ল্যাগ।
Exceptions এই অ্যাট্রিবিউটটি সেইসব চেক্ট এক্সেপশনের তালিকা করে, যেগুলো একটি মেথড থ্রো করার জন্য ডিক্লেয়ার করা হয়েছে।

এই অ্যাট্রিবিউটটি সাধারণত অ্যাপের জন্য ব্যবহৃত হয় না। লাইব্রেরি লেখকদের জন্য, এটি সাধারণত কনজিউমার কিপ রুলসে ব্যবহৃত হয় না, তবে লাইব্রেরি তৈরির সময় প্রায়শই ব্যবহৃত হয়। লাইব্রেরি অপ্টিমাইজ করার বিষয়ে বিস্তারিত জানতে, লাইব্রেরি লেখকদের জন্য অপ্টিমাইজেশন দেখুন।
RuntimeInvisibleAnnotations এই অ্যাট্রিবিউটটি এমন অ্যানোটেশনসমূহ সংরক্ষণ করে যা রানটাইমে রিফ্লেকশনের মাধ্যমে কোনো ক্লাস, ফিল্ড বা মেথডে দেখা যায় না।

অ্যাপ ডেভেলপারদের এই অ্যাট্রিবিউটটি রাখা উচিত নয়। লাইব্রেরি লেখকদের জন্য, কনজিউমার কিপ রুলস-এ এই অ্যাট্রিবিউটটি প্রাসঙ্গিক নয়, কিন্তু লাইব্রেরি তৈরির সময় এটি প্রায়শই ব্যবহৃত হয়। লাইব্রেরি অপ্টিমাইজ করার বিষয়ে বিস্তারিত জানতে, লাইব্রেরি লেখকদের জন্য অপ্টিমাইজেশন দেখুন।
RuntimeInvisibleParameterAnnotations এই অ্যাট্রিবিউটটি কোনো মেথডের প্যারামিটারগুলোর উপর এমন অ্যানোটেশন সংরক্ষণ করে, যা রানটাইমে রিফ্লেকশনের মাধ্যমে দৃশ্যমান হয় না।

অ্যাপ ডেভেলপারদের এই অ্যাট্রিবিউটটি রাখা উচিত নয়। লাইব্রেরি লেখকদের জন্য, কনজিউমার কিপ রুলস-এ এই অ্যাট্রিবিউটটি প্রাসঙ্গিক নয়, কিন্তু লাইব্রেরি তৈরির সময় এটি প্রায়শই ব্যবহৃত হয়। লাইব্রেরি অপ্টিমাইজ করার বিষয়ে বিস্তারিত জানতে, লাইব্রেরি লেখকদের জন্য অপ্টিমাইজেশন দেখুন।
RuntimeInvisibleTypeAnnotations এই অ্যাট্রিবিউটটি এমন অ্যানোটেশন সংরক্ষণ করে যা শুধু ডিক্লারেশনের ক্ষেত্রেই নয়, টাইপের ব্যবহারের ক্ষেত্রেও প্রযোজ্য। এই অ্যাট্রিবিউটটি রানটাইমে দৃশ্যমান হয় না।

অ্যাপ ডেভেলপারদের এই অ্যাট্রিবিউটটি রাখা উচিত নয়। লাইব্রেরি লেখকদের জন্য, কনজিউমার কিপ রুলস-এ এই অ্যাট্রিবিউটটি প্রাসঙ্গিক নয়, কিন্তু লাইব্রেরি তৈরির সময় এটি প্রায়শই ব্যবহৃত হয়। লাইব্রেরি অপ্টিমাইজ করার বিষয়ে বিস্তারিত জানতে, লাইব্রেরি লেখকদের জন্য অপ্টিমাইজেশন দেখুন।

পুরোনো ProGuard বিকল্পগুলি সরান

R8 এমন কিছু অপশন গ্রহণ করে যা শুধুমাত্র ProGuard-এ কার্যকর ছিল, কিন্তু R8 সেগুলোকে উপেক্ষা করে। এই অপশনগুলো প্রায়শই সেইসব কনফিগারেশনে থেকে যায় যেগুলো ProGuard থেকে মাইগ্রেট করা হয়েছে বা পুরোনো প্রজেক্ট থেকে কপি করা হয়েছে। যেহেতু R8 আউটপুটের উপর এগুলোর কোনো প্রভাব নেই, তাই আপনার কনফিগারেশনকে সহজে বোঝা ও রক্ষণাবেক্ষণযোগ্য রাখতে এগুলো আপনার proguard-rules.pro ফাইল থেকে সরিয়ে ফেলুন।

R8 কোনো সতর্কবার্তা না জানিয়ে নিম্নলিখিত অপশনগুলো উপেক্ষা করে:

  • -adaptkotlinmetadata
  • -android
  • -dontpreverify
  • -dontskipnonpubliclibraryclasses
  • -dontskipnonpubliclibraryclassmembers
  • -dontusemixedcaseclassnames
  • -forceprocessing
  • -mergeinterfacesaggressively
  • -optimizationpasses
  • -optimizations
  • -overloadaggressively
  • -target
  • -verbose

বিল্ড চলাকালীন R8 নিম্নলিখিত অপশনগুলো উপেক্ষা করে এবং একটি সতর্কবার্তা দেখায়:

R8 ' -skipnonpubliclibraryclasses সমর্থন করে না এবং আপনার কনফিগারেশনে এটি থাকলে একটি ত্রুটি দেখায়।