البحث عن سلسلة المحادثات التي لا تستجيب

يوضّح هذا المستند كيفية تحديد سلسلة التعليمات التي لا تستجيب في تفريغ حزمة ANR. تختلف سلسلة التعليمات التي لا تستجيب حسب نوع خطأ ANR، كما هو موضّح في الجدول التالي.

نوع حالة ANR سلسلة محادثات لا تستجيب
إرسال الإدخال سلسلة التعليمات الرئيسية
عدم وجود نافذة مركّزة عند إرسال الإدخال سلسلة التعليمات الرئيسية لا يحدث هذا النوع من أخطاء ANR عادةً بسبب حظر سلسلة محادثات.
جهاز استقبال البث (متزامن) سلسلة المحادثات قيد التشغيل onReceive(). هذه هي سلسلة التعليمات الرئيسية ما لم يتم تحديد معالج مخصَّص في سلسلة محادثات غير رئيسية باستخدام Context.registerReceiver.
جهاز استقبال البث (غير متزامن) تحقَّق من الرمز لمعرفة سلسلة المحادثات أو مجموعة سلاسل المحادثات المسؤولة عن تنفيذ العمل لمعالجة البث بعد طلب goAsync.
انتهاء مهلة تنفيذ الخدمة سلسلة التعليمات الرئيسية
بدء الخدمة التي تعمل في المقدّمة سلسلة التعليمات الرئيسية
مقدم المحتوى لا يستجيب أن تحقق أيًا من التالي:
  • سلسلة محادثات Binder إذا كان خطأ ANR ناتجًا عن طلب بحث موفّر محتوى بطيء
  • سلسلة التعليمات الرئيسية إذا كان خطأ ANR ناتجًا عن بدء تشغيل تطبيق طويل.
ما مِن استجابة على onStartJob أو onStopJob سلسلة التعليمات الرئيسية

في بعض الأحيان لا تستجيب السلسلة بسبب سبب جذري في مؤشر ترابط أو عملية مختلفة. قد لا تستجيب سلسلة المحادثات بسبب انتظار العملية التالية:

  • قفل يتم الاحتفاظ به من خلال سلسلة محادثات مختلفة.
  • استدعاء الصنف Binder بطيء لعملية مختلفة.

الأسباب الشائعة لسلاسل المحادثات التي لا تستجيب

في ما يلي الأسباب الشائعة لسلاسل المحادثات التي لا تستجيب.

طلب الصنف Binder بطيء

على الرغم من أن معظم طلبات الصنف Binder سريعة، يمكن أن يكون الذيل الطويل بطيئًا جدًا. ويحدث ذلك غالبًا إذا تم تحميل الجهاز أو إذا كانت سلسلة ردّ الصنف Binder بطيء، مثلاً من تزايد الطلب على القفل أو العديد من طلبات الصنف الواردة أو انتهاء مهلة طبقة تجريد الأجهزة (HAL).

يمكنك حل هذه المشكلة من خلال نقل طلبات الصنف Binder المتزامنة إلى سلاسل التعليمات في الخلفية متى أمكن ذلك. إذا كان يجب أن تتم المكالمة في سلسلة التعليمات الرئيسية، فاكتشف سبب بطء المكالمة. أفضل طريقة لإجراء ذلك هي من خلال عمليات تتبع Perfetto.

ابحث عن BinderProxy.transactNative أو Binderproxy.transact في الحزمة. يعني هذا أنّه يتم طلب الصنف Binder. باتباع هذين السطرين، يمكنك رؤية واجهة برمجة تطبيقات المصنف التي يتم استدعائها. في المثال التالي، تكون الاستدعاءات لـ IAccessibilityManager.addClient.

main tid=123

...
android.os.BinderProxy.transactNative (Native method)
android.os.BinderProxy.transact (BinderProxy.java:568)
android.view.accessibility.IAccessibilityManager$Stub$Proxy.addClient (IAccessibilityManager.java:599)
...

العديد من استدعاءات الصنف Binder المتتالية

قد يؤدي إجراء العديد من استدعاءات الصنف Binder المتتالية في حلقة ضيقة إلى حظر سلسلة تعليمات لفترة طويلة.

مؤتمر I/O يحظر الدخول

عدم حظر عمليات الإدخال والإخراج مطلقًا في سلسلة التعليمات الرئيسية هذا هو نمط ثابت.

تزايد الطلب على دالة الاستبعاد المتبادل

إذا تم حظر سلسلة محادثات عند الحصول على قفل، قد يؤدي ذلك إلى حدوث خطأ ANR.

يوضح المثال التالي أنّه تم حظر سلسلة التعليمات الرئيسية عند محاولة الاستحواذ على دالة الاستبعاد المتبادل:

main (tid=1) Blocked

Waiting for com.example.android.apps.foo.BarCache (0x07d657b7) held by
ptz-rcs-28-EDITOR_REMOTE_VIDEO_DOWNLOAD
[...]
at android.app.ActivityThread.handleStopActivity(ActivityThread.java:5412)
[...]

ترسل سلسلة التعليمات البرمجية طلب HTTP لتنزيل فيديو:

ptz-rcs-28-EDITOR_REMOTE_VIDEO_DOWNLOAD (tid=110) Waiting

at jdk.internal.misc.Unsafe.park(Native method:0)
at java.util.concurrent.locks.LockSupport.park(LockSupport.java:211)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:715)
at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1047)
at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:230)
at com.example.android.apps.foo.HttpRequest.execute(HttpRequest:136)
at com.example.android.apps.foo$Task$VideoLoadTask.downloadVideoToFile(RequestExecutor:711)
[...]

إطار باهظ الثمن

يمكن أن يؤدي عرض عدد كبير جدًا من الأشياء في إطار واحد إلى عدم استجابة سلسلة التعليمات الرئيسية طوال مدة الإطار، مثل ما يلي:

  • عرض العديد من العناصر غير الضرورية خارج الشاشة
  • استخدام خوارزمية غير فعّالة، مثل O(n^2)، عند عرض العديد من عناصر واجهة المستخدم

تم الحظر بواسطة مكوّن آخر

وإذا حظر مكوّن آخر، مثل جهاز استقبال البث، سلسلة التعليمات الرئيسية لأكثر من خمس ثوانٍ، قد يؤدي ذلك إلى حدوث أخطاء ANR المتعلقة بإرسال الإدخال ومشاكل جسيمة في التشغيل.

تجنَّب تنفيذ أي أعمال شاقة في سلسلة التعليمات الرئيسية في مكوّنات التطبيق. قم بتشغيل أجهزة استقبال البث على سلسلة رسائل مختلفة كلما أمكن ذلك.