إنّ حلّ أخطاء ANR في لعبة Unity هي عملية منهجية:

دمج خدمات إعداد التقارير
توفّر خدمات إعداد التقارير، مثل مؤشرات Android الحيوية وFirebase Crashlytics وBacktrace (شريك معتمد في Unity ) إمكانية تسجيل الأخطاء وتحليلها في لعبتك على نطاق واسع. دمج حِزم تطوير البرامج (SDK) لخدمات إعداد التقارير في لعبتك في مرحلة مبكرة من دورة التطوير تحليل خدمة إعداد التقارير التي تناسب احتياجات لعبتك وميزانيتك على أفضل نحو
تختلف طرق تسجيل أخطاء ANR في خدمات إعداد التقارير المختلفة. يمكنك تضمين خدمة إعداد تقارير ثانية لزيادة فرصة الحصول على بيانات صالحة لدعم قرارك في حلّ أخطاء ANR.
لا يؤثّر دمج حِزم تطوير البرامج (SDK) لإعداد التقارير في أداء اللعبة أو حجم حزمة APK.
تحليل الرموز
حلِّل التقارير الواردة من خدمة إعداد التقارير وتحقّق مما إذا كانت عمليات تتبُّع تسلسل استدعاء الدوال البرمجية بتنسيق يمكن لشخص عادي قراءته. اطّلِع على مقالة ترميز الأعطال ورسائل ANR في ألعاب Unity على Android للحصول على مزيد من المعلومات.

libil2cpp.so
غير المتوفّرة.كيفية التحقّق من رقم تعريف إنشاء الرمز
إذا كان نظام إعداد التقارير يعرض رقم تعريف الإصدار غير المتوفّر ولكن رموز الإصدار لا تزال متوفّرة في مساحة تخزين جهاز الإنشاء، من الممكن التحقّق من رقم تعريف الإصدار لرموز الإصدار ثم تحميلها إلى خدمة إعداد التقارير. بخلاف ذلك، يجب إنشاء إصدار جديد لتحميل ملفات الرموز.
على نظام التشغيل Windows أو macOS:
- انتقِل إلى مجلد الرموز استنادًا إلى الخلفية
لكتابة النصوص البرمجية (راجِع الحل:)
- استخدِم الأمر التالي (على نظام التشغيل Windows، استخدِم Cygwin لتشغيل
أداة
readelf
). - استخدام Grep اختياري لفلترة إخراج النص
- ابحث عن رقم تعريف الإصدار.
- استخدِم الأمر التالي (على نظام التشغيل Windows، استخدِم Cygwin لتشغيل
أداة
readelf -n libil2cpp.so | grep 'Build ID'
Build ID: b42473fb7449e44e0182dd1f580c99bab0cd8a95
فحص رمز اللعبة
عندما يعرض تتبع تسلسل استدعاء الدوالّ وظيفة في مكتبة libil2cpp.so
،
يعني ذلك أنّ الخطأ حدث في رمز C# الذي تم تحويله إلى C++.
لا تتضمّن مكتبة libil2cpp.so
رمز لعبتك فقط، بل تتضمّن أيضًا المكوّنات الإضافية والحِزم.
يتبع اسم ملف C++ اسم التجميع المحدَّد في مشروع Unity.
بخلاف ذلك، يحمل اسم الملف الاسم التلقائي لـ Assembly-C#. على سبيل المثال، يعرِض الشكل 3 الخطأ في الملف Game.cpp
(مميّز باللون الأزرق)، وهو اسم التعريف المحدّد في ملف تعريف التجميع. Logger
هو اسم
الفئة (مميّز باللون الأحمر) في النص البرمجي C#، متبوعًا باسم
الدالة (مميّز باللون الأخضر). أخيرًا، الاسم الكامل
الذي أنشأه محوِّل IL2CPP (مميّز باللون البرتقالي).

تحقّق من رمز لعبتك باتّباع الخطوات التالية:
- راجِع مشروع C# بحثًا عن أي رمز مشبوه. لا تؤدي عادةً أخطاء C# الغير المُعالجة إلى حدوث خطأ ANR أو تعطُّل التطبيق. ومع ذلك، تأكَّد من أنّ الرمز البرمجي يعمل بشكل صحيح في حالات مختلفة. تحقَّق مما إذا كان الرمز المبرمَج يستخدم وحدة محرّك تابع لجهة خارجية، وحلل ما إذا كان الإصدار الأخير قد أدّى إلى ظهور الخطأ. بالإضافة إلى ذلك، راجِع ما إذا كنت قد أجريت مؤخرًا تحديثًا لتطبيق Unity أو ما إذا كان الخطأ يحدث على أجهزة معيّنة فقط.
- صدِّر اللعبة كمشروع في "استوديو Android". من خلال الاطّلاع الكامل على رمز المصدر C# المحوَّل للعبة، يمكنك العثور على الدالة التي تتسبّب في حدوث خطأ ANR. يبدو أنّ رمز C++ مختلف جدًا عن رمز C#، ويندر أن تحدث مشكلة في عملية تحويل الرمز. إذا عثرت على أي مشكلة، يُرجى إرسال طلب دعم إلى Unity.
- راجِع رمز المصدر الخاص باللعبة وتأكَّد من إزالة أي منطق يتم تنفيذه في دالّتَي callback
OnApplicationFocus() وOnApplicationPause()
بشكلٍ مناسب.
- يفرض محرّك Unity مهلة لإيقاف تنفيذه مؤقتًا، ويمكن أن تؤدي زيادة عبء العمل في عمليات الاستدعاء هذه إلى حدوث خطأ ANR.
- أضِف سجلات أو مسار تنقّل إلى أجزاء من الرمز البرمجي لتحسين تحليل البيانات.
- استخدِم Unity Profiler للتحقيق في أداء اللعبة. يمكن أن يكون تحليل أداء تطبيقك أيضًا طريقة رائعة للمساعدة في تحديد المؤثرات السلبية التي قد تتسبب في حدوث خطأ ANR.
- من الطرق الرائعة لتحديد العمليات الطويلة المتعلّقة بوحدات الإدخال والإخراج في سلسلة التعليمات الرئيسية هي استخدام الوضع الصارم.
- حلِّل سجلّ Android Vitals أو سجلّ خدمة الإبلاغ الأخرى، وتحقّق من إصدارات اللعبة التي يحدث فيها الخطأ بشكلٍ متكرّر. راجِع رمز المصدر في سجلّ التحكّم بالإصدارات وقارِن بين التغييرات في الرمز بين الإصدارات. إذا لاحظت أي تغيير مريب، جرِّب كل تغيير أو حلّ محتمل على حدة.
- راجِع سجلّ إعداد تقارير أخطاء ANR على Google Play للأجهزة وإصدارات Android التي تتلقّى أكبر عدد من أخطاء ANR. إذا كانت الأجهزة أو الإصدارات قديمة، من المحتمل أن تتمكّن من تجاهلها بأمان إذا لم يؤدّ ذلك إلى التأثير في أرباح اللعبة. راجِع البيانات بعناية لأنّ مجموعة معيّنة من المستخدمين لن تتمكّن مجددًا من تشغيل لعبتك. لمزيد من المعلومات، يُرجى الاطّلاع على لوحة بيانات التوزيع.
- راجِع رمز المصدر الخاص باللعبة للتأكّد من عدم استدعاء أي رمز قد يؤدي إلى حدوث مشكلة، على سبيل المثال، يمكن أن يؤدي finish إلى تدمير اللعبة إذا لم يتم استخدامه بشكل صحيح. اطّلِع على دلائل مطوّري تطبيقات Android لمزيد من المعلومات عن تطوير تطبيقات Android.
- بعد مراجعة البيانات وتصدير إصدار اللعبة إلى "استوديو Android"، ستتعامل مع رمز C وC++، ويمكنك بالتالي الاستفادة إلى أقصى حد من الأدوات التي تتجاوز الحلول العادية في Unity، مثل أداة تحليل الذاكرة في Android وأداة تحليل وحدة المعالجة المركزية في Android و perfetto.
رمز محرّك Unity
لمعرفة ما إذا كان هناك خطأ ANR في محرّك Unity، تحقّق من رمز libUnity.so
أو libMain.so
في قوائم تتبُّع تسلسل استدعاء الدوال البرمجية. إذا عثرت على الجهاز، اتّبِع الخطوات التالية:
- أولاً، ابحث في قنوات المنتدى (منتديات Unity ومناقشات Unity وStackoverflow).
- إذا لم تعثر على أي معلومات، يمكنك إرسال تقرير عن خلل لحلّ المشكلة. قدِّم تتبع تسلسل استدعاء الدوال البرمجية الرمزي ليتمكّن مهندسو المحرّك من فهم الخطأ بشكلٍ أفضل وحلّه.
- تحقَّق مما إذا كان أحدث إصدار من Unity LTS قد أجرى تحسينات على المشاكل التي تواجهك. إذا كان الأمر كذلك، عليك ترقية اللعبة لاستخدام هذا الإصدار. (قد لا يكون هذا الحلّ متاحًا إلا لبعض المطوّرين).
- إذا كان الرمز البرمجي يستخدم
Activity
مخصّصًا بدلاً من الرمز التلقائي، راجِع رمز Java للتأكّد من أنّ النشاط لا يتسبب في أي مشاكل.
حزمة تطوير البرامج (SDK) التابعة لجهة خارجية
- تأكَّد من أنّ جميع المكتبات التابعة لجهات خارجية محدَّثة ولا تحتوي على تقارير عن الأعطال أو أخطاء ANR في أحدث إصدار من Android.
- انتقِل إلى منتديات Unity لمعرفة ما إذا تم حلّ أي أخطاء في إصدار لاحق أو ما إذا كان قد تم توفير حل بديل من قِبل Unity أو أحد أعضاء المنتدى.
- راجِع تقرير أخطاء ANR على Google Play وتأكَّد من أنّه لم ترصد Google الخطأ من قبل. تدرك Google بعض أخطاء ANR وتعمل بنشاط على حلّها.
مكتبة النظام
لا يمكن للمطوّر عادةً التحكّم في مكتبات النظام، ولكنها لا تمثل نسبة كبيرة من أخطاء ANR. إنّ أخطاء ANR في مكتبة النظام صعب حلّها، ولا يمكن حلّها إلا من خلال التواصل مع مطوّر المكتبة أو إضافة سجلّات لتضييق نطاق المشكلة.
أسباب الخروج
ApplicationExitInfo
هي واجهة برمجة تطبيقات Android لفهم أسباب أخطاء ANR.
إذا كانت لعبتك تستخدم Unity 6 أو إصدارًا أحدث، يمكنك الاتصال بالرقم ApplicationExitInfo
مباشرةً. بالنسبة إلى الإصدارات القديمة من Unity، عليك تنفيذ المكوّن الإضافي الخاص بك
لتفعيل مكالمات ApplicationExitInfo
من Unity.
يستخدم Crashlytics أيضًا ApplicationExitInfo
، ولكنّ تنفيذك الخاص
يمنحك إمكانية التحكّم بشكل أدق ويتيح لك تضمين
معلومات أكثر صلة.