R8 एक कंपाइलर और DEX-कोड ऑप्टिमाइज़ेशन टूल है जो बिल्ड चरण पर Android एप्लिकेशन का संपीड़न, डीसुगरिंग और ऑबफ़स्केशन करता है। Google Android Performance Team (2025) के अनुसार, R8 का उपयोग APK आकार को ProGuard की तुलना में औसतन 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 एप्लिकेशन बनाता है। हम आपको सलाह देंगे और सर्वोत्तम समाधान प्रस्तावित करेंगे।
यह भी पढ़ें