আপনি যখন ডিফল্ট সেটিংসের সাথে অ্যাপ অপ্টিমাইজেশান সক্ষম করেন , তখন R8 আপনার কর্মক্ষমতা সুবিধা সর্বাধিক করার জন্য ব্যাপক অপ্টিমাইজেশানগুলি সম্পাদন করে৷ R8 ক্লাসের ক্ষেত্র এবং পদ্ধতির নামকরণ, সরানো এবং অপসারণ সহ কোডে উল্লেখযোগ্য পরিবর্তন করে। যদি এটি ত্রুটির কারণ হয়ে থাকে, তাহলে আপনাকে কোডের কোন অংশগুলিকে এককভাবে ছেড়ে যেতে হবে তা উল্লেখ করতে হবে Keep রুল লিখে।
R8 নিম্নলিখিত পরিস্থিতিতে ভুলভাবে কোড অপসারণ বা সংশোধন করতে পারে:
- প্রতিফলন: প্রতিফলন ব্যবহার করে কোড অ্যাক্সেস করা হয়েছে, উদাহরণস্বরূপ
Class.forName()
বাMethod.invoke()
ব্যবহার করে। R8 সাধারণত বলতে পারে না কোন ক্লাস বা পদ্ধতি এইভাবে অ্যাক্সেস করা হবে। - সিরিয়ালাইজেশন: সিরিয়ালাইজেশন এবং ডিসিরিয়ালাইজেশনের জন্য প্রয়োজনীয় ক্লাস বা ক্ষেত্রগুলি R8 এ অব্যবহৃত বলে মনে হতে পারে (এটি প্রতিফলনের আরেকটি রূপ)।
- জাভা নেটিভ ইন্টারফেস (জেএনআই): নেটিভ কোড থেকে কল করা জাভা পদ্ধতি। R8 নেটিভ কোড বিশ্লেষণ করে না যে এটি জাভাতে কী কল করতে পারে।
এই পৃষ্ঠাটি কভার করে যে কীভাবে R8 এর অপ্টিমাইজেশনের সীমা সীমাবদ্ধ করা যায়। কোন সংস্থানগুলি রাখা হয় তা কীভাবে কাস্টমাইজ করতে হয় তা শিখতে, সংস্থানগুলির জন্য রাখার নিয়মগুলি দেখুন।
যেখানে রাখা নিয়ম যোগ করুন
মডিউলের রুট ডিরেক্টরিতে অবস্থিত একটি proguard-rules.pro
ফাইলে আপনার নিয়মগুলি যোগ করা উচিত (ফাইলটি ইতিমধ্যেই সেখানে থাকতে পারে, কিন্তু যদি এটি না থাকে তবে এটি তৈরি করুন)। ফাইলে নিয়মগুলি প্রয়োগ করতে, আপনাকে অবশ্যই আপনার মডিউল-স্তরের build.gradle.kts
(বা build.gradle
) ফাইলে নিম্নলিখিত কোডে দেখানো ফাইলটি ঘোষণা করতে হবে:
কোটলিন
android { buildTypes { release { isMinifyEnabled = true isShrinkResources = true proguardFiles( // Default file with default optimization rules. getDefaultProguardFile("proguard-android-optimize.txt"), // File with your custom rules. "proguard-rules.pro" ) ... } } ... }
গ্রোভি
android { buildTypes { release { minifyEnabled true shrinkResources true proguardFiles( // Default file with default optimization rules. getDefaultProguardFile('proguard-android-optimize.txt'), // File with your custom rules. 'proguard-rules.pro' ) ... } } // ... }
ডিফল্টরূপে, আপনার বিল্ড স্ক্রিপ্টে proguard-android-optimize.txt
ফাইলও অন্তর্ভুক্ত থাকে। এই ফাইলটিতে এমন নিয়ম রয়েছে যা বেশিরভাগ অ্যান্ড্রয়েড প্রকল্পের জন্য প্রয়োজনীয়, তাই আপনার এটি বিল্ড স্ক্রিপ্টে রাখা উচিত।
কিভাবে লিখতে হয় নিয়ম মেনে চলুন
অ্যাপ কম্পাইলেশনের সময় R8 আপনার অ্যাপের কল গ্রাফ বিশ্লেষণ করে একটি অ্যাপে কোন কোড রাখতে হবে তা সনাক্ত করে, যা ম্যানিফেস্ট এন্ট্রি (যেমন আপনার কার্যকলাপ বা পরিষেবা) থেকে শুরু হয় এবং প্রতিটি অ্যাপ এবং লাইব্রেরি ফাংশন কলের মাধ্যমে ট্রেস করে। R8 এমন কোডকে সরিয়ে দেয় যা সরাসরি এইভাবে উল্লেখ করা হয় না, যেটি সমস্যার কারণ হতে পারে যদি এক্সিকিউটেড কোড এই গ্রাফের অংশ না হয়, উদাহরণস্বরূপ প্রতিফলনের মাধ্যমে আহ্বান করা কোড। আপনার নিজের রাখার নিয়ম লিখে, আপনি R8 কে সেই কোড সম্পর্কে জানাতে পারেন যা অ্যাপে থাকতে হবে।
একটি রাখার নিয়ম যোগ করতে, proguard-rules.pro
ফাইলে একটি -keep
লাইন যোগ করুন।
নিয়ম সিনট্যাক্স রাখুন
নিয়মগুলি রাখুন সাধারণত এই বিন্যাসটি অনুসরণ করুন:
-<KeepOption> [OptionalModifier,...] <ClassSpecification> [{ OptionalMemberSpecification }]
উদাহরণস্বরূপ একটি নির্দিষ্ট শ্রেণী এবং এর সমস্ত সদস্য সংরক্ষণ করতে, নিম্নলিখিতগুলি ব্যবহার করুন:
-keep class com.myapp.MyClass { *; }
আরও উদাহরণের জন্য, উদাহরণ বিভাগটি দেখুন।
এখানে রাখা নিয়মের উপাদানগুলি কী করে:
<KeepOption>
আপনাকে একটি ক্লাসের কোন দিকগুলি সংরক্ষণ করতে হবে তা নির্দিষ্ট করতে দেয়:বিকল্প রাখুন বর্ণনা -রাখুন
[{ OptionalMemberSpecification }]
এ তালিকাভুক্ত ক্লাস এবং সদস্যদের সংরক্ষণ করুন।-শ্রেণীর সদস্য রাখুন
ক্লাসের অপ্টিমাইজেশনের অনুমতি দিন; যদি ক্লাসটি সংরক্ষিত থাকে তবে
[{ OptionalMemberSpecification }]
এ তালিকাভুক্ত সদস্যদের সংরক্ষণ করুন।-নাম রাখা
ক্লাস এবং সদস্যদের অপসারণের অনুমতি দিন, কিন্তু অন্য উপায়ে অস্পষ্ট বা সংশোধন করবেন না।
-শ্রেণীর সদস্যদের নাম রাখুন
শ্রেণী এবং সদস্যদের অপসারণের অনুমতি দিন, কিন্তু অন্য উপায়ে সদস্যদের অস্পষ্ট বা সংশোধন করবেন না।
-সদস্যদের সাথে ক্লাস রাখুন
যদি সদস্যরা নির্দিষ্ট প্যাটার্নের সাথে মেলে তবে ক্লাসের কোন অপসারণ বা অস্পষ্টতা থাকবে না।
আমরা বেশিরভাগ ক্ষেত্রে
-keepclassmembers
ব্যবহার করার পরামর্শ দিই, যেহেতু এটি সর্বাধিক অপ্টিমাইজেশান সক্ষম করে, এবং তারপরে প্রয়োজন হলে-keepnames
।-keep
কোনো অপ্টিমাইজেশনের জন্য অনুমতি দেয় না, তাই এটি অল্প ব্যবহার করার চেষ্টা করুন।[OptionalModifier],...]
আপনাকে একটি ক্লাসের শূন্য বা তার বেশি জাভা ল্যাঙ্গুয়েজ মডিফায়ার তালিকা করতে দেয়, উদাহরণস্বরূপpublic
বাfinal
।<ClassSpecification>
আপনাকে নির্দিষ্ট করতে দেয় কোন ক্লাসে (বা কোন সুপারক্লাস বা বাস্তবায়িত ইন্টারফেস) Keep নিয়মটি প্রযোজ্য হবে। সহজ ক্ষেত্রে এটি একটি সম্পূর্ণ যোগ্য শ্রেণী।[{ OptionalMemberSpecification }]
আপনাকে কিছু নির্দিষ্ট প্যাটার্নের সাথে মেলে শুধুমাত্র ক্লাস এবং পদ্ধতিতে Keep আচরণ ফিল্টার করতে দেয়। সাধারণত এটি উদ্দেশ্যের চেয়ে বেশি রাখা প্রতিরোধ করার জন্য বেশিরভাগ রাখার নিয়মে সুপারিশ করা হয়।
নিয়ম উদাহরণ রাখুন
এখানে ভাল পরিকল্পিত রাখা নিয়ম কিছু উদাহরণ আছে.
সাবক্লাস তৈরি করুন
প্রতিফলনের মাধ্যমে ডাটাবেস কনস্ট্রাক্টরকে ইনস্ট্যান্টিয়েট করার জন্য এই রাখার নিয়মটি androidx.room:room-runtime
এর ভিতরে প্যাকেজ করা হয়েছে ।
-keep class * extends androidx.room.RoomDatabase { void <init>(); }
অ্যান্ড্রয়েড ফ্রেমওয়ার্ক অবজেক্ট ObjectAnimator
থেকে প্রতিফলন
এই কিপ নিয়মটি androidx.vectordrawable:vectordrawable-animated
এর ভিতরে প্যাকেজ করা হয়েছে যাতে ObjectAnimator
জেএনআই-এর সাথে নেটিভ কোড থেকে গেটার বা সেটারের সাথে কল করতে সক্ষম করে। মনে রাখবেন যে কম্পোজের নতুন অ্যানিমেশন সিস্টেমের জন্য এই ধরনের নিয়ম রাখার প্রয়োজন হয় না, এটি নিয়ম কাঠামোর একটি উদাহরণ মাত্র।
-keepclassmembers class androidx.vectordrawable.graphics.drawable.VectorDrawableCompat$* {
void set*(***);
*** get*();
}
JNI নিবন্ধন
এই রাখার নিয়মটি androidx.graphics:graphics-path
এর ভিতরে প্যাকেজ করা হয়েছে , যা নেটিভ পদ্ধতি রাখতে ব্যবহৃত হয়। এটি প্রয়োজনীয় হতে পারে যদি আপনার লাইব্রেরি ম্যানুয়ালি env->RegisterNatives()
সাথে নেটিভ পদ্ধতি নিবন্ধন করে।
-keepclasseswithmembers class androidx.graphics.path.** {
native <methods>;
}