تصحيح أخطاء ANR

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

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

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

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

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

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

تحليل الرموز

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

الشكل 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 (المميّز باللون الأزرق)، وهو الاسم المحدّد في ملف Assembly Definition. Logger هو اسم الفئة (مميّز باللون الأحمر) في نص C# البرمجي، متبوعًا باسم الدالة (مميّز باللون الأخضر). أخيرًا، يظهر الاسم الكامل الذي أنشأه المحوّل IL2CPP (مميّز باللون البرتقالي).

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

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

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

رمز محرك Unity

لمعرفة ما إذا حدث خطأ ANR في Unity Engine، ابحث عن 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. إذا كانت لعبتك تستخدم الإصدار 6 من Unity أو إصدارًا أحدث، يمكنك استدعاء ApplicationExitInfo مباشرةً. بالنسبة إلى إصدارات Unity القديمة، عليك تنفيذ المكوّن الإضافي الخاص بك لتفعيل طلبات ApplicationExitInfo من Unity.

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