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 Android کے لیے Google کی طرف سے تجویز کردہ واحد سرکاری مبہم کنندہ اور اصلاحی ٹول ہے۔
R8 ڈیولپرز کو طاقتور صلاحیتوں کا ایک سیٹ فراہم کرتا ہے جو کارکردگی میں ProGuard کو نمایاں طور پر پیچھے چھوڑ دیتا ہے۔ آئیے اہم خصوصیات پر نظر ڈالتے ہیں۔
R8 ایپلیکیشن کوڈ اور اس کے تمام انحصاروں کا عالمی تجزیہ کرتا ہے، انٹری پوائنٹس سے کال گراف کے ذریعے قابل رسائی کلاسز اور طریقوں کا تعین کرتا ہے۔ R8 کا تجزیہ کوڈ کی DEX نمائندگی تک رسائی کی وجہ سے ProGuard سے زیادہ درست ہے۔ R8 نہ صرف پوری کلاسز اور طریقوں کو، بلکہ انفرادی فیلڈز کو بھی ہٹا سکتا ہے جو کبھی استعمال نہیں ہوتے۔ Google کے ٹیسٹوں کے مطابق، R8 ایک ہی پروجیکٹس پر ProGuard کے مقابلے میں اوسطاً 15% زیادہ کوڈ ہٹاتا ہے۔
بلٹ ان ڈی شوگرنگ R8 کی ایک منفرد خصوصیت ہے جو ProGuard میں موجود نہیں ہے۔ R8 خود بخود lambda ایکسپریشنز، طریقوں کے حوالہ جات، ڈیفالٹ طریقوں والے انٹرفیس اور 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 کے مخصوص کنسٹرکٹس کو بہتر بناتا ہے: lambda، ان لائن فنکشنز، کوروٹینز اور 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 پروجیکٹس کے لیے، زیادہ سے زیادہ اصلاح کے لیے فل موڈ کی سفارش کی جاتی ہے۔
منتقلی کے دوران سب سے عام مسائل: گمشدہ کلاسز — R8 ان کلاسز کو ہٹاتا ہے جنہیں ProGuard رکھتا تھا؛ ان لائننگ کے مسائل — جارحانہ ان لائننگ ریفلیکشن کو توڑ دیتی ہے؛ لائبریری غیر مطابقت — پرانے ProGuard اصولوں والی لائبریریاں؛ فل موڈ کریش — fullMode میں اضافی کوڈ ہٹانا۔ حل: طبعی آلات پر ٹیسٹ کریں، ریفلیکشن کے لیے -keep استعمال کریں اور میپنگ فائل کے ذریعے اسٹیک ٹریس چیک کریں۔
خلاصہ
ہم ایک موبائل ایپلیکیشن ٹرنکی تیار کریں گے
IT Sectr 2017 سے اسٹارٹ اپس اور کاروبار کے لیے iOS اور Android ایپلیکیشنز بناتا ہے۔ ہم آپ کو مشورہ دیں گے اور بہترین حل تجویز کریں گے۔
مزید پڑھیں