تصحيح أخطاء ANR

يُعتبر حل أخطاء ANR في لعبة Unity عملية منهجية:

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

دمج خدمات الإبلاغ

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

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

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

تحليل الرموز

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

رمز محرّك Unity

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

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

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

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

مكتبة النظام

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

أسباب الخروج

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

يستخدم Crashlytics أيضًا السمة ApplicationExitInfo؛ لكنك والتنفيذ يتيح لك تحكمًا أكثر دقة ويتيح لك تضمين مزيدًا من المعلومات ذات الصلة