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

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

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

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

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

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

-repackageclasses
-allowaccessmodification

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

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

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

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

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

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

  • 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 এই বৈশিষ্ট্যটি মূল উৎস ফাইলে বাইটকোড নির্দেশাবলীকে তাদের সংশ্লিষ্ট লাইন নম্বরের সাথে ম্যাপ করে।

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

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

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

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

অতিরিক্ত কিপ অ্যাট্রিবিউট

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

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

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

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

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

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