একজন লাইব্রেরি লেখক হিসেবে, আপনাকে অবশ্যই নিশ্চিত করতে হবে যে অ্যাপ ডেভেলপাররা একটি উচ্চ-মানের এন্ড-ইউজার অভিজ্ঞতা বজায় রেখে সহজেই আপনার লাইব্রেরিটি তাদের অ্যাপে অন্তর্ভুক্ত করতে পারে। এর অর্থ হলো, আপনার লাইব্রেরিটি অবশ্যই অ্যান্ড্রয়েড অপটিমাইজেশন (R8)-এর সাথে সামঞ্জস্যপূর্ণ হতে হবে এবং এর জন্য ডেভেলপারের কোনো অতিরিক্ত সেটআপের প্রয়োজন হবে না—অথবা লাইব্রেরিটি অ্যান্ড্রয়েডে ব্যবহারের জন্য অনুপযুক্ত হতে পারে, তা নথিভুক্ত করতে হবে। এটি অত্যন্ত গুরুত্বপূর্ণ যে অ্যান্ড্রয়েডে ব্যবহারের জন্য তৈরি লাইব্রেরিগুলো যেন গুরুত্বপূর্ণ অ্যাপ অপটিমাইজেশনে বাধা না দেয় এবং অতিরিক্ত অপটিমাইজেশনের প্রয়োজনীয়তাগুলো মেনে চলে ।
এই ডকুমেন্টেশনটি প্রকাশিত লাইব্রেরির ডেভেলপারদের লক্ষ্য করে তৈরি করা হয়েছে, তবে এটি একটি বৃহৎ, মডিউলারাইজড অ্যাপের অভ্যন্তরীণ লাইব্রেরি মডিউলের ডেভেলপারদের জন্যও উপযোগী হতে পারে।
আপনি যদি একজন অ্যাপ ডেভেলপার হন এবং আপনার অ্যান্ড্রয়েড অ্যাপ অপ্টিমাইজ করার বিষয়ে জানতে চান, তাহলে ‘অ্যাপ অপ্টিমাইজেশন সক্ষম করুন ’ দেখুন। কোন লাইব্রেরিগুলো ব্যবহার করা উপযুক্ত, তা জানতে ‘লাইব্রেরি বিচক্ষণতার সাথে নির্বাচন করুন ’ দেখুন।
নিয়মের প্রকারভেদ বুঝুন
লাইব্রেরিতে দুই ধরনের স্বতন্ত্র কিপ রুল থাকতে পারে:
- কনজিউমার কিপ রুলস-এ অবশ্যই সেই নিয়মগুলো নির্দিষ্ট করতে হবে যা লাইব্রেরি দ্বারা রিফ্লেক্ট করা কোড সংরক্ষণ করে। যদি কোনো লাইব্রেরি তার নিজের কোড বা ক্লায়েন্ট অ্যাপ দ্বারা সংজ্ঞায়িত কোড কল করার জন্য রিফ্লেকশন বা JNI ব্যবহার করে, তবে এই নিয়মগুলোতে বর্ণনা করতে হবে কোন কোডটি সংরক্ষণ করা প্রয়োজন। লাইব্রেরিগুলোর উচিত কনজিউমার কিপ রুলস প্যাকেজ করা, যা অ্যাপ কিপ রুলস-এর মতোই একই ফরম্যাট ব্যবহার করে। এই নিয়মগুলো লাইব্রেরি আর্টিফ্যাক্টস (AAR বা JAR)-এর মধ্যে বান্ডল করা থাকে এবং লাইব্রেরিটি ব্যবহৃত হলে অ্যান্ড্রয়েড অ্যাপ অপটিমাইজেশনের সময় স্বয়ংক্রিয়ভাবে কনজিউম হয়ে যায়। এই নিয়মগুলো আপনার
build.gradle.kts(বাbuild.gradle) ফাইলেconsumerProguardFilesপ্রপার্টি দ্বারা নির্দিষ্ট করা ফাইলে রক্ষণাবেক্ষণ করা হয়। আরও জানতে, "কনজিউমার কিপ রুলস লিখুন" দেখুন। - আপনার লাইব্রেরি বিল্ড করার সময় লাইব্রেরি বিল্ড কিপ রুলস প্রয়োগ করা হয়। এগুলি শুধুমাত্র তখনই প্রয়োজন হয় যখন আপনি বিল্ড করার সময় আপনার লাইব্রেরিকে আংশিকভাবে অপ্টিমাইজ করার সিদ্ধান্ত নেন। এগুলিকে অবশ্যই লাইব্রেরির পাবলিক এপিআই মুছে যাওয়া থেকে আটকাতে হবে, অন্যথায় লাইব্রেরি ডিস্ট্রিবিউশনে পাবলিক এপিআই উপস্থিত থাকবে না, যার অর্থ অ্যাপ ডেভেলপাররা লাইব্রেরিটি ব্যবহার করতে পারবে না। এই নিয়মগুলি আপনার
build.gradle.kts(বাbuild.gradle) ফাইলেproguardFilesপ্রপার্টি দ্বারা নির্দিষ্ট করা ফাইলে রক্ষণাবেক্ষণ করা হয়। আরও জানতে, Optimize AAR library build দেখুন।
অপ্টিমাইজেশনের প্রয়োজনীয়তা এবং নির্দেশিকা
লাইব্রেরিতে থাকা R8 কনফিগারেশন ব্যবহারকারী অ্যাপের চূড়ান্ত বাইনারি সাইজ এবং পারফরম্যান্সের উপর সার্বিক প্রভাব ফেলে। সাধারণ 'কিপ রুল' সংক্রান্ত সর্বোত্তম অনুশীলনগুলো ছাড়াও, লাইব্রেরি লেখকদের অবশ্যই নির্দিষ্ট কিছু আবশ্যকতা মেনে চলতে হবে এবং অতিরিক্ত নির্দেশিকাগুলো বিবেচনা করতে হবে।
অপ্টিমাইজেশনের প্রয়োজনীয়তা মেনে চলুন
লাইব্রেরির অদক্ষতা অ্যাপ স্ফীতি, মেমরির অপচয়, ধীরগতির স্টার্টআপ এবং এএনআর (অ্যাপ্লিকেশন নট রেসপন্ডিং এরর)-এর অন্যতম প্রধান কারণ। অ্যাপের গুণমান এবং ব্যবহারকারীর অভিজ্ঞতা যাতে উল্লেখযোগ্যভাবে হ্রাস না পায়, সেজন্য লাইব্রেরিগুলোকে অবশ্যই নিম্নলিখিত প্রয়োজনীয়তাগুলো লঙ্ঘন করা থেকে বিরত থাকতে হবে।
ব্যাপক বা প্যাকেজ-ব্যাপী কোনো কিপ রুল নয়: আপনার লাইব্রেরিতে এমন কোনো ব্যাপক কিপ রুল অন্তর্ভুক্ত করা যাবে না, যা বেশিরভাগ কোড আপনার নিজের বা অন্য কোনো লাইব্রেরিতে রেখে দেয়। ব্যাপক কিপ রুল স্বল্পমেয়াদে ক্র্যাশের সমাধান করতে পারে, কিন্তু এগুলো আপনার লাইব্রেরি ব্যবহারকারী সমস্ত অ্যাপের সাইজ বাড়িয়ে দেয়।
আপনার লাইব্রেরিতে বা অন্য রেফারেন্সকৃত লাইব্রেরিতে থাকা প্যাকেজগুলির জন্য প্যাকেজ-ব্যাপী কিপ রুল (যেমন
-keep class com.mylibrary.** {*; }) অন্তর্ভুক্ত করবেন না। এই ধরনের রুলগুলি আপনার লাইব্রেরি ব্যবহারকারী সমস্ত অ্যাপ জুড়ে এই প্যাকেজগুলির অপটিমাইজেশন সীমিত করে দেয়।কোনো অনুপযুক্ত গ্লোবাল নিয়ম নয়:
-dontobfuscateবা-allowaccessmodificationএর মতো গ্লোবাল অপশন কখনোই ব্যবহার করবেন না।যখনই সম্ভব, রিফ্লেকশনের পরিবর্তে কোডজেন ব্যবহার করুন । প্রোগ্রামিং করার সময় বয়লারপ্লেট কোড এড়ানোর জন্য কোডজেন এবং রিফ্লেকশন উভয়ই প্রচলিত পদ্ধতি, কিন্তু কোডজেন R8-এর মতো অ্যাপ অপটিমাইজারের সাথে বেশি সামঞ্জস্যপূর্ণ।
কোডজেন-এর সাহায্যে বিল্ড প্রসেস চলাকালীন কোড বিশ্লেষণ ও সংশোধন করা হয়। যেহেতু কম্পাইল টাইমের পরে কোনো বড় ধরনের পরিবর্তন হয় না, তাই অপটিমাইজার জানতে পারে যে শেষ পর্যন্ত কোন কোডটির প্রয়োজন এবং কোনটি নিরাপদে বাদ দেওয়া যেতে পারে।
রিফ্লেকশনের মাধ্যমে রানটাইমে কোড বিশ্লেষণ ও পরিবর্তন করা হয়। যেহেতু কোডটি এক্সিকিউট হওয়ার আগে চূড়ান্ত রূপ পায় না, তাই অপটিমাইজার জানে না কোন কোড নিরাপদে মুছে ফেলা যায়। এটি সম্ভবত সেইসব কোড মুছে ফেলবে যা রানটাইমে রিফ্লেকশনের মাধ্যমে ডাইনামিকভাবে ব্যবহৃত হয়, যার ফলে ব্যবহারকারীদের অ্যাপ ক্র্যাশ করে।
অনেক আধুনিক লাইব্রেরি রিফ্লেকশনের পরিবর্তে কোডজেন ব্যবহার করে। একটি সাধারণ এন্ট্রিপয়েন্টের জন্য KSP দেখুন, যা Room , Dagger2 এবং আরও অনেকে ব্যবহার করে।
R8 ফুল মোড সাপোর্ট: R8 ফুল মোড চালু থাকলে আপনার লাইব্রেরি ক্র্যাশ করা উচিত নয়। R8 ব্যবহারের জন্য এর ফুল মোডই প্রস্তাবিত মোড, এবং ২০২৩ সালে স্থিতিশীল হওয়া AGP 8.0 থেকে এটিই ডিফল্ট। যদি R8-এর অধীনে আপনার লাইব্রেরি ক্র্যাশ করে, তবে এর সমাধান হলো নির্দিষ্ট রিফ্লেকশন বা JNI এন্ট্রি পয়েন্ট শনাক্ত করে একটি টার্গেটেড রুল যোগ করা, পুরো প্যাকেজটি চালু রাখা নয়।
অতিরিক্ত সুপারিশ
অপ্টিমাইজেশনের প্রয়োজনীয়তাগুলো ছাড়াও, নিম্নলিখিতগুলো হলো অতিরিক্ত সুপারিশ।
- আপনার লাইব্রেরির কনজিউমার কিপ রুলস ফাইলে
-repackageclassesব্যবহার করবেন না। তবে, আপনার লাইব্রেরি বিল্ড অপ্টিমাইজ করার জন্য, আপনি আপনার লাইব্রেরির বিল্ড কিপ রুলস ফাইলে একটি ইন্টারনাল প্যাকেজ নেম, যেমন<your.library.package>.internal, সহ-repackageclassesব্যবহার করতে পারেন। এটি অপ্টিমাইজ না করা অ্যাপে আপনার লাইব্রেরির কার্যকারিতা উন্নত করতে পারে। তবে, এটি সাধারণত প্রয়োজনীয় নয়, কারণ অ্যাপগুলোও অপ্টিমাইজ করা উচিত। - আপনার লাইব্রেরির কার্যকারিতার জন্য প্রয়োজনীয় যেকোনো অ্যাট্রিবিউট আপনার লাইব্রেরির 'কিপ রুলস' ফাইলে ঘোষণা করুন, এমনকি যদি সেগুলোর সাথে
proguard-android-optimize.txtএ সংজ্ঞায়িত অ্যাট্রিবিউটগুলোর মিল থাকার সম্ভাবনাও থাকে। - আপনার লাইব্রেরি ডিস্ট্রিবিউশনে যদি নিম্নলিখিত অ্যাট্রিবিউটগুলির প্রয়োজন হয়, তবে সেগুলি আপনার লাইব্রেরির কনজিউমার কিপ রুলস ফাইলে নয় , বরং আপনার লাইব্রেরির বিল্ড কিপ রুলস ফাইলে রক্ষণাবেক্ষণ করুন:
-
AnnotationDefault -
EnclosingMethod -
Exceptions -
InnerClasses -
RuntimeInvisibleAnnotations -
RuntimeInvisibleParameterAnnotations -
RuntimeInvisibleTypeAnnotations -
RuntimeVisibleAnnotations -
RuntimeVisibleParameterAnnotations -
RuntimeVisibleTypeAnnotations -
Signature
-
- যদি রানটাইমে অ্যানোটেশন ব্যবহার করা হয়, তবে লাইব্রেরি লেখকদের তাদের কনজিউমার কিপ রুলসে
RuntimeVisibleAnnotationsঅ্যাট্রিবিউটটি রাখা উচিত। - লাইব্রেরি লেখকদের তাদের কনজিউমার কিপ রুলসে নিম্নলিখিত গ্লোবাল অপশনগুলো ব্যবহার করা উচিত নয়:
-
-include -
-basedirectory -
-injars -
-outjars -
-libraryjars -
-repackageclasses -
-flattenpackagehierarchy -
-allowaccessmodification -
-renamesourcefileattribute -
-ignorewarnings -
-addconfigurationdebugging -
-printconfiguration -
-printmapping -
-printusage -
-printseeds -
-applymapping -
-obfuscationdictionary -
-classobfuscationdictionary -
-packageobfuscationdictionary
-
যখন প্রতিফলন ঠিক আছে
যদি আপনাকে প্রতিফলন ব্যবহার করতেই হয়, তবে কেবল নিম্নলিখিত দুটি বিষয়ের যেকোনো একটিতে প্রতিফলন করা উচিত:
- নির্দিষ্ট লক্ষ্যযুক্ত প্রকার (নির্দিষ্ট ইন্টারফেস বাস্তবায়নকারী বা উপশ্রেণী)
- একটি নির্দিষ্ট রানটাইম টীকা ব্যবহার করে কোড
এইভাবে রিফ্লেকশন ব্যবহার করলে রানটাইম খরচ সীমিত হয় এবং নির্দিষ্ট কনজিউমার কিপ রুল লেখা সম্ভব হয়।
রিফ্লেকশনের এই সুনির্দিষ্ট ও লক্ষ্য-ভিত্তিক রূপটি একটি প্যাটার্ন যা অ্যান্ড্রয়েড ফ্রেমওয়ার্ক (উদাহরণস্বরূপ, অ্যাক্টিভিটি, ভিউ এবং ড্রয়েবল ইনফ্লেট করার সময়) এবং অ্যান্ড্রয়েডএক্স লাইব্রেরি (উদাহরণস্বরূপ WorkManager ListenableWorkers বা RoomDatabases তৈরি করার সময়) উভয় ক্ষেত্রেই দেখা যায়। এর বিপরীতে, Gson-এর উন্মুক্ত রিফ্লেকশন অ্যান্ড্রয়েড অ্যাপে ব্যবহারের জন্য উপযুক্ত নয় ।
সাধারণ ভুল ধারণা
কয়েকটি সাধারণ ভুল ধারণার কারণে আপনি R8 ভুলভাবে কনফিগার করতে পারেন। এগুলি হলো:
R8-এর অপটিমাইজেশন সম্পর্কে ভুল ধারণা : প্রচলিত ধারণার বিপরীতে, R8-এর অপটিমাইজেশন শুধুমাত্র অবফাসকেশনের মধ্যেই সীমাবদ্ধ নয়, বরং এতে কোড শ্রিংকিং এবং মেথড ইনলাইনিং ও ক্লাস মার্জিং কৌশলের মাধ্যমে লজিক্যাল অপটিমাইজেশনও অন্তর্ভুক্ত রয়েছে। আরও তথ্যের জন্য, R8 অপটিমাইজেশন ওভারভিউ দেখুন।
অস্পষ্ট লাইব্রেরির অপ্টিমাইজেশন এড়িয়ে যাওয়া : একটি সাধারণ ভুল হলো কোনো লাইব্রেরিকে অপ্টিমাইজেশন থেকে বাদ দেওয়া, কারণ লাইব্রেরিটি AAR (অ্যান্ড্রয়েড আর্কাইভ) বা JAR (জাভা আর্কাইভ)-এ কম্পাইল করার সময় অপ্টিমাইজ বা অস্পষ্ট করা হয়েছিল। লাইব্রেরি বিল্ড করার সময় অপ্টিমাইজেশন সীমিত থাকে, এবং আপনার অ্যাপের উচিত নয় কোনো 'কিপ রুল'-এ লাইব্রেরিটি অন্তর্ভুক্ত করে এর অপ্টিমাইজেশন নিষ্ক্রিয় করা। আরও তথ্যের জন্য, 'Optimize AAR library build' দেখুন।
-keepঅপশন সম্পর্কে ভুল ধারণা।-keepনিয়মটি R8-কে এর কোনো অপটিমাইজেশন পাস চালানো থেকে বিরত রাখে। আরও তথ্যের জন্য, সঠিক keep অপশনটি বেছে নিন দেখুন।
নিয়ম প্যাকেজিং কনফিগার করুন
আপনার গ্রাহক সংরক্ষণ বিধিগুলো সঠিকভাবে প্রয়োগ করা নিশ্চিত করতে, আপনাকে অবশ্যই আপনার লাইব্রেরির ফরম্যাট অনুযায়ী সেগুলোকে যথাযথভাবে প্যাকেজ করতে হবে।
AAR লাইব্রেরি
একটি AAR লাইব্রেরির জন্য কনজিউমার রুল যোগ করতে, অ্যান্ড্রয়েড লাইব্রেরি মডিউলের বিল্ড স্ক্রিপ্টে consumerProguardFiles অপশনটি ব্যবহার করুন। আরও তথ্যের জন্য, লাইব্রেরি মডিউল তৈরি করার বিষয়ে আমাদের নির্দেশিকা দেখুন।
কোটলিন
android {
defaultConfig {
consumerProguardFiles("consumer-proguard-rules.pro")
}
...
}
গ্রুভি
android {
defaultConfig {
consumerProguardFiles 'consumer-proguard-rules.pro'
}
...
}
জার লাইব্রেরি
আপনার Kotlin বা Java লাইব্রেরির সাথে, যা একটি JAR হিসেবে পাঠানো হয়, নিয়মগুলো বান্ডল করতে, আপনার নিয়ম ফাইলটি যেকোনো নামে চূড়ান্ত JAR-এর META-INF/proguard/ ডিরেক্টরিতে রাখুন। উদাহরণস্বরূপ, যদি আপনার কোড <libraryroot>/src/main/kotlin এ থাকে, তাহলে একটি কনজিউমার নিয়ম ফাইল <libraryroot>/src/main/resources/META-INF/proguard/consumer-proguard-rules.pro তে রাখুন এবং নিয়মগুলো আপনার আউটপুট JAR-এর সঠিক স্থানে বান্ডল হয়ে যাবে।
চূড়ান্ত JAR ফাইলটিতে নিয়মগুলো সঠিকভাবে বান্ডল করা হয়েছে কিনা, তা META-INF/proguard ডিরেক্টরিতে আছে কি না, তা পরীক্ষা করে যাচাই করুন।
AAR লাইব্রেরি বিল্ড অপ্টিমাইজ করুন (উন্নত)
সাধারণত, আপনার সরাসরি কোনো লাইব্রেরি বিল্ড অপ্টিমাইজ করার প্রয়োজন হয় না, কারণ লাইব্রেরি বিল্ড করার সময় সম্ভাব্য অপ্টিমাইজেশনের সুযোগ খুবই সীমিত। একজন লাইব্রেরি ডেভেলপার হিসেবে, কোনো লাইব্রেরি অপ্টিমাইজ করার আগে আপনাকে লাইব্রেরি এবং অ্যাপ বিল্ড করার সময়, অপ্টিমাইজেশনের একাধিক পর্যায় এবং এর আচরণ সম্পর্কে ভাবতে হবে।
আপনি যদি বিল্ড টাইমে আপনার লাইব্রেরি অপ্টিমাইজ করতে চান, তবে অ্যান্ড্রয়েড গ্রেডল প্লাগইন এই সুবিধাটি প্রদান করে।
কোটলিন
android {
buildTypes {
release {
isMinifyEnabled = true
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
configureEach {
consumerProguardFiles("consumer-rules.pro")
}
}
}
গ্রুভি
android {
buildTypes {
release {
minifyEnabled true
proguardFiles
getDefaultProguardFile('proguard-android-optimize.txt'),
'proguard-rules.pro'
}
configureEach {
consumerProguardFiles "consumer-rules.pro"
}
}
}
উল্লেখ্য যে, proguardFiles এর আচরণ consumerProguardFiles থেকে অনেকটাই আলাদা:
- লাইব্রেরি বিল্ডের সময় আপনার লাইব্রেরির কোন অংশটি রাখা হবে তা নির্ধারণ করতে
proguardFilesবিল্ড টাইমে ব্যবহৃত হয়, প্রায়শইgetDefaultProguardFile("proguard-android-optimize.txt")এর সাথে একত্রে। ন্যূনতমভাবে, এটিই আপনার পাবলিক এপিআই। - এর বিপরীতে,
consumerProguardFilesলাইব্রেরির মধ্যেই প্যাকেজ করা থাকে, যা পরবর্তীতে আপনার লাইব্রেরি ব্যবহারকারী কোনো অ্যাপের বিল্ড চলাকালীন অপটিমাইজেশনকে প্রভাবিত করে।
উদাহরণস্বরূপ, যদি আপনার লাইব্রেরি অভ্যন্তরীণ ক্লাস তৈরি করতে রিফ্লেকশন ব্যবহার করে, তাহলে আপনাকে proguardFiles এবং consumerProguardFiles উভয় ফাইলেই keep নিয়মগুলো সংজ্ঞায়িত করতে হতে পারে।
আপনার লাইব্রেরির বিল্ডে যদি আপনি -repackageclasses ব্যবহার করেন, তাহলে ক্লাসগুলোকে আপনার লাইব্রেরির প্যাকেজের ভেতরে একটি সাব-প্যাকেজে রিপ্যাকেজ করা হবে। উদাহরণস্বরূপ, -repackageclasses ' -repackageclasses 'internal' -repackageclasses 'com.example.mylibrary.internal' ' ব্যবহার করুন।
বিভিন্ন R8 সংস্করণ সমর্থন করে (উন্নত)
আপনি R8-এর নির্দিষ্ট সংস্করণগুলোকে লক্ষ্য করে নিয়মগুলো সাজিয়ে নিতে পারেন। এর ফলে, নতুন R8 সংস্করণ ব্যবহারকারী প্রজেক্টগুলোতে আপনার লাইব্রেরি সর্বোত্তমভাবে কাজ করতে পারে এবং একই সাথে পুরোনো R8 সংস্করণের প্রজেক্টগুলোতে বিদ্যমান নিয়মগুলোও ব্যবহার করা চালিয়ে যাওয়া যায়।
To specify targeted R8 rules, you need to include them in the META-INF/com.android.tools directory inside classes.jar of an AAR or in the META-INF/com.android.tools directory of a JAR.
In an AAR library:
proguard.txt (legacy location, the file name must be "proguard.txt")
classes.jar
└── META-INF
└── com.android.tools (location of targeted R8 rules)
├── r8-from-<X>-upto-<Y>/<R8-rule-files>
└── ... (more directories with the same name format)
In a JAR library:
META-INF
├── proguard/<ProGuard-rule-files> (legacy location)
└── com.android.tools (location of targeted R8 rules)
├── r8-from-<X>-upto-<Y>/<R8-rule-files>
└── ... (more directories with the same name format)
META-INF/com.android.tools ডিরেক্টরিতে r8-from-<X>-upto-<Y> ফর্ম্যাটের নামের একাধিক সাবডিরেক্টরি থাকতে পারে, যা নির্দেশ করে যে নিয়মগুলি কোন R8 সংস্করণগুলির জন্য লেখা হয়েছে। প্রতিটি সাবডিরেক্টরিতে R8 নিয়মগুলি ধারণকারী এক বা একাধিক ফাইল থাকতে পারে, যেগুলির ফাইলের নাম এবং এক্সটেনশন যেকোনো রকম হতে পারে।
উল্লেখ্য যে -from-<X> এবং -upto-<Y> অংশগুলো ঐচ্ছিক, <Y> সংস্করণটি স্বতন্ত্র , এবং সংস্করণের পরিসরগুলো সাধারণত অবিচ্ছিন্ন হলেও একে অপরের সাথে মিলে যেতে পারে।
উদাহরণস্বরূপ, r8 , r8-upto-8.0.0 , r8-from-8.0.0-upto-8.2.0 , এবং r8-from-8.2.0 হলো ডিরেক্টরির নাম যা একগুচ্ছ নির্দিষ্ট R8 নিয়মকে নির্দেশ করে। r8 ডিরেক্টরির অধীনে থাকা নিয়মগুলো যেকোনো R8 সংস্করণ দ্বারা ব্যবহার করা যেতে পারে। r8-from-8.0.0-upto-8.2.0 ডিরেক্টরির অধীনে থাকা নিয়মগুলো R8-এর সংস্করণ 8.0.0 থেকে শুরু করে সংস্করণ 8.2.0 পর্যন্ত (কিন্তু 8.2.0 সংস্করণটি অন্তর্ভুক্ত নয় ) ব্যবহার করা যাবে।
অ্যান্ড্রয়েড গ্রেডল প্লাগইন সেই তথ্য ব্যবহার করে বর্তমান R8 সংস্করণ দ্বারা ব্যবহারযোগ্য সমস্ত নিয়ম নির্বাচন করে। যদি কোনো লাইব্রেরি নির্দিষ্ট R8 নিয়ম উল্লেখ না করে, তাহলে অ্যান্ড্রয়েড গ্রেডল প্লাগইন লিগ্যাসি অবস্থানগুলি থেকে নিয়মগুলি নির্বাচন করবে (একটি AAR-এর জন্য proguard.txt অথবা একটি JAR-এর জন্য META-INF/proguard/<ProGuard-rule-files> )।