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

رمز محرّك Unity

لمعرفة ما إذا كان هناك خطأ ANR يحدث في جانب محرّك Unity، تحقَّق من libUnity.so أو libMain.so في عمليات تتبُّع تسلسل استدعاء الدوال البرمجية. إذا وجدتها، اتخذ الخطوات التالية:

  • أولاً، ابحث في قنوات المنتدى (منتديات Unity ومناقشات Unity وStackoverflow).
  • إذا لم تعثر على أي نتائج، يمكنك الإبلاغ عن خطأ لحلّ المشكلة. يمكنك توفير رمز تتبُّع تسلسل استدعاء الدوال البرمجية حتى يتمكّن مهندسو المحرّك من فهم الخطأ وحله بشكل أفضل.
  • تحقَّق مما إذا كان أحدث إصدار من Unity LTS قد أجرى تحسينات مرتبطة بمشاكلك. في هذه الحالة، عليك ترقية لعبتك لاستخدام هذا الإصدار. (قد يكون هذا الحل ممكنًا لبعض مطوّري البرامج فقط.)
  • إذا كان رمزك يستخدم رمز Activity مخصصًا بدلاً من الرمز التلقائي، راجِع رمز JavaScript للتأكّد من أنّ النشاط لا يتسبب في حدوث أي مشاكل.

حزمة تطوير البرامج (SDK) التابعة لجهة خارجية

  • تأكَّد من أنّ جميع المكتبات التابعة لجهات خارجية حديثة ومن أنّها لا تتضمّن تقارير عن الأعطال أو أخطاء ANR لأحدث إصدار من Android.
  • انتقِل إلى منتديات Unity لمعرفة ما إذا تم حلّ أي أخطاء في إصدار أحدث أو إذا تم تقديم حل بديل من خلال Unity أو أحد أعضاء المنتدى.
  • راجِع تقرير أخطاء ANR في Google Play وتأكَّد من أنّ Google لم تتعرّف على الخطأ بعد. تدرك Google بعض أخطاء ANR وتعمل بتفاعل على إصلاحها.

مكتبة النظام

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

أسباب الخروج

ApplicationExitInfo هي واجهة برمجة تطبيقات Android لفهم أسباب أخطاء ANR. إذا كانت لعبتك تستخدم Unity 6 أو إصدار أحدث، يمكنك الاتصال بالرقم ApplicationExitInfo مباشرةً. بالنسبة إلى إصدارات Unity القديمة، يجب تنفيذ مكوّن إضافي لتفعيل مكالمات ApplicationExitInfo من Unity.

يستخدم Crashlytics أيضًا ApplicationExitInfo، إلا أنّ عملية التنفيذ التي تستخدمها تمنحك إمكانية تحكّم أفضل وتتيح لك تضمين معلومات أكثر صلة.