على الرغم من أنّ منطق اللعبة الأساسي في Unreal Engine مكتوب بلغة C++ أو Blueprints،
إلا أنّ حزمة Android تجمع رموز Java وKotlin الثنائية (classes.dex) للتعامل مع
GameActivity الأحداث التي تتم في مراحل النشاط و"خدمات Google Play" والفوترة والصوت
والمكوّنات الإضافية للإحصاءات.
R8، وهي أداة تقليص حجم الرموز البرمجية وتحسينها التلقائية في "المكوّن الإضافي لنظام Gradle المتوافق مع Android" (AGP)، تزيل الفئات والطُرق غير المستخدَمة وتحسِّن الرمز الثانوي. لا يؤدي ذلك إلى تقليل حجم تنزيل الحزمة فحسب، بل يقلّل أيضًا من استهلاك الذاكرة أثناء التشغيل لصفحات DEX التي تم ربطها بالذاكرة (mmap) والعبء الإضافي لعملية Java الأساسية، ما يخفّف من الضغط على الذاكرة الفعلية وعمليات الإيقاف التي تتم من خلال أداة إغلاق التطبيقات بسبب نقص الذاكرة (LMK). يراقب Google Play أيضًا مستويات تحسين DEX في لعبتك
من خلال مقياس تحسين رمز DEX في "مؤشرات Android الحيوية".
الإعدادات التلقائية وإصدارات Unreal Engine المتوافقة
بدءًا من الإصدار UE 4.22.0، يُدخِل UEDeployAndroid.cs في Unreal Engine تلقائيًا السمة minifyEnabled true في إعدادات تصميم بنية إصدار Android الذي تم إنشاؤه (buildAdditions.gradle). بما أنّ الإصدار UE 4.25 قد تمّت فيه ترقية حزمة الأدوات المضمّنة إلى الإصدار 4.0.0 من المكوّن الإضافي لنظام Gradle المتوافق مع Android، يتم تفعيل R8 تلقائيًا (true) في جميع إصدارات UE 4.25 والإصدارات الأحدث بدون الحاجة إلى إجراء أي إعدادات إضافية.
| إصدار Unreal Engine | مكوّن إضافي مُجمَّع لـ Gradle على Android | الإصدار التلقائي | الإعداد التلقائي لتصحيح الأخطاء | السلوك |
|---|---|---|---|---|
| الإصدار 4.21 من UE والإصدارات الأقدم | Gradle أو Ant القديم | تم إيقاف الميزة (false) |
تم إيقاف الميزة (false) |
لم يتم إدخال أي إعدادات minifyEnabled من قِبل المحرّك. |
| UE 4.22 إلى 4.24 | أقدم من 3.4 | مفعَّل (ProGuard) | تم إيقاف الميزة (false) |
يتم تفعيل minifyEnabled true تلقائيًا في بنية الإصدار (يتم تشغيل ProGuard). |
| الإصدارات من 4.25 إلى 5.3 من UE | 4.0.0 | مفعَّل (R8) | تم إيقاف الميزة (false) |
يستخدم الإصدار 4.0 من "المكوّن الإضافي لنظام Gradle المتوافق مع Android" R8 تلقائيًا في بُنى الإصدار. |
| UE 5.4 إلى 5.7 | 7.4.2 | مفعَّل (R8) | تم إيقاف الميزة (false) |
يزيل الإصدار 7.x من "المكوّن الإضافي لنظام Gradle المتوافق مع Android" خيارات useProguard القديمة، ويتم تشغيل R8 حصريًا. |
| UE 5.8 (5.8.3+) | 8.13.0 | مفعَّلة (R8) | تم إيقاف الميزة (false) |
يستخدم الإصدار 8.x من المكوّن الإضافي لنظام Gradle المتوافق مع Android (AGP) ومسارات تحسين R8 الحديثة تلقائيًا. |
الاختلافات بين الإصدار النهائي والإصدار المخصص لتصحيح الأخطاء
تضبط أداة UnrealBuildTool (UEDeployAndroid.cs) ملف buildAdditions.gradle الذي تم إنشاؤه بشكل مختلف لإصدارات الإصدار وتصحيح الأخطاء:
buildTypes {
release {
signingConfig signingConfigs.release
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
}
debug {
debuggable true
signingConfig signingConfigs.debug
}
}
- الإصدار (الشحن أو التوزيع): يضبط
minifyEnabled trueويطبّقproguard-rules.proتلقائيًا، ويشغّل تقليص حجم الرموز وإخفائها في R8. - تصحيح الأخطاء (التطوير): يتيح هذا الخيار استخدام
debuggable trueويتجاهلminifyEnabled(يتم ضبطه تلقائيًا علىfalse) للحفاظ على تكرار عملية الإنشاء السريع وتصحيح أخطاء الرموز.
إضافة قواعد الاحتفاظ باستخدام لغة المكوّنات الإضافية في Unreal (UPL)
بما أنّ أداة R8 تعمل تلقائيًا على بُنى الإصدار في UE 4.25 والإصدارات الأحدث، يجب الحفاظ على فئات Java التي يتم الوصول إليها فقط من خلال واجهة JNI في لغة C++ (JNIEnv->FindClass، GetMethodID) أو ملف البيان. يتم التعامل مع الفئات التي لا تحتوي على مواقع استدعاء Java على أنّها غير مستخدَمة ويتم تجريدها بواسطة R8، ما قد يؤدي إلى تعذُّر عمل الميزات التي تعمل في إصدارات التطوير مع ClassNotFoundException أو NoSuchMethodError في إصدارات الشحن.
استخدِم علامة <proguardAdditions> في ملف XML الخاص بـ Unreal Plugin Language
(UPL) لدمج قواعد الاحتفاظ المخصّصة في
proguard-rules.pro أثناء عملية الحزم. أضِف المجموعة التالية إلى ملف *_UPL.xml الخاص بمشروعك أو المكوّن الإضافي:
<root xmlns:android="http://schemas.android.com/apk/res/android">
<proguardAdditions>
<insert>
-keep class com.epicgames.unreal.** { *; }
-keep class com.example.plugin.** { public *; }
-dontwarn com.example.plugin.**
</insert>
</proguardAdditions>
</root>
تحديد المشاكل الشائعة وحلّها
يصف هذا القسم كيفية حلّ المشاكل الشائعة المتعلّقة بالحزم ووقت التشغيل عند استخدام R8 في Unreal Engine.
إيقاف R8 مؤقتًا لتصحيح الأخطاء
To isolate whether a Release-only crash is caused by R8 stripping required
classes, insert DISABLE_MINIFY=1 under <gradleProperties> in your UPL file.
عند توفّر السمة UEDeployAndroid.cs، يتم إنشاء السمة minifyEnabled false:
<gradleProperties>
<insert>
DISABLE_MINIFY=1
</insert>
</gradleProperties>
Missing classes detected while running R8 خطأ في التغليف
في الإصدار 5.4 من UE والإصدارات الأحدث (الإصدار 7.4.2 من AGP والإصدارات الأحدث)، يفرض R8 عمليات تحقّق صارمة من الفئات غير المتوفّرة. إذا تعذّر إنشاء الحزمة بسبب هذا الخطأ، افحص missing_rules.txt في دليل الإصدار الوسيط (ضمن Intermediate/Android/.../gradle/app/build/outputs/mapping/release/missing_rules.txt) وأضِف تبعيات المكتبة غير المتوفّرة أو القواعد المطلوبة إلى <proguardAdditions> في ملف UPL.
توافق الوضع الكامل لأداة R8 مع حِزم SDK التابعة لجهات خارجية
في الإصدار 5.8 من UE والإصدارات الأحدث (الإصدار 8.13.0 من AGP والإصدارات الأحدث)، يتم تفعيل الوضع الكامل لـ R8 تلقائيًا لإجراء تحسينات أكثر قوة. إذا تعذّر تشغيل حزمة تطوير برامج (SDK) قديمة تابعة لجهة خارجية على Android أثناء التشغيل بسبب مشاكل في الانعكاس، يُرجى تعديل قواعد ProGuard الخاصة بالمكوّن الإضافي أو إعادة R8 إلى وضع التوافق من خلال إضافة السمة التالية إلى ملف UPL:
<gradleProperties>
<insert>
android.enableR8.fullMode=false
</insert>
</gradleProperties>