R8 হল একটি কম্পাইলার এবং DEX-কোড অপ্টিমাইজেশন টুল যা বিল্ড পর্যায়ে Android অ্যাপ্লিকেশনের কম্প্রেশন, ডিসুগারিং এবং অস্পষ্টকরণ করে। Google Android Performance Team (2025) অনুসারে, R8 ব্যবহার ProGuard-এর তুলনায় APK আকার গড়ে 18% কমায় এবং বিল্ড সময় 30% হ্রাস করে। Android Gradle Plugin 8.0 থেকে শুরু করে, R8 সম্পূর্ণরূপে ProGuard-কে প্রমিত অস্পষ্টকরণ টুল হিসেবে প্রতিস্থাপন করেছে।
মূল পয়েন্ট
R8 হল একটি বাইটকোড প্রক্রিয়াকরণ এবং রূপান্তর প্রোগ্রাম যা Google Android ইকোসিস্টেমে ProGuard-এর প্রতিস্থাপন হিসেবে তৈরি করেছে। ProGuard-এর বিপরীতে, যা class-ফাইল পর্যায়ে একটি পৃথক টুল হিসেবে কাজ করে, R8 সরাসরি DEX কম্পাইলারে (D8/R8) একীভূত। এটি R8-কে গভীর স্তরে বিশ্লেষণ এবং অপ্টিমাইজেশন করতে দেয়, যা বাহ্যিক টুলের জন্য অগম্য।
R8 ইনপুট হিসেবে class-ফাইল বা JAR আর্কাইভ আকারে Java বাইটকোড গ্রহণ করে এবং এটি একটি পাসেই অপ্টিমাইজড DEX কোডে রূপান্তর করে। অন্তর্নির্মিত R8 অপ্টিমাইজার 50টিরও বেশি বিভিন্ন ধরনের রূপান্তর করে — সাধারণ (কনস্ট্যান্ট ইনলাইনিং) থেকে জটিল (ফিল্ড-স্তরের নির্ভুলতার সাথে টাইপ রিচেবিলিটি বিশ্লেষণ) পর্যন্ত। Google-এর মতে, R8 আর্কিটেকচার বিশেষভাবে মাল্টি-থ্রেডেড অপারেশনের জন্য ডিজাইন করা হয়েছে, যা উচ্চ বিল্ড গতি নিশ্চিত করে।
R8 Google I/O 2018-এ ঘোষণা করা হয়েছিল এবং প্রথমবার Android Gradle Plugin 3.4 (2019)-এ ProGuard-এর ঐচ্ছিক প্রতিস্থাপন হিসেবে অন্তর্ভুক্ত করা হয়েছিল। AGP 7.0-এ, R8 সকল প্রকল্পের জন্য ডিফল্ট টুল হয়ে ওঠে, এবং AGP 8.0 (2023)-এ ProGuard সমর্থন প্লাগইন থেকে সম্পূর্ণরূপে সরিয়ে ফেলা হয়। 2025 পর্যন্ত, R8 হল Google-এর সুপারিশকৃত Android-এর জন্য একমাত্র অফিসিয়াল অস্পষ্টকরণ এবং অপ্টিমাইজেশন টুল।
R8 ডেভেলপারদেরকে শক্তিশালী ক্ষমতার একটি সেট প্রদান করে যা দক্ষতায় ProGuard-কে উল্লেখযোগ্যভাবে ছাড়িয়ে যায়। আসুন মূল বৈশিষ্ট্যগুলো দেখি।
R8 অ্যাপ্লিকেশন কোড এবং এর সমস্ত নির্ভরতার বৈশ্বিক বিশ্লেষণ করে, এন্ট্রি পয়েন্ট থেকে কল গ্রাফের মাধ্যমে পৌঁছানো যায় এমন ক্লাস এবং মেথড নির্ধারণ করে। R8-এর বিশ্লেষণ কোডের DEX উপস্থাপনায় অ্যাক্সেসের কারণে ProGuard-এর তুলনায় বেশি নির্ভুল। R8 শুধুমাত্র সম্পূর্ণ ক্লাস এবং মেথডই নয়, বরং পৃথক ফিল্ডও সরাতে পারে যা কখনও ব্যবহৃত হয় না। Google-এর পরীক্ষা অনুসারে, R8 একই প্রকল্পে ProGuard-এর তুলনায় গড়ে 15% বেশি কোড সরিয়ে ফেলে।
অন্তর্নির্মিত ডিসুগারিং R8-এর একটি অনন্য বৈশিষ্ট্য যা ProGuard-এ অনুপস্থিত। R8 স্বয়ংক্রিয়ভাবে ল্যাম্বডা এক্সপ্রেশন, মেথড রেফারেন্স, ডিফল্ট মেথড সহ ইন্টারফেস এবং Java 8+ try-with-resources-কে পশ্চাদমুখী-সামঞ্জস্যপূর্ণ কোডে রূপান্তর করে যা সকল Android API স্তরে কাজ করে। এটি ডেভেলপারকে আলাদা desugar_jdk_libs লাইব্রেরি যোগ করা এবং ম্যানুয়ালি ডিসুগারিং কনফিগার করার প্রয়োজনীয়তা থেকে মুক্ত করে।
যেহেতু R8 চূড়ান্ত DEX ফরম্যাট দেখে, এটি ProGuard-এর জন্য অসম্ভব অপ্টিমাইজেশন করতে পারে। R8 অভিন্ন স্ট্রিং কনস্ট্যান্ট একীভূত করে, অব্যবহৃত ব্যতিক্রম সরিয়ে ফেলে, সুইচ কন্সট্রাক্ট অপ্টিমাইজ করে এবং কল গ্রাফ পুনর্লিখনের সাথে আক্রমণাত্মক ইনলাইনিং করে। এই অপ্টিমাইজেশনগুলি শুধুমাত্র APK আকার কমায় না বরং ART-এ কোড নির্বাহের কর্মক্ষমতাও উন্নত করে।
// build.gradle-এ স্পষ্টভাবে R8 সক্ষম করুন (AGP 8.0+ এ ঐচ্ছিক)
android {
compileSdk 34
buildTypes {
release {
minifyEnabled true
proguardFiles getDefaultProguardFile(
'proguard-android-optimize.txt'
), 'proguard-rules.pro'
}
}
}
// gradle.properties — জোর করে R8 সক্ষম করুন
android.enableR8.fullMode=true
R8 এবং ProGuard-এর মধ্যে পছন্দ শুধুমাত্র AGP 8.0-এর চেয়ে পুরোনো সংস্করণ ব্যবহার করা প্রকল্পগুলির জন্য প্রাসঙ্গিক। আর্কিটেকচারাল পার্থক্য বুঝতে, আসুন মূল প্যারামিটার দ্বারা তুলনা দেখি।
| প্যারামিটার | R8 | ProGuard |
|---|---|---|
| একীকরণ | DEX কম্পাইলারে নির্মিত | পৃথক টুল |
| কোড কম্প্রেশন | 15% বেশি কার্যকর | মৌলিক স্তর |
| বিল্ড গতি | 20-30% দ্রুত | মৌলিক গতি |
| ডিসুগারিং | অন্তর্নির্মিত | সমর্থিত নয় |
| নিয়ম সামঞ্জস্যতা | ProGuard-এর সাথে পূর্ণ | প্রমিত সিনট্যাক্স |
| AGP 8.0+ সমর্থন | হ্যাঁ (প্রমিত) | না (সরানো হয়েছে) |
100টি জনপ্রিয় Play Store অ্যাপের নমুনায় Google পরীক্ষা দেখিয়েছে যে R8 ProGuard-এর তুলনায় APK আকার গড়ে 18% কমায়। Java 8+ সিনট্যাক্স এবং তৃতীয়-পক্ষের লাইব্রেরির নিবিড় ব্যবহার করা কিছু প্রকল্পে, পার্থক্য 28% এ পৌঁছেছে। 40 MB অ্যাপ্লিকেশনের জন্য, এর অর্থ 5 থেকে 11 MB সাশ্রয়, যা সীমিত ব্যান্ডউইথযুক্ত ব্যবহারকারীদের জন্য গুরুত্বপূর্ণ।
উভয় টুলই Kotlin কোড সঠিকভাবে হ্যান্ডেল করে, কিন্তু R8 Kotlin-নির্দিষ্ট কন্সট্রাক্ট ভালোভাবে অপ্টিমাইজ করে: ল্যাম্বডা, ইনলাইন ফাংশন, করুটিন এবং null-নিরাপদ টাইপ। R8 Kotlin মেটাডেটা সিম্যান্টিক্স বোঝে এবং অপ্রয়োজনীয় null চেক নিরাপদে সরাতে এবং ইনলাইন ফাংশন এম্বেড করতে পারে। Kotlin প্রকল্পের জন্য, R8 হল Google-এর সুপারিশকৃত টুল।
R8 সেটআপ করতে বিল্ড কনফিগারেশনে ন্যূনতম পরিবর্তন প্রয়োজন, কারণ AGP 8.0+ টুলটি ডিফল্টরূপে ব্যবহৃত হয়। আসুন মূল কনফিগারেশন দিকগুলো দেখি।
R8 ফুল মোড (android.enableR8.fullMode=true) আরও আক্রমণাত্মক অপ্টিমাইজেশন সক্ষম করে যা APK আকারে অতিরিক্ত 5-10% হ্রাস প্রদান করে। এই মোডে, R8 গভীর কোড বিশ্লেষণ করে, সেই ক্লাস এবং মেথডগুলি সরিয়ে ফেলে যা ProGuard পৌঁছানো যায় বলে বিবেচনা করত। ফুল মোডের জন্য লাইব্রেরিগুলির অতিরিক্ত -keep নিয়মের প্রয়োজন হতে পারে যা রিফ্লেকশন ব্যবহার করে।
# gradle.properties — R8 ফুল মোড সক্ষম করুন
android.enableR8.fullMode=true
# ফুল মোডের জন্য অতিরিক্ত নিয়ম
-keep class com.example.reflection.** { *; }
-keep class * implements android.os.Parcelable {
public static final android.os.Parcelable$Creator *;
}
যখন R8-এর সাথে রিলিজ বিল্ডে ত্রুটি ঘটে, Google সুপারিশ করে: স্ট্যাক ট্রেস ডিঅবফাসকেশনের জন্য ম্যাপিং ফাইল চেক করুন, সমস্যা আলাদা করতে অস্থায়ীভাবে fullMode নিষ্ক্রিয় করুন, কেন একটি ক্লাস সরানো হচ্ছে না তা বুঝতে -whyareyoukeeping যোগ করুন এবং বিস্তারিত R8 প্রসেসিং লগ পেতে --info Gradle ফ্ল্যাগ ব্যবহার করুন।
CI/CD-তে R8-এর সাথে বিল্ড স্বয়ংক্রিয় করতে, ম্যাপিং ফাইলগুলিকে বিল্ড আর্টিফ্যাক্ট হিসেবে সংরক্ষণ করা গুরুত্বপূর্ণ। প্রতিটি ম্যাপিং ফাইল ভার্সন নম্বর এবং বিল্ড ভেরিয়েন্টের সাথে সংযুক্ত হওয়া উচিত। Google আর্টিফ্যাক্ট ব্যবস্থাপনা সিস্টেমে APK/AAB-এর সাথে build/outputs/mapping/ আর্কাইভ করার সুপারিশ করে। এটি অ্যাপ্লিকেশনের যেকোনো ভার্সন থেকে ক্র্যাশ ডিঅবফাসকেট করার ক্ষমতা নিশ্চিত করবে।
Android কমিউনিটিতে R8 ব্যবহারের বছরের অভিজ্ঞতা প্রমাণিত অনুশীলনের একটি সেট তৈরি করেছে যা সাধারণ সমস্যা এড়াতে এবং টুল থেকে সর্বাধিক সুবিধা পেতে সাহায্য করে।
ProGuard থেকে R8-তে মাইগ্রেট করার সময়, AGP 7.x দিয়ে শুরু করার সুপারিশ করা হয়, যেখানে R8 ডিফল্টরূপে সক্ষম কিন্তু fullMode নিষ্ক্রিয়। ডিভাইস এবং দৃশ্যপটের সম্পূর্ণ সেটে বিল্ড স্থিতিশীলতা যাচাই করার পর, fullMode সক্ষম করা যেতে পারে। প্রতিটি ধাপে বিভিন্ন Android সংস্করণের শারীরিক ডিভাইসে রিলিজ বিল্ড পরীক্ষা করা প্রয়োজন।
R8 ম্যাপিং ফাইলগুলির ফরম্যাট ProGuard-এর মতো কিন্তু আরও বিস্তারিত বিশ্লেষণের কারণে বেশি তথ্য ধারণ করে। Google সুপারিশ করে: ম্যাপিং ফাইলগুলি অনির্দিষ্টকালের জন্য সংরক্ষণ করুন — পুরোনো ভার্সনের ক্র্যাশ ডিঅবফাসকেট করার জন্য এগুলির প্রয়োজন; স্বয়ংক্রিয় আপলোডের মাধ্যমে Firebase Crashlytics-এর সাথে ম্যাপিং ফাইল একীভূত করুন; নিয়মিত যাচাই করুন যে Firebase কনসোলে ডিঅবফাসকেশন ক্লাসের নাম সঠিকভাবে পুনরুদ্ধার করে।
R8 ফুল মোড সেই কোড সরাতে পারে যা প্রমিত মোডে পৌঁছানো যায় বলে বিবেচিত। পরীক্ষার জন্য গুরুত্বপূর্ণ ক্ষেত্র: WebView সহ স্ক্রিন (R8 ব্রিজ ইন্টারফেস ক্লাস সরাতে পারে), classLoader এর মাধ্যমে প্লাগইন সহ অ্যাপ্লিকেশন, অ্যানালিটিক্স এবং ক্র্যাশ রিপোর্টিং লাইব্রেরি এবং inflate এর মাধ্যমে তৈরি লেআউট ফাইলে কাস্টম ভিউ।
Google প্রতিটি বিল্ডে R8 প্রয়োগ করার পর APK আকার ট্র্যাক করার সুপারিশ করে। পৃথক উপাদানের আকার তুলনা করতে Android Studio-তে APK Analyzer ব্যবহার করুন: classes.dex, resources.arsc এবং নেটিভ কোড লাইব্রেরি। R8 DEX ফাইলের আকারকে অ-রৈখিকভাবে প্রভাবিত করতে পারে — কখনও কখনও আক্রমণাত্মক অপ্টিমাইজেশন ইনলাইনিংয়ের কারণে আকার বৃদ্ধির দিকে নিয়ে যায়। নিয়মিত মনিটরিং সময়মতো অসঙ্গতি সনাক্ত করতে এবং অস্পষ্টকরণ নিয়ম সামঞ্জস্য করতে সাহায্য করে।
// Firebase Crashlytics-এর জন্য সংরক্ষিত ক্লাসের উদাহরণ
@Keep
class CrashLogger {
fun logException(e: Throwable) {
FirebaseCrashlytics.getInstance().recordException(e)
}
}
// rules.pro — @Keep সহ সকল ক্লাস রাখুন
// -keep @androidx.annotation.Keep class * { *; }
প্রায়শই জিজ্ঞাসিত প্রশ্ন
না, R8 Android Gradle Plugin-এ নির্মিত এবং AGP আপডেট করার সময় স্বয়ংক্রিয়ভাবে ইনস্টল হয়। AGP 8.0 থেকে শুরু করে, ProGuard প্লাগইন থেকে সম্পূর্ণরূপে সরানো হয়েছে, এবং R8 একমাত্র টুল। AGP 7.x-এর জন্য, R8 ডিফল্টরূপে ব্যবহৃত হয়, কিন্তু ProGuard একটি বিকল্প হিসেবে থাকে। R8-এর আলাদা ইনস্টলেশন প্রয়োজন নেই — শুধু আপনার AGP ভার্সন আপডেট করুন।
R8 তিনটি কারণে দ্রুত: DEX কম্পাইলারে একীকরণ একটি অতিরিক্ত বাইটকোড পাস বাদ দেয়, মাল্টি-থ্রেডেড আর্কিটেকচার মাল্টি-কোর প্রসেসরের ভালো ব্যবহার করে এবং আরও বুদ্ধিমান রিচেবিলিটি বিশ্লেষণ প্রক্রিয়াকৃত কোডের পরিমাণ হ্রাস করে। মাঝারি আকারের প্রকল্পে Google পরীক্ষা অনুসারে, R8 12 সেকেন্ডে প্রসেসিং সম্পূর্ণ করে যেখানে ProGuard 18 সেকেন্ড নেয়।
AGP 7.x-এ, আপনি gradle.properties-এর মাধ্যমে R8 নিষ্ক্রিয় করতে পারেন: android.enableR8=false। AGP 8.0+-এ, ProGuard-এ ফিরে যাওয়া অসম্ভব কারণ প্লাগইন সম্পূর্ণরূপে R8-তে স্থানান্তরিত হয়েছে। যদি একটি প্রকল্প গুরুত্বপূর্ণভাবে ProGuard-এর নির্দিষ্ট আচরণের উপর নির্ভর করে, তাহলে AGP সংস্করণ 7.4-এ 锁定 করার সুপারিশ করা হয়, যেখানে উভয় টুল উপলব্ধ।
R8 Kotlin মেটাডেটার অন্তর্নির্মিত বিশ্লেষণের কারণে Kotlin করুটিন সঠিকভাবে হ্যান্ডেল করে। টুলটি Kotlin কম্পাইলার দ্বারা suspend ফাংশন, Continuation অবজেক্ট এবং StateMachine জেনারেশনের সিম্যান্টিক্স বোঝে। R8 প্রয়োজনীয় করুটিন ক্লাস সরিয়ে ফেলে না এবং নিরাপদ হলে সেগুলি অপ্টিমাইজ করতে পারে। Kotlin প্রকল্পের জন্য, সর্বাধিক অপ্টিমাইজেশনের জন্য fullMode সুপারিশ করা হয়।
মাইগ্রেশনের সময় সবচেয়ে সাধারণ সমস্যাগুলি: অনুপস্থিত ক্লাস — R8 সেই ক্লাসগুলি সরিয়ে ফেলে যা ProGuard রেখেছিল; ইনলাইনিং সমস্যা — আক্রমণাত্মক ইনলাইনিং রিফ্লেকশন ভেঙে দেয়; লাইব্রেরি অসামঞ্জস্যতা — পুরোনো ProGuard নিয়ম সহ লাইব্রেরি; ফুল মোড ক্র্যাশ — fullMode-এ অতিরিক্ত কোড সরানো। সমাধান: শারীরিক ডিভাইসে পরীক্ষা করুন, রিফ্লেকশনের জন্য -keep ব্যবহার করুন এবং ম্যাপিং ফাইলের মাধ্যমে স্ট্যাকট্রেস পরীক্ষা করুন।
সারাংশ
আমরা একটি মোবাইল অ্যাপ্লিকেশন টার্নকি তৈরি করব
IT Sectr 2017 সাল থেকে স্টার্টআপ এবং ব্যবসার জন্য iOS এবং Android অ্যাপ্লিকেশন তৈরি করে। আমরা আপনাকে পরামর্শ দেব এবং সেরা সমাধান প্রস্তাব করব।
আরও পড়ুন