সাধারণ কিপ নিয়ম , অতিরিক্ত কিপ নিয়মের ধরণ এবং বিশ্বব্যাপী বিকল্পগুলি ছাড়াও, আপনি আপনার অপ্টিমাইজেশনের সমস্যা সমাধানের জন্য কিছু নির্দিষ্ট নিয়ম ব্যবহার করতে পারেন।
-checkdiscard
-checkdiscard নিয়ম আপনাকে পরীক্ষা করতে দেয় যে R8 সফলভাবে এমন একটি ক্লাস বা তার সদস্য বাতিল করেছে কিনা যা আপনি অপসারণের আশা করেছিলেন। যদি নির্দিষ্ট ক্লাস বা সদস্য বাতিল না করা হয়, তাহলে বিল্ডটি ব্যর্থ হয়।
-checkdiscard এর সিনট্যাক্স নিম্নরূপ:
-checkdiscard <class_specification>
নিম্নলিখিত উদাহরণে, com.example.models.User ক্লাস থেকে userId ফিল্ড অথবা setLabel() পদ্ধতিটি ধরে রাখা হলে বিল্ডটি ব্যর্থ হয়:
-checkdiscard class com.example.models.User{
private java.lang.String userId;
public void setLabel(java.lang.String);
}
যদি ক্লাসের পদ্ধতিগুলি অন্য ক্লাসে ইনলাইন করা থাকে তবে ক্লাসের কোডটি অ্যাপে এখনও উপস্থিত থাকতে পারে। কোডটি সম্পূর্ণরূপে সরানো হয়েছে এবং কেবল ইনলাইন করা হয়নি তা নিশ্চিত করতে, -checkdiscard -keep,allowshrinking নিয়মের সাথে একত্রিত করে একটি সংশ্লিষ্ট নিয়ম যুক্ত করুন যা R8-কে টার্গেট ক্লাসে অপ্টিমাইজেশন করতে বাধা দেয়। এটি ক্লাস মার্জিং এবং ইনলাইনিংয়ের মতো অপ্টিমাইজেশনগুলিকে নিষিদ্ধ করে। যদি -checkdiscard নিয়মটি পাস হয়, তাহলে মিলিত ক্লাসগুলির কোনও বিষয়বস্তু অপ্টিমাইজ করা অ্যাপে থাকবে না।
নিম্নলিখিত উদাহরণটি এই ব্যবহারটি প্রদর্শন করে:
# Either keep or remove the class, don't rename or otherwise optimize it
-keep,allowshrinking class com.example.foo { *; }
# Verify that the class and all of its fields and methods are removed.
-checkdiscard class com.example.foo
-whyareyoukeeping
আপনার অ্যাপের বিল্ডে R8 কেন একটি নির্দিষ্ট ক্লাস, ফিল্ড বা পদ্ধতি রেখেছে তা নির্ধারণ করতে -whyareyoukeeping নিয়মটি ব্যবহার করুন। একটি আইটেম একাধিক কারণে রাখা যেতে পারে; তবে, এই নিয়মটি কেবলমাত্র সেইটি প্রদান করে যা একটি রাখা আইটেম থেকে আইটেমটিতে যাওয়ার সবচেয়ে ছোট পথ ব্যাখ্যা করে। আপনি যদি আপনার কোড থেকে এই পথটি সরিয়ে দেন, তাহলেও আপনি আইটেমটি ধরে রাখা দেখতে পাবেন কিন্তু ভিন্ন কারণে।
সম্ভাব্য কারণগুলি হল:
একটি কিপ রুল : কিপ রুল অ্যাপ, একটি কনজ্যুমড লাইব্রেরি, অথবা AAPT (অ্যান্ড্রয়েড অ্যাসেট প্যাকেজিং টুল) দ্বারা তৈরি নিয়ম থেকে হতে পারে।
সংরক্ষিত কোড বা রিসোর্স থেকে ট্রানজিটিভ রেফারেন্স : যদি কোড বা XML (যেমন লেআউট) R8 দ্বারা সংরক্ষিত থাকে, তাহলে এটি স্ট্যাটিক্যালি যা কিছু উল্লেখ করে তা সংরক্ষিত থাকে।
বাক্য গঠনটি হল:
-whyareyoukeeping <class_specification>
উদাহরণস্বরূপ:
-whyareyoukeeping class com.example.foo.MainActivity {
private void setLabel(...);
}
আউটপুট কনসোলে প্রিন্ট করা হয়।
যদি আপনার setLabel() রাখার কোন নিয়ম না থাকে, তাহলে আউটপুট হবে:
com.example.foo.MainActivity
|- is referenced in keep rule:
| /app/build/intermediates/aapt_proguard_file/release/processReleaseResources/aapt_rules.txt:4:1
Nothing is keeping void com.example.foo.MainActivity.setLabel()
যদি আপনার setLabel() টার্গেটিং করে একটি keep নিয়ম থাকে, তাহলে আউটপুটটি নিম্নলিখিতগুলির মতো হবে:
com.example.foo.MainActivity
|- is referenced in keep rule:
| /app/proguard-rules.pro:23:1
void com.example.foo.MainActivity.setLabel()
|- is referenced in keep rule:
| /app/proguard-rules.pro:23:1