تصحيح أخطاء ANR

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

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

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

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

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

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

تحليل الرموز

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

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