يعرض هذا المستند كيفية تحديد سلسلة المحادثات التي لا تستجيب في حزمة خطأ ANR. dump. تختلف سلسلة التعليمات التي لا تستجيب حسب نوع خطأ ANR، كما هو موضّح في ما يلي المؤقت.
نوع حالة ANR | سلسلة محادثات لا تستجيب |
---|---|
إرسال الإدخال | سلسلة التعليمات الرئيسية |
نقل الإدخال بدون نافذة يتم التركيز عليها | سلسلة التعليمات الرئيسية. لا يحدث هذا النوع من أخطاء ANR عادةً بسبب حظر . |
مستقبِل البث (متزامن) | سلسلة المحادثات قيد التشغيل
onReceive()
هذه هي سلسلة المحادثات الرئيسية ما لم يكن هناك معالج مخصّص في سلسلة محادثات غير رئيسية.
محددة باستخدام
Context.registerReceiver |
مستقبِل البث (غير متزامن) | تحقَّق من الرمز لمعرفة سلسلة المحادثات أو مجموعة سلاسل المحادثات المسؤولة عن
يقوم بالعمل لمعالجة البث بعد
goAsync
البيانات. |
جارٍ تنفيذ مهلة الخدمة | سلسلة التعليمات الرئيسية |
بدء الخدمة التي تعمل في المقدّمة | سلسلة التعليمات الرئيسية |
موفّر المحتوى لا يستجيب | يمكنك تنفيذ أحد الإجراءين التاليَين:
|
لم يتم الرد على
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 في إرسال الإدخال وحالات التعطل الخطيرة.
تجنَّب تنفيذ أي عمل شاق على سلسلة المحادثات الرئيسية داخل مكوّنات التطبيق. تشغيل البث المستلِمين في سلسلة محادثات مختلفة كلما أمكن ذلك.