عندما يتم حظر سلسلة واجهة المستخدم في تطبيق Android لفترة طويلة جدًا، يظهر خطأ "التطبيق لا يستجيب" (ANR). تتتبّع "مؤشرات Android الحيوية" مقاييس أخطاء "التطبيق لا يستجيب" (ANR) وتُبلغ عنها في Google Play Console لمساعدتك في مراقبة ثبات تطبيقك واستجابته على جميع الأجهزة.
مقاييس "مؤشرات Android الحيوية" وحدودها
يمكن أن تساعدك "مؤشرات Android الحيوية" في مراقبة نسبة أخطاء ANR في تطبيقك وتحسينها. تقيس مؤشرات Android الحيوية عدة نِسب لأخطاء ANR:
- نسبة أخطاء ANR: هي النسبة المئوية للمستخدمين النشطين يوميًا الذين واجهوا أي نوع من أخطاء ANR.
- نسبة أخطاء ANR التي لاحظها المستخدمون: هي النسبة المئوية للمستخدمين النشطين يوميًا الذين واجهوا خطأ ANR واحدًا على الأقل من الأخطاء التي لاحظها المستخدمون. في الوقت الحالي، لا يتم احتساب سوى أخطاء ANR من النوع
Input dispatching timed outعلى أنّها أخطاء لاحظها المستخدمون. - نسبة أخطاء ANR المتعددة: هي النسبة المئوية للمستخدمين النشطين يوميًا الذين واجهوا خطأين على الأقل من نوع ANR.
المستخدم النشط يوميًا هو مستخدم فريد يستخدم تطبيقك في يوم واحد على جهاز واحد، وقد يكون ذلك على مدار جلسات متعددة. فإذا كان أحد المستخدمين يستخدم تطبيقك على أكثر من جهاز في يوم واحد، سيساهم كل جهاز في عدد المستخدمين النشطين لذلك اليوم.
إنّ نسبة أخطاء ANR التي لاحظها المستخدمون هي أحد مؤشرات الأداء الأساسية، أي أنّها تؤثر في قابلية اكتشاف تطبيقك على Google Play. وهذا مهم لأنّ أخطاء ANR التي يتم احتسابها تحدث دائمًا عندما يتفاعل المستخدم مع التطبيق، ما يؤدي إلى حدوث أكبر خلل في الأداء.
حدّد Google Play معيارَين لتحديد الأداء السيئ استنادًا إلى هذا المقياس:
- معيار تحديد الأداء السيئ العام: يواجه ما لا يقل عن% 0.47 من المستخدمين النشطين يوميًا خطأ ANR لاحظه المستخدمون في جميع طُرز الأجهزة.
- معيار تحديد الأداء السيئ حسب الجهاز: يواجه ما لا يقل عن% 8 من المستخدمين النشطين يوميًا خطأ ANR لاحظه المستخدم في طراز جهاز معيّن.
إذا تجاوز تطبيقك معيار تحديد الأداء السيئ العام، من المرجَّح أن تنخفض فرص العثور عليه على جميع الأجهزة. إذا تجاوز تطبيقك معيار تحديد الأداء السيئ لكل جهاز على بعض الأجهزة، من المرجَّح أن تنخفض قابلية الاكتشاف على تلك الأجهزة، وقد يظهر تحذير في بطاقة بيانات المتجر.
يمكن أن تنبّهك "مؤشرات Android الحيوية" من خلال Play Console عندما يعرض تطبيقك أخطاء "التطبيق لا يستجيب" بشكل مفرط.
للحصول على معلومات حول كيفية جمع Google Play لبيانات "مؤشرات Android الحيوية"، يُرجى الاطّلاع على مستندات Play Console.
رصد المشكلة
إذا كان التطبيق في المقدّمة عند حدوث خطأ ANR، يعرض النظام مربّع حوار للمستخدم، كما هو موضّح في الشكل 1. يمنح مربّع حوار ANR المستخدم الفرصة لفرض إغلاق التطبيق.
تُعدّ أخطاء ANR مشكلة لأنّ سلسلة التعليمات الرئيسية للتطبيق، والمسؤولة عن تحديث واجهة المستخدم، لا يمكنها معالجة أحداث إدخال المستخدم أو رسمها، ما يؤدي إلى شعور المستخدم بالإحباط. لمزيد من المعلومات حول سلسلة التعليمات الرئيسية للتطبيق، يُرجى الاطّلاع على نظرة عامة على العمليات وسلاسل التعليمات.
يتم تشغيل خطأ ANR لتطبيقك عند حدوث أحد الشروط التالية:
- انتهاء مهلة إرسال الإدخال: إذا لم يستجب تطبيقك لحدث إدخال (مثل الضغط على مفتاح أو لمس الشاشة) في غضون 5 ثوانٍ.
- تنفيذ الخدمة: إذا تعذّر على خدمة معلَن عنها في تطبيقك إكمال تنفيذ
Service.onCreateوService.onStartCommandأوService.onBindفي غضون بضع ثوانٍ. - لم يتم استدعاء
Service.startForeground: إذا كان تطبيقك يستخدمContext.startForegroundServiceلبدء خدمة جديدة في المقدّمة ولكن الخدمة لا تستدعيstartForegroundفي غضون 5 ثوانٍ. - بثّ النية: إذا لم ينتهِ تنفيذ
BroadcastReceiverخلال فترة زمنية محدّدة. إذا كان التطبيق يتضمّن أي نشاط في المقدّمة، تكون مهلة الانتظار هذه 10 ثوانٍ. - تفاعلات
JobScheduler: إذا لم يتم عرضJobServiceمنJobService.onStartJobأوJobService.onStopJobفي غضون بضع ثوانٍ، أو إذا بدأت مهمة بدأها المستخدم ولم يستدعِ تطبيقكJobService.setNotificationفي غضون بضع ثوانٍ بعد استدعاءJobService.onStartJob. بالنسبة إلى التطبيقات التي تستهدف الإصدار 13 من نظام التشغيل Android والإصدارات الأقدم، تكون أخطاء ANR صامتة ولا يتم إبلاغ التطبيق بها. بالنسبة إلى التطبيقات التي تستهدف الإصدار 14 من نظام التشغيل Android والإصدارات الأحدث، تكون أخطاء ANR صريحة ويتم إبلاغ التطبيق بها.
بالإضافة إلى "مؤشرات Android الحيوية"، يمكنك استخدام أدوات أخرى لرصد أخطاء ANR في المجال، مع العلم أنّ الأدوات التابعة لجهات خارجية لا يمكنها الإبلاغ عن أخطاء ANR على الإصدار Android 10 (مستوى واجهة برمجة التطبيقات 29) والإصدارات الأقدم.
تشخيص أخطاء ANR
هناك بعض الأنماط الشائعة التي يجب البحث عنها عند تشخيص أخطاء ANR:
- ينفّذ التطبيق عمليات بطيئة تتضمّن عمليات متعلّقة بوحدات الإدخال والإخراج في سلسلة التعليمات الرئيسية.
- يُجري التطبيق عملية حسابية طويلة على سلسلة التعليمات الرئيسية.
- تُجري سلسلة التعليمات الرئيسية طلبًا متزامنًا للصنف Binder لعملية أخرى، وتستغرق هذه العملية الأخرى وقتًا طويلاً للعودة.
- تم حظر سلسلة التعليمات الرئيسية في انتظار سلسلة تعليمات متزامنة لعملية طويلة تحدث في سلسلة تعليمات أخرى.
- تكون سلسلة التعليمات الرئيسية في حالة توقّف تام مع سلسلة تعليمات أخرى، إما في العملية التي تجريها أو من خلال استدعاء Binder. لا تنتظر سلسلة التعليمات الرئيسية انتهاء عملية طويلة فحسب، بل إنّها في حالة توقُّف تام.
يمكن أن تساعدك الأساليب التالية في تحديد سبب أخطاء ANR.
HealthStats
يوفّر HealthStats مقاييس حول حالة التطبيق من خلال
التقاط إجمالي وقت المستخدم والنظام ووقت وحدة المعالجة المركزية والشبكة وإحصاءات الراديو ووقت تشغيل الشاشة
وإيقافها وتنبيهات التنشيط. يمكن أن يساعدك ذلك في قياس الاستخدام العام لوحدة المعالجة المركزية واستنزاف البطارية.
تصحيح الأخطاء
تساعدك أداة Debug في فحص تطبيقات Android أثناء تطويرها،
بما في ذلك تتبُّع عدد عمليات التخصيص لتحديد حالات التقطّع والبطء في التطبيقات.
يمكنك أيضًا استخدام Debug للحصول على عدّادات الذاكرة الأصلية وذاكرة وقت التشغيل، ومقاييس الذاكرة التي يمكن أن تساعدك في تحديد استهلاك الذاكرة لعملية معيّنة.
ApplicationExitInfo
تتوفّر واجهة برمجة التطبيقات ApplicationExitInfo على الإصدار 11 من نظام التشغيل Android (المستوى 30 لواجهة برمجة التطبيقات) والإصدارات الأحدث، وتوفّر معلومات عن سبب الخروج من التطبيق. ويشمل ذلك
أخطاء ANR وانخفاض مساحة الذاكرة وتعطُّل التطبيقات والاستخدام المفرط لوحدة المعالجة المركزية (CPU) ومقاطعة المستخدمين
ومقاطعة النظام وتغييرات أذونات التشغيل.
الوضع المقيَّد
يساعدك استخدام StrictMode في العثور على عمليات الإدخال/الإخراج العرضية في سلسلة التعليمات الرئيسية أثناء تطوير تطبيقك. يمكنك استخدام StrictMode على مستوى التطبيق أو النشاط.
تفعيل مربّعات حوار ANR في الخلفية
يعرض Android مربّعات حوار ANR للتطبيقات التي تستغرق وقتًا طويلاً في معالجة رسالة البث فقط في حال تفعيل خيار عرض جميع أخطاء ANR في خيارات المطوّرين على الجهاز. لهذا السبب، لا تظهر مربّعات حوار ANR في الخلفية دائمًا للمستخدم، حتى عندما يواجه التطبيق مشاكل في الأداء.
تحليل وحدة المعالجة المركزية (CPU) وسجلّات تتبُّع النظام
استخدِم محلّل وحدة المعالجة المركزية (CPU) في "استوديو Android" لتسجيل عمليات تتبُّع النظام ونشاط وحدة المعالجة المركزية (CPU) أثناء تشغيل لعبتك. يساعدك فحص سلسلة الوحدات العاملة الرئيسية في Activity إلى جانب سلاسل الوحدات العاملة الخاصة بالعرض والصوت في محرّك اللعبة في رصد اللقطات الطويلة وعمليات تحميل مواد العرض المتزامنة وتعارض سلاسل الوحدات العاملة قبل أن تؤدي إلى حدوث خطأ ANR.
سحب ملف تتبُّع
يخزِّن Android معلومات التتبُّع عند حدوث خطأ ANR. في إصدارات Android الأقدم، يتوفّر ملف /data/anr/traces.txt واحد على الجهاز. في إصدارات Android الأحدث، تتوفّر ملفات /data/anr/anr_* متعددة. يمكنك الوصول إلى تتبُّعات أخطاء ANR من جهاز أو محاكي باستخدام Android Debug Bridge (adb) كمستخدم جذر:
adb root
adb shell ls /data/anr
adb pull /data/anr/<filename>
يمكنك الحصول على تقرير خطأ من جهاز فعلي باستخدام خيار المطوّر "إعداد تقرير بالأخطاء" على الجهاز أو الأمر adb bugreport على جهاز التطوير. لمزيد من المعلومات، يُرجى الاطّلاع على مقالة تسجيل تقارير الأخطاء وقراءتها.
حلّ المشاكل
بعد تحديد المشكلة، يمكنك استخدام النصائح الواردة في هذا القسم لحلّ المشاكل الشائعة.
رمز بطيء في سلسلة التعليمات الرئيسية
حدِّد المواضع في الرمز البرمجي التي يكون فيها سلسلة التعليمات الرئيسية للتطبيق مشغولة لأكثر من 5 ثوانٍ. ابحث عن حالات الاستخدام المريبة في لعبتك وحاوِل إعادة إنتاج خطأ ANR.
في الألعاب، تحدث حالات توقُّف سلسلة التعليمات الرئيسية عادةً عندما يتم تشغيل عملية إلغاء ضغط مواد العرض المتزامنة أو تجميع أدوات التظليل أو إعداد حالة اللعبة الثقيلة على سلسلة التعليمات الرئيسية Activity في Android (مثل داخل onCreate أو onResume أو عمليات استدعاء JNI التي يتم استدعاؤها من سلسلة واجهة المستخدم). انقِل تنفيذ حلقة الألعاب ومعالجة مواد العرض وبدء المشهد إلى سلاسل الوحدات العاملة المخصّصة للمحرك أو العرض أو الخلفية حتى تظل سلسلة التعليمات الرئيسية متاحة لمعالجة أحداث الإدخال ومراحل النشاط.
عمليات الإدخال والإخراج في سلسلة التعليمات الرئيسية
يُعدّ تنفيذ عمليات الإدخال والإخراج في سلسلة التعليمات الرئيسية سببًا شائعًا لبطء العمليات في سلسلة التعليمات الرئيسية، ما قد يؤدي إلى حدوث أخطاء ANR.
يجب نقل جميع عمليات قراءة حِزم مواد العرض وتسلسل حفظ الألعاب ووصول SharedPreferences وطلبات الشبكة من سلسلة الوحدات الرئيسية Activity إلى سلاسل الوحدات العاملة في الخلفية حتى لا يؤدي وقت استجابة مساحة التخزين أو الشبكة إلى حظر إرسال الإدخالات.
أقفال ميتة
يحدث الجمود عندما تدخل سلسلة تعليمات في حالة انتظار لأنّ موردًا مطلوبًا تحتفظ به سلسلة تعليمات أخرى، والتي تنتظر أيضًا موردًا تحتفظ به سلسلة التعليمات الأولى. إذا كانت سلسلة التعليمات الرئيسية للتطبيق في هذه الحالة، من المحتمل حدوث أخطاء ANR.
في الألعاب، غالبًا ما تحدث حالات توقّف تام وتنافس على القفل بين سلسلة مهام Android
الرئيسية Activity (التي تعالج عمليات الاستدعاء الخاصة بمراحل النشاط أو السطح أو الإدخال) وسلاسل مهام العرض أو المنطق أو الصوت في لغة C أو C++ الأصلية. تجنَّب عمليات الانتظار المتزامنة في سلسلة التعليمات الرئيسية لأقفال المحرّك الأصلي، واستخدِم ترتيبًا متسقًا للأقفال أو قوائم انتظار الرسائل الخالية من الأقفال عند التواصل عبر سلاسل تعليمات JNI والمحرّك.
حالات التوقف التام هي ظاهرة تمت دراستها جيدًا في علوم الكمبيوتر، وهناك خوارزميات لمنع حالات التوقف التام يمكنك استخدامها لتجنب حالات التوقف التام.
لمزيد من المعلومات، يُرجى الاطّلاع على الجمود وخوارزميات منع الجمود على Wikipedia.
مستقبِلات البث البطيئة
يمكن للتطبيقات الاستجابة لرسائل البث، مثل تفعيل وضع الطيران أو إيقافه أو تغيير حالة الاتصال، من خلال أجهزة استقبال البث. يحدث خطأ ANR عندما يستغرق التطبيق وقتًا طويلاً لمعالجة رسالة الإعلان على جميع الأجهزة.
يحدث خطأ ANR في الحالات التالية:
- لم ينتهِ مستقبل البث من تنفيذ طريقة
onReceiveخلال فترة زمنية معقولة. - يستدعي مستقبل البث
goAsyncويتعذّر عليه استدعاءfinishفي الكائنPendingResult.
يجب أن ينفّذ تطبيقك عمليات قصيرة فقط في طريقة onReceive
لـ BroadcastReceiver. ومع ذلك، إذا كان تطبيقك يتطلب معالجة أكثر تعقيدًا نتيجة لـ الإعلان على جميع الأجهزة، يجب تأجيل المهمة إلى سلسلة الوحدات العاملة في الخلفية إذا كان من المتوقع أن تستغرق المهمة بضع ثوانٍ على الأكثر، أو إلى WorkManager للمهام التي من المتوقع أن تستغرق أكثر من بضع ثوانٍ.
GameActivity
تساعد مكتبة GameActivity في تقليل أخطاء ANR في دراسات الحالة للألعاب والتطبيقات المكتوبة بلغة C أو C++. وإذا استبدلت نشاطك الحالي الناتج من رموز برمجية أصلية بـ GameActivity، يمكنك تقليل حظر سلسلة واجهة المستخدم ومنع حدوث بعض أخطاء ANR.
إذا كنت تطوّر لعبتك باستخدام Unity، يمكنك الاطّلاع على تصحيح أخطاء ANR في ألعاب Unity وأخطاء ANR الشائعة في ألعاب Unity وتحويل رموز الأعطال وأخطاء ANR في ألعاب Unity على Android.
لمزيد من المعلومات حول أخطاء ANR، يُرجى الاطّلاع على مقالة الحفاظ على استجابة تطبيقك. لمزيد من المعلومات حول سلاسل المحادثات، يُرجى الاطّلاع على تحسين الأداء من خلال سلاسل المحادثات.
التطبيقات المقترَحة لك
- ملاحظة: يتم عرض نص الرابط عندما يكون JavaScript غير مفعَّل
- عمليات التنشيط المفرطة