কিপ রুল নিয়ে কাজ করার সময়, আপনার অ্যাপের আচরণ বজায় রেখে যাতে আপনি সুবিধা পান তা নিশ্চিত করতে সঠিক পরিমাণে নির্দিষ্টতা অর্জন করা গুরুত্বপূর্ণ। 'রাখার নিয়ম' সংক্রান্ত ভাল প্যাটার্ন এবং কোন কোন জিনিস এড়িয়ে চলতে হবে সেই সম্পর্কে জানতে নিচের বিভাগগুলি দেখুন।
রাখার নিয়মে ভালো প্যাটার্ন
ভালভাবে সংজ্ঞায়িত 'কীপ' সংক্রান্ত নিয়ম যতটা সম্ভব নির্দিষ্ট হয় এবং নিম্নলিখিত প্যাটার্ন মেনে চলে:
ক্লাস স্পেসিফিকেশনের জন্য, নিম্নলিখিত উদাহরণে দেখানো হয়েছে সেইভাবে, সম্ভব হলে সবসময় একটি নির্দিষ্ট ক্লাস, বেস ক্লাস বা অ্যানোটেটেড ক্লাস নির্দিষ্ট করুন:
-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গ্লোবাল বিকল্প ব্যবহার করলে, ঐচ্ছিক প্যাকেজের নাম উল্লেখ করা এড়িয়ে চলুন। এর ফলে ছোট DEX ফাইল তৈরি হয় কারণ প্যাকেজ প্রিফিক্স রিপ্যাকেজ করা ক্লাসের নামে বাদ দেওয়া হয়।রিফ্লেকশনের মাধ্যমে অ্যাক্সেস করা সব আইটেমের জন্য রাখার নিয়ম বজায় রাখুন। এমনকি যদি এই ধরনের আইটেম R8 দ্বারা স্পষ্টভাবে রাখার নিয়ম ছাড়াই ধরে রাখা হয়, তবে প্রকৃত নিয়মগুলি বজায় রাখা গুরুত্বপূর্ণ কারণ ভবিষ্যতের কোড পরিবর্তনগুলি R8-কে আর এই আইটেমগুলি ধরে রাখতে না দিতে পারে।
আপনার নিজের কোডে রিফ্লেকশনের জন্য, আপনি Jetpack Keep ব্যবহার করে সহজে ম্যানেজ করা যায় এমন Keep সংক্রান্ত নিয়ম তৈরি করতে পারেন। প্রতিটি অ্যানোটেশন সেই কোডে থাকে যা রিফ্লেকশন পারফর্ম করে, তাই আপনি সেই কোড পরিবর্তন করলে, একই জায়গায় এর অ্যানোটেশন আপডেট বা সরিয়ে দেন। এইভাবে, নিয়মগুলি এমন কোড সংরক্ষণ করে না যা আপনার অ্যাপ আর দেখায় না। এছাড়াও, Lint অ্যানোটেট করা হয়নি এমন রিফ্লেক্টিভ কল ফ্ল্যাগ করে।
সম্ভব হলে, নাল চেক অপ্টিমাইজ করতে
-assumenosideeffectsবা-convertchecknotnullব্যবহার করুন, কারণ এটি আপনার অ্যাপের DEX-এর সাইজ উল্লেখযোগ্যভাবে কমাতে পারে। আরও তথ্যের জন্য, অতিরিক্ত নিয়মের ধরন দেখুন।
আপনি যদি এইসব নির্দেশিকা মেনে চলতে না পারেন, তাহলে আপনি সাময়িকভাবে সেই কোডটি আলাদা করতে পারেন যা একটি নির্দিষ্ট প্যাকেজে রাখতে হবে এবং প্যাকেজে আপনার রাখার নিয়ম প্রয়োগ করতে হবে। তবে, এটি দীর্ঘমেয়াদী সমাধান নয়। আরও জানতে, ইনক্রিমেন্টালভাবে অপ্টিমাইজেশন গ্রহণ করা দেখুন। কোনও প্যাকেজের জন্য 'রাখুন' সংক্রান্ত নিয়ম ব্যবহার করতে, নিচের উদাহরণের মতো 'রাখুন' সংক্রান্ত নিয়ম নির্ধারণ করুন:
-keepclassmembers class com.example.pkg.** { *; }
যেসব কাজ এড়িয়ে যাবেন
কীপ নিয়মের সিনট্যাক্সে অনেক বিকল্প আছে, কিন্তু পরিমাপযোগ্য স্থায়ী পারফর্ম্যান্সের সুবিধা পেতে আমরা নিম্নলিখিতগুলি ব্যবহার না করার পরামর্শ দিই:
- প্যাকেজ-ওয়াইড রাখার নিয়ম যেমন
-keep class com.example.pkg.** { *; }দীর্ঘমেয়াদী ব্যবহার করবেন না। R8 কনফিগার করার সময় সমস্যা সমাধানের জন্য এগুলি সাময়িকভাবে ব্যবহার করা যেতে পারে। আরও তথ্যের জন্য, অপ্টিমাইজেশনের স্কোপ সীমিত করুন দেখুন। সাধারণত, ওয়াইল্ডকার্ড ব্যবহার করার সময় সতর্ক থাকুন— নিশ্চিত করুন যে আপনি শুধুমাত্র প্রয়োজনীয় কোডই রাখছেন। - সম্ভব হলে, এমন লাইব্রেরি এড়িয়ে চলুন যা আপনাকে কপি ও পেস্ট করার জন্য কিপ নিয়ম সাজেস্ট করে যখন আপনি সেগুলি ব্যবহার করেন, বিশেষ করে প্যাকেজ-ওয়াইড কিপ নিয়ম। Android-এ ভাল পারফর্ম করার জন্য ডিজাইন করা লাইব্রেরির ক্ষেত্রে, যেখানে সম্ভব রিফ্লেকশন এড়িয়ে যাওয়া উচিত এবং প্রয়োজন হলে কনজিউমার কিপ রুল এম্বেড করা উচিত।
- কিপ রুলে ইনভার্সন অপারেটর
!ব্যবহার করা এড়িয়ে চলুন কারণ আপনি অনিচ্ছাকৃতভাবে আপনার অ্যাপ্লিকেশনের প্রায় প্রতিটি ক্লাসে কোনও রুল প্রয়োগ করতে পারেন।
আপনি যদি এই নিয়মগুলি অনুসরণ করতে না পারেন, তাহলে আপনি হয়ত অনেক ওপেন-এন্ডেড রিফ্লেকশন ব্যবহার করছেন এবং আপনাকে হয় রিফ্লেকশন এড়িয়ে যেতে হবে অথবা রিফ্লেকশন ব্যবহার করে লাইব্রেরি এড়িয়ে যেতে হবে (Gson কেস স্টাডি দেখুন)।