সেরা অনুশীলন অনুসরণ করুন

কিপ রুলস নিয়ে কাজ করার সময়, আপনার অ্যাপের আচরণ বজায় রেখে সুবিধাগুলি নিশ্চিত করার জন্য সঠিক পরিমাণে নির্দিষ্টতা অর্জন করা গুরুত্বপূর্ণ। কিপ রুলসের ক্ষেত্রে ভালো প্যাটার্ন এবং এড়িয়ে চলার বিষয়গুলি সম্পর্কে জানতে নিম্নলিখিত বিভাগগুলি দেখুন।

রাখার নিয়মে ভালো প্যাটার্ন

সুনির্দিষ্টভাবে সংজ্ঞায়িত রাখা নিয়মগুলি যথাসম্ভব সুনির্দিষ্ট এবং নিম্নলিখিত ধরণগুলি মেনে চলে:

  • ক্লাস স্পেসিফিকেশনের জন্য, সম্ভব হলে সর্বদা একটি নির্দিষ্ট ক্লাস, বেস ক্লাস, অথবা অ্যানোটেটেড ক্লাস নির্দিষ্ট করুন, যেমনটি নিম্নলিখিত উদাহরণগুলিতে দেখানো হয়েছে:

    -keepclassmembers class com.example.MyClass {
      void someSpecificMethod();
    }
    
    -keepclassmembers ** extends com.example.MyBaseClass {
      void someSpecificMethod();
    }
    
    -keepclassmembers @com.example.MyAnnotation class ** {
      void someSpecificMethod();
    }
    
  • যখনই সম্ভব, আপনার সোর্স কোডে টীকা ব্যবহার করুন এবং তারপর সেই টীকাগুলিকে সরাসরি আপনার কিপ রুলে টার্গেট করুন। এটি আপনার কোড এবং এটি সংরক্ষণকারী নিয়মগুলির মধ্যে একটি স্পষ্ট, স্পষ্ট লিঙ্ক তৈরি করে, যা আপনার কনফিগারেশনকে আরও শক্তিশালী, বোঝা সহজ করে তোলে এবং কোড পরিবর্তনের সময় ভাঙনের ঝুঁকি কম করে।

    উদাহরণস্বরূপ, নিম্নলিখিত স্নিপেটটি দেখায় যে আপনি কীভাবে MyClass ক্লাসটি রাখতে পারেন, সেইসাথে অন্যান্য ক্লাসগুলিও যা @com.example.DisplayComponent দিয়ে টীকাযুক্ত:

    // In the source code
    @com.example.DisplayComponent
    class MyClass { /* ... */ }
    
    // In the keep rules
    -keep @com.example.DisplayComponent class * {*;}
    

    আমরা আপনার টীকাগুলির নামকরণ এমনভাবে করার পরামর্শ দিচ্ছি যাতে কোডের অংশগুলি কেন সংরক্ষণ করা হয় তার অর্থপূর্ণ প্রেক্ষাপট প্রদান করে। উদাহরণস্বরূপ, এমন একটি অ্যাপের জন্য @DisplayComponent ব্যবহার করুন যেখানে ডিসপ্লে উপাদানগুলির কিছু অংশ রাখা প্রয়োজন।

  • যখনই সম্ভব, সদস্যের স্পেসিফিকেশন ঘোষণা করা উচিত, এবং শুধুমাত্র ক্লাসের সেই অংশগুলি উল্লেখ করা উচিত যা অ্যাপটি কাজ করার জন্য রাখতে হবে। ঐচ্ছিক সদস্য সুযোগকে { *; } হিসাবে সংজ্ঞায়িত করে সম্পূর্ণ ক্লাসে কোনও নিয়ম প্রয়োগ না করার পরামর্শ দেওয়া হচ্ছে যদি না কঠোরভাবে প্রয়োজন হয়।

    -keepclassmembers com.example.MyClass {
      void someSpecificMethod();
      void @com.example.MyAnnotation *;
    }
    
  • যদি আপনি repackageclasses global বিকল্পটি ব্যবহার করেন, তাহলে ঐচ্ছিক প্যাকেজের নাম উল্লেখ করা এড়িয়ে চলুন। এর ফলে DEX ফাইলগুলি ছোট হয় কারণ প্যাকেজ প্রিফিক্সটি পুনঃপ্যাকেজ করা ক্লাসের নামগুলিতে বাদ দেওয়া হয়।

  • প্রতিফলন দ্বারা অ্যাক্সেস করা সমস্ত আইটেমের জন্য Keep নিয়ম বজায় রাখুন। এমনকি যদি এই জাতীয় আইটেমগুলি স্পষ্ট Keep নিয়ম ছাড়াই R8 দ্বারা ধরে রাখা হয়, প্রকৃত নিয়মগুলি বজায় রাখা অত্যন্ত গুরুত্বপূর্ণ কারণ ভবিষ্যতে কোড পরিবর্তনের ফলে R8 আর এই আইটেমগুলি ধরে রাখতে পারবে না।

যদি আপনি এই নির্দেশিকাগুলি মেনে চলতে না পারেন, তাহলে আপনি একটি ডেডিকেটেড প্যাকেজে রাখা প্রয়োজন এমন কোডটি অস্থায়ীভাবে আলাদা করে প্যাকেজে আপনার কিপ রুল প্রয়োগ করতে পারেন। তবে, এটি দীর্ঘমেয়াদী সমাধান নয়। আরও জানতে, অ্যাডপ্ট অপ্টিমাইজেশন ইনক্রিমেন্টাললি দেখুন। প্যাকেজের জন্য কিপ রুল ব্যবহার করতে নিম্নলিখিত উদাহরণে দেখানো একটি কিপ রুল সংজ্ঞায়িত করুন:

-keepclassmembers class com.example.pkg.** { *; }

এড়িয়ে চলার বিষয়গুলি

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

  • প্যাকেজ-ব্যাপী কিপ নিয়ম যেমন -keep class com.example.pkg.** { *; } দীর্ঘমেয়াদী ব্যবহার করবেন না। R8 কনফিগার করার সময় সমস্যা সমাধানের জন্য এগুলি অস্থায়ীভাবে ব্যবহার করা যেতে পারে। আরও তথ্যের জন্য, Limit the optimization scope দেখুন। সাধারণভাবে, ওয়াইল্ডকার্ড ব্যবহারে সতর্ক থাকুন— নিশ্চিত করুন যে আপনি কেবল সেই কোডটিই রাখছেন যা আপনার প্রয়োজন।
  • যখন সম্ভব, এমন লাইব্রেরি এড়িয়ে চলুন যেগুলি ব্যবহারের সময় "keep" নিয়মগুলি কপি এবং পেস্ট করার পরামর্শ দেয়, বিশেষ করে প্যাকেজ-ব্যাপী "keep" নিয়মগুলি। অ্যান্ড্রয়েডে ভাল পারফর্ম করার জন্য ডিজাইন করা লাইব্রেরিগুলি যেখানে সম্ভব প্রতিফলন এড়াতে হবে এবং প্রয়োজনে "consumer keep" নিয়মগুলি এম্বেড করতে হবে
  • Keep নিয়মে ইনভারশন অপারেটর ! ব্যবহার করা এড়িয়ে চলুন কারণ আপনি অনিচ্ছাকৃতভাবে আপনার অ্যাপ্লিকেশনের প্রায় প্রতিটি ক্লাসে একটি নিয়ম প্রয়োগ করতে পারেন।

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