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

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

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

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

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

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

-repackageclasses
-allowaccessmodification

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

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

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

গুণাবলী রাখুন

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

কিছু প্রতিফলিত অপারেশন সফল সম্পাদনের জন্য নির্দিষ্ট বৈশিষ্ট্য রাখা প্রয়োজন. যেমন:

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

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

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

বৈশিষ্ট্য বর্ণনা
AnnotationDefault এই বৈশিষ্ট্যটি টীকা প্রকারে পাওয়া যায় এবং একটি টীকা উপাদানের জন্য ডিফল্ট মান সংরক্ষণ করে।

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

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

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

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

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

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

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

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

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

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

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

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