على الرغم من أنّ منطق اللعبة الأساسي في Unity مكتوب بلغة C# (مجمَّع باستخدام IL2CPP)،
فإنّ إصدارات Android تتضمّن رمز بايت كبيرًا بلغتَي Java وKotlin (classes.dex)
للتعامل مع UnityPlayerActivity الأحداث التي تتم في مراحل النشاط و"خدمات Google Play" والفوترة
والإعلانات وحِزم تطوير البرامج (SDK) للشبكات الاجتماعية.
يؤدي تفعيل R8، وهي أداة تقليص حجم الرموز البرمجية وتحسينها التلقائية في المكوّن الإضافي لنظام Gradle المتوافق مع Android (AGP)، إلى إزالة الفئات والطرق غير المستخدَمة وتحسين الرمز الثانوي. لا يؤدي ذلك إلى تقليل حجم تنزيل تطبيقك فحسب، بل يقلّل أيضًا من استهلاك الذاكرة أثناء التشغيل لصفحات DEX التي تم ربطها بالذاكرة (mmap) والعبء الإضافي لعملية Java الأساسية، ما يخفّف من الضغط على الذاكرة الفعلية وعمليات الإنهاء التي تتم من خلال برنامج إنهاء العمليات عند انخفاض الذاكرة (LMK). يراقب Google Play أيضًا مستويات تحسين DEX في لعبتك
من خلال مقياس تحسين رمز DEX في "مؤشرات Android الحيوية".
الإعداد التلقائي وإصدارات Unity المتوافقة
في Unity، تكون ميزة إزالة البيانات غير الضرورية من الرموز غير مفعَّلة تلقائيًا (false) لكل من
الإصدارات النهائية والإصدارات المخصصة لتصحيح الأخطاء عند إنشاء مشروع جديد.
قدّمت Unity لأول مرة R8 كخيار تبديل في الإصدار 2020.1.0f1 من Unity. بدءًا من الإصدار Unity 2022.2.0f1 (والإصدارات السابقة حتى الإصدار Unity 2021.3.41f1 LTS)، رقّت Unity حزمة الأدوات المضمّنة إلى الإصدار 7.1.2 من "المكوّن الإضافي لنظام Gradle المتوافق مع Android" أو الإصدارات الأحدث، وأزالت التوافق مع الإصدار القديم من ProGuard، وتشغّل R8 حصريًا عند تفعيل ميزة "إزالة البيانات غير الضرورية".
| إصدار Unity | مكوّن إضافي مُجمَّع لـ Gradle في Android | الإصدار التلقائي | دعم R8 والإعدادات المطلوبة |
|---|---|---|---|
| الإصدار 2019.4 LTS والإصدارات الأقدم | أقدم من 3.4 | تم إيقاف الميزة (false) |
غير متاح (ProGuard القديم فقط) |
| من 2020.1.0f1 إلى 2021.3.40f1 | 3.4 إلى 4.0 | تم إيقاف الميزة (false) |
اختياري (الإعداد التلقائي هو ProGuard). فعِّل كلاً من تصغير > إصدار واستخدام R8. |
| الإصدار 2021.3.41f1 والإصدارات الأحدث (الإصدار 2021 LTS) | 7.1 أو إصدار أحدث | تم إيقاف الميزة (false) |
R8 فقط: فعِّل تصغير > إصدار لتشغيل R8 تلقائيًا. |
| من الإصدار 2022.2.0f1 إلى الإصدار Unity 6 والإصدارات الأحدث | من 7.1 إلى 8.x | تم إيقاف الميزة (false) |
R8 فقط: فعِّل تصغير > إصدار لتشغيل R8 تلقائيًا. |
تفعيل R8 في إعدادات المشغّل
لتفعيل ميزتَي تخفيض حجم الرموز وتحسينها باستخدام R8 في بنية الإصدار:
- في محرِّر Unity، افتح تعديل (Edit) > إعدادات المشروع (Project Settings) واختَر اللاعب (Player).
- انقر على علامة التبويب Android ووسِّع إعدادات النشر (Publishing Settings) > الإصدار (Build).
- ضمن قسم تصغير، اضبط خيارات إصدار Unity:
- الإصدار 2021.3.41f1 من Unity أو إصدار أحدث والإصدار 2022.2.0f1 أو إصدار أحدث: اختَر الإصدار. يشغّل Unity أداة R8 تلقائيًا أثناء تنفيذ مهمة
minifyReleaseWithR8في Gradle. - الإصدارات من Unity 2020.1.0f1 إلى 2021.3.40f1: اختَر كلاً من الإصدار واستخدام R8.
- الإصدار 2021.3.41f1 من Unity أو إصدار أحدث والإصدار 2022.2.0f1 أو إصدار أحدث: اختَر الإصدار. يشغّل Unity أداة R8 تلقائيًا أثناء تنفيذ مهمة
إذا كنت تستخدم عمليات الإنشاء المبرمَجة من خلال نصوص برمجية في محرِّر C# ، يمكنك ضبط هذه السمات من خلال PlayerSettings.Android:
using UnityEditor;
public static class AndroidBuildConfig
{
public static void EnableR8ForRelease()
{
PlayerSettings.Android.minifyRelease = true;
// Required only in Unity 2020.1.0f1 to 2021.3.40f1 and 2022.1 or earlier
// (In Unity 2021.3.41f1+ and 2022.2+, R8 is always used when minification is enabled)
#if !UNITY_2022_2_OR_NEWER
PlayerSettings.Android.minifyWithR8 = true;
#endif
}
}
إضافة قواعد الاحتفاظ لـ JNI والانعكاس
لا تتضمّن فئات Java والطرق التي يتم استدعاؤها ديناميكيًا من نصوص C# البرمجية باستخدام AndroidJavaClass أو AndroidJavaObject أي مواقع استدعاء ثابتة في Java. بدون قواعد الاحتفاظ الصريحة، قد يعتبر R8 هذه الفئات غير مستخدمة ويجرّدها أو يعيد تسميتها.
للحفاظ على جسور Java المخصّصة:
- في إعدادات المشروع > المشغّل > Android > إعدادات النشر > إنشاء، فعِّل ملف Proguard المخصّص.
- افتح ملف
Assets/Plugins/Android/proguard-user.txtالذي تم إنشاؤه. - أضِف قواعد
-keepللفئات التي يتم الوصول إليها عبر JNI أو التي تتطلبها المكوّنات الإضافية التابعة لجهات خارجية:
# Keep custom Java classes invoked from C# using JNI bridges
-keep class com.example.yourgame.** { *; }
# Keep callback interfaces passed between C# and Java
-keep interface com.example.yourgame.IPluginCallback { *; }
تحديد المشاكل الشائعة وحلّها
يصف هذا القسم كيفية حلّ المشاكل الشائعة في عملية الإنشاء ووقت التشغيل عند استخدام R8 في Unity.
Missing classes detected while running R8 خطأ في الإصدار
في إصدارات Unity التي تستخدم الإصدار 7.0 من AGP والإصدارات الأحدث (2021.3.41f1+ و2022.2+)، يفرض R8
عمليات تحقّق صارمة من الفئات المفقودة. إذا تعذّر إنشاء ملف بسبب هذا الخطأ، يُرجى فحص
ملف missing_rules.txt الذي تم إنشاؤه في دليل مخرجات الإصدار (ضمن
Library/Bee/Android/Prj/.../build/outputs/mapping/release/missing_rules.txt أو
Temp/gradleOut/...) وإضافة التبعيات أو القواعد المطلوبة إلى
proguard-user.txt. لمزيد من المعلومات حول كتابة قواعد الاحتفاظ، يُرجى الاطّلاع على تخصيص الرموز التي يجب الاحتفاظ بها.
توافق الوضع الكامل لأداة R8 مع المكوّنات الإضافية التابعة لجهات خارجية
في الإصدار 8.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android والإصدارات الأحدث (الإصدار 6 من Unity والإصدارات الأحدث)، يتم تفعيل الوضع الكامل لأداة R8 تلقائيًا لإجراء تحسينات أكثر قوة. إذا تعذّر تشغيل مكوّن إضافي قديم متوافق مع Android في وقت التشغيل بسبب مشاكل في الانعكاس، يمكنك تعديل قواعد ProGuard الخاصة بالمكوّن الإضافي أو إعادة R8 إلى وضع التوافق:
- في إعدادات النشر > إنشاء، فعِّل نموذج خصائص Gradle المخصّص.
- افتح
Assets/Plugins/Android/gradleTemplate.propertiesوأضِف السمة التالية:
android.enableR8.fullMode=false