تصحيح أخطاء ANR

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

الشكل 1. خطوات حلّ أخطاء ANR في ألعاب Unity

دمج خدمات إعداد التقارير

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

تختلف طرق تسجيل أخطاء ANR في خدمات إعداد التقارير المختلفة. يمكنك تضمين خدمة إعداد تقارير ثانية لزيادة فرص الحصول على بيانات صالحة لدعم قرارك في حلّ أخطاء ANR.

لا يؤثّر دمج حِزم تطوير البرامج (SDK) لإعداد التقارير في أداء اللعبة أو حجم حزمة APK.

تحليل الرموز

حلِّل التقارير الواردة من خدمة إعداد التقارير وتحقّق مما إذا كانت عمليات تتبُّع تسلسل استدعاء الدوال البرمجية بتنسيق يمكن لشخص عادي قراءته. اطّلِع على مقالة ترميز أخطاء تتعلّق بنظام Android وأخطاء ANR في ألعاب Unity للحصول على مزيد من المعلومات.

الشكل 2. تعرِض Crashlytics رقم تعريف الإصدار والرموز libil2cpp.so غير المتوفّرة.

كيفية التحقّق من رقم تعريف إنشاء الرمز

إذا كان نظام إعداد التقارير يعرض رقم تعريف الإصدار غير المتوفّر ولكن رموز الإصدار لا تزال متوفّرة في مساحة تخزين جهاز الإنشاء، من الممكن التحقّق من رقم تعريف الإصدار لرموز الإصدار ثم تحميلها إلى خدمة إعداد التقارير. بخلاف ذلك، يلزم إنشاء إصدار جديد لتحميل ملفات الرموز.

على نظام التشغيل Windows أو macOS:

  1. انتقِل إلى مجلد الرموز استنادًا إلى واجهة البرمجة النصية (راجِع الحل:)
    1. استخدِم الأمر التالي (على نظام التشغيل Windows، استخدِم Cygwin لتشغيل أداة readelf).
    2. إنّ استخدام Grep اختياري لفلترة إخراج النص.
    3. ابحث عن رقم تعريف الإصدار.
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 (مميّز باللون البرتقالي).

الشكل 3. اختبار حزمة اتصال المشروع من Backtrace

افحص رمز لعبتك من خلال اتّباع الخطوات التالية:

  • راجِع مشروع C# بحثًا عن أي رمز مشبوه. لا تؤدي عادةً أخطاء C# الغير المُعالجة إلى حدوث خطأ ANR أو تعطُّل التطبيق. ومع ذلك، تأكَّد من أنّ الرمز البرمجي يعمل بشكل صحيح في حالات مختلفة. تحقّق مما إذا كان الرمز البرمجي يستخدم وحدة محرّك تابعة لجهة خارجية، وحلل ما إذا كان الإصدار الأخير قد أدّى إلى ظهور الخطأ. بالإضافة إلى ذلك، راجِع ما إذا كنت قد أجريت مؤخرًا تحديثًا لتطبيق Unity أو ما إذا كان الخطأ يحدث على أجهزة معيّنة فقط.
  • صدِّر اللعبة كمشروع في "استوديو Android". من خلال الاطّلاع الكامل على رمز المصدر C# المحوَّل للعبة، يمكنك العثور على الدالة التي تتسبّب في حدوث خطأ ANR. يبدو أنّ رمز C++ مختلف جدًا عن رمز C#، ويندر أن تحدث مشكلة في تحويل الرمز. إذا عثرت على أي مشكلة، يُرجى إرسال طلب دعم إلى Unity.
  • راجِع رمز المصدر الخاص باللعبة وتأكَّد من إزالة أي منطق يتم تنفيذه في دالّتَي callback OnApplicationFocus()‎ وOnApplicationPause()‎ بشكلٍ مناسب.
    • يفرض محرّك Unity مهلة لإيقاف تنفيذه مؤقتًا، ويمكن أن تؤدي زيادة عبء العمل في عمليات الاستدعاء هذه إلى حدوث خطأ ANR.
    • أضِف سجلات أو مسار تنقّل إلى أجزاء من الرمز البرمجي لتحسين تحليل البيانات.
  • استخدِم Unity Profiler للتحقيق في أداء اللعبة. يمكن أن يكون تحليل أداء تطبيقك أيضًا طريقة رائعة للمساعدة في تحديد المؤثرات السلبية التي قد تتسبب في حدوث خطأ ANR.
  • من الطرق الرائعة لتحديد عمليات الإدخال/الإخراج الطويلة على سلسلة التعليمات الرئيسية استخدام الوضع المتشدد.
  • حلِّل "مؤشرات Android الحيوية" أو سجلّ خدمة إعداد تقارير أخرى وتحقَّق من إصدارات إصدارات اللعبة التي يحدث فيها الخطأ أكثر من غيرها. راجِع رمز المصدر في سجلّ التحكّم بالإصدارات وقارِن بين التغييرات في الرمز بين الإصدارات. إذا وجدت شيئًا مريبًا، فجرب كل تغيير أو إصلاح محتمل على حدة.
  • راجِع سجلّ إعداد تقارير أخطاء ANR على Google Play للأجهزة وإصدارات Android التي تتلقّى أكبر عدد من أخطاء ANR. إذا كانت الأجهزة أو الإصدارات قديمة، من المحتمل أن تتمكّن من تجاهلها بأمان إذا لم يؤدّ ذلك إلى التأثير في أرباح اللعبة. راجِع البيانات بعناية لأنّ مجموعة معيّنة من المستخدمين لن تتمكّن مجددًا من تشغيل لعبتك. لمزيد من المعلومات، يُرجى الاطّلاع على لوحة بيانات التوزيع.
  • راجع رمز مصدر اللعبة للتأكد من عدم استدعاء أي رمز قد يتسبب في حدوث مشكلة، على سبيل المثال، قد تكون إنهاء مدمرة في حال عدم استخدامها بشكل صحيح. اطّلِع على دلائل مطوّري تطبيقات Android لمزيد من المعلومات عن تطوير تطبيقات Android.
  • بعد مراجعة البيانات وتصدير إصدار اللعبة إلى "استوديو Android"، سيتم التعامل مع الرمزين C وC++ ، ما يتيح لك الاستفادة إلى أقصى حد من حلول Unity العادية، مثل Android Memory Profiler وAndroid CPU Profiler و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، إلا أنّ عملية التنفيذ الخاصة بك تمنحك تحكمًا أكثر دقة وتتيح لك تضمين معلومات أكثر صلة.