R8 هو مُجمِّع وأداة تحسين لرمز DEX، يقوم بالضغط وإزالة السكر وتشويش تطبيقات Android أثناء مرحلة البناء. وفقًا لفريق أداء Android من Google (2025)، استخدام R8 يقلل حجم APK بمتوسط 18% مقارنة بـ ProGuard ويقلص وقت البناء بنسبة 30%. بدءًا من Android Gradle Plugin 8.0، حل R8 بالكامل محل ProGuard كأداة التشويش القياسية.
النقاط الرئيسية
R8 هو برنامج معالجة وتحويل البايت كود طُوِّر بواسطة Google كبديل لـ ProGuard في نظام Android البيئي. على عكس ProGuard الذي يعمل كأداة منفصلة في مرحلة ملفات class، فإن R8 مدمج مباشرة في مُجمِّع DEX (D8/R8). هذا يسمح لـ R8 بإجراء التحليل والتحسين على مستوى أعمق، لا يمكن للأدوات الخارجية الوصول إليه.
R8 يستقبل البايت كود الخاص بـ Java في شكل ملفات class أو أرشيفات JAR ويحوله إلى كود 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 أكثر دقة من ProGuard بفضل الوصول إلى تمثيل DEX للكود. يمكن لـ R8 إزالة ليس فقط الفئات والطرق بأكملها، ولكن أيضاً الحقول الفردية التي لا تُستخدم أبداً. وفقًا لاختبارات Google، يزيل R8 في المتوسط 15% كوداً أكثر من ProGuard في نفس المشاريع.
إزالة السكر المدمجة هي ميزة فريدة لـ R8 غير موجودة في ProGuard. يقوم R8 تلقائياً بتحويل تعابير lambda ومراجع الطرق والواجهات ذات الطرق الافتراضية و try-with-resources الخاصة بـ Java 8+ إلى كود متوافق مع الإصدارات السابقة يعمل على جميع مستويات API في Android. هذا يوفر على المطور عناء إضافة مكتبة منفصلة desugar_jdk_libs وتكوين إزالة السكر يدوياً.
نظراً لأن R8 يرى تنسيق DEX النهائي، يمكنه إجراء تحسينات مستحيلة لـ ProGuard. يقوم R8 بدمج ثوابت السلسلة المتطابقة، وإزالة الاستثناءات غير المستخدمة، وتحسين تركيبات switch وإجراء التضمين العدواني مع إعادة كتابة رسم بياني للاستدعاءات. هذه التحسينات لا تقلل حجم APK فحسب، بل تُحسِّن أيضاً أداء تنفيذ الكود على ART.
// تفعيل R8 صراحةً في build.gradle (اختياري في 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+ | نعم (قياسي) | لا (تمت الإزالة) |
اختبارات Google على عينة من 100 تطبيق مشهور في Play Store أظهرت أن R8 يقلل حجم APK بمتوسط 18% مقارنة بـ ProGuard. في بعض المشاريع ذات الاستخدام المكثف لصياغة Java 8+ والمكتبات الخارجية، وصل الفرق إلى 28%. لتطبيق بحجم 40 ميغابايت، هذا يعني توفيراً من 5 إلى 11 ميغابايت، وهو أمر بالغ الأهمية للمستخدمين ذوي النطاق الترددي المحدود.
كلا الأداتين تتعاملان بشكل صحيح مع كود Kotlin، لكن R8 يُحسِّن بشكل أفضل التركيبات الخاصة بـ Kotlin: تعابير lambda، والدوال المضمنة، والروتينات المساعدة والأنواع الآمنة من null. R8 يفهم دلالات بيانات Kotlin الوصفية ويمكنه إزالة فحوصات null غير الضرورية بأمان وتضمين الدوال المضمنة. لمشاريع Kotlin، R8 هو الأداة الموصى بها من Google.
إعداد R8 يتطلب تغييرات طفيفة في تكوين البناء، حيث أنه في AGP 8.0+ يتم استخدام الأداة افتراضياً. دعنا نستعرض الجوانب الرئيسية للتكوين.
الوضع الكامل لـ R8 (android.enableR8.fullMode=true) يُفعِّل تحسينات أكثر عدوانية توفر تقليلاً إضافياً بنسبة 5-10% في حجم APK. في هذا الوضع، يُجري 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 بـ: التحقق من ملف mapping لإزالة تشويش تتبع المكدس، تعطيل fullMode مؤقتاً لعزل المشكلة، إضافة -whyareyoukeeping لفهم سبب عدم إزالة فئة ما، واستخدام علامة --info الخاصة بـ Gradle للحصول على سجل مفصّل لمعالجة R8.
لأتمتة البناء مع R8 في CI/CD، من المهم حفظ ملفات mapping كأعمال فنية للبناء. يجب ربط كل ملف mapping برقم الإصدار ومتغير البناء. توصي Google بأرشفة build/outputs/mapping/ مع APK/AAB في نظام إدارة الأعمال الفنية. هذا سيضمن القدرة على إزالة تشويش الأعطال من أي إصدار من التطبيق.
سنوات من الخبرة في استخدام R8 في مجتمع Android أنتجت مجموعة من الممارسات المثبتة التي تساعد في تجنب المشكلات النموذجية والحصول على أقصى فائدة من الأداة.
عند الانتقال من ProGuard إلى R8، يُوصى بالبدء مع AGP 7.x، حيث يكون R8 مُفعَّلاً افتراضياً ولكن fullMode معطل. بعد التحقق من استقرار البناء على مجموعة كاملة من الأجهزة والسيناريوهات، يمكن تفعيل fullMode. كل مرحلة تتطلب اختبار بناء الإصدار على أجهزة فعلية بإصدارات مختلفة من Android.
ملفات mapping الخاصة بـ R8 لها نفس تنسيق ProGuard ولكنها تحتوي على معلومات أكثر بفضل التحليل الأكثر تفصيلاً. توصي Google بـ: تخزين ملفات mapping إلى أجل غير مسمى — فهي ضرورية لإزالة تشويش أعطال الإصدارات القديمة؛ دمج ملفات mapping مع Firebase Crashlytics من خلال التحميل التلقائي؛ التحقق بانتظام من أن إزالة التشويش في وحدة تحكم Firebase تستعيد أسماء الفئات بشكل صحيح.
الوضع الكامل لـ R8 قد يزيل كوداً يُعتبر قابلاً للوصول في الوضع القياسي. المجالات الحرجة للاختبار: الشاشات التي تحتوي على WebView (قد يزيل R8 فئات واجهات bridge)، التطبيقات ذات الإضافات عبر classLoader، مكتبات التحليلات والإبلاغ عن الأعطال وطرق العرض المخصصة في ملفات التخطيط التي يتم إنشاؤها عبر inflate.
توصي Google بتتبع حجم APK بعد تطبيق R8 في كل بناء. استخدم APK Analyzer في Android Studio لمقارنة حجم المكونات الفردية: 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 ثانية مقابل 18 ثانية لـ ProGuard.
في AGP 7.x، يمكنك تعطيل R8 عبر gradle.properties: android.enableR8=false. في AGP 8.0+، العودة إلى ProGuard مستحيلة لأن الإضافة انتقلت بالكامل إلى R8. إذا كان المشروع يعتمد بشكل حاسم على سلوك ProGuard المحدد، يُوصى بتثبيت AGP على الإصدار 7.4، حيث تتوفر كلتا الأداتين.
R8 يتعامل بشكل صحيح مع الروتينات المساعدة في Kotlin بفضل التحليل المدمج لبيانات Kotlin الوصفية. تفهم الأداة دلالات دوال suspend وكائنات Continuation وتوليد StateMachine بواسطة مُجمِّع Kotlin. لا يزيل R8 فئات الروتينات المساعدة الضرورية ويمكنه تحسينها عندما يكون ذلك آمناً. لمشاريع Kotlin، يُوصى باستخدام الوضع الكامل للحصول على أقصى تحسين.
أكثر المشكلات شيوعاً أثناء الترحيل: الفئات المفقودة — يزيل R8 فئات كان ProGuard يبقيها؛ مشكلات التضمين — التضمين العدواني يكسر الانعكاس؛ عدم توافق المكتبات — مكتبات ذات قواعد ProGuard قديمة؛ أعطال الوضع الكامل — إزالة كود إضافية في fullMode. الحل: الاختبار على أجهزة فعلية، استخدام -keep للانعكاس والتحقق من تتبع المكدس عبر ملف mapping.
الخلاصة
سنقوم بتطوير تطبيق جوال جاهز
تقدم IT Sectr تطبيقات iOS وAndroid للشركات الناشئة والشركات منذ عام 2017. سوف نقدم لك النصح ونقترح أفضل حل.