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

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

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

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

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

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

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

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

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

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

ابحث عن BinderProxy.transactNative أو Binderproxy.transact في الحزم. وهذا يعني أن هناك طلب تثبيت. بعد هذين السطرين، يمكنك رؤية واجهة برمجة تطبيقات binder تسمى 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)
...

العديد من طلبات الربط المتتالية

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

إدخال/إخراج لحظر البيانات

عدم تنفيذ حظر وحدات الإدخال والإخراج (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 في إرسال الإدخال وحالات التعطل الخطيرة.

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