تحدث أخطاء "التطبيق لا يستجيب" عندما لا تستجيب سلسلة واجهة مستخدم التطبيق لعدة ثوانٍ تزيد عن
بالإضافة إلى ذلك، يمكن أن تساعدك أداة Crashlytics في تحديد سلاسل محادثات معيّنة تتضمّن مشاكل. ونحلّل أخطاء ANR، ثم نشير في لوحة بيانات Crashlytics إلى سلاسل المحادثات السارية لتقديم نصائح حول كيفية تصحيح أخطاء ANR.
توضِّح الأقسام التالية في هذه الصفحة معنى كل علامة ANR، وتعرض مثالاً على خطأ ANR يتضمّن تلك العلامة، وتقدّم حلًا مقترَحًا لتصحيح أخطاء ANR.
Triggered ANR
يتم وضع تعليق توضيحي على سلسلة محادثات تم حظرها لفترة طويلة جدًا وتسبّبت في ظهور خطأ ANR باستخدام
هذه العلامة Triggered ANR
يمكن أن تكون سلسلة المحادثات التي تتضمّن مشكلة هي سلسلة المحادثات الرئيسية للتطبيق، أو أي سلسلة محادثات تم رصد عدم استجابتها. ومع ذلك، قد يكون السلسلة المُشار إليها باسم
Triggered ANR
Deadlocked
يتم وضع علامة Deadlocked
يحدث هذا الخطأ عندما تدخل سلسلة تعليمات في حالة الانتظار لأنّ سلسلة تعليمات أخرى تحتفظ بمورد مطلوب، وهي تنتظر أيضًا موردًا تحتفظ به السلسلة الأولى. إذا كانت سلسلة التعليمات الرئيسية للتطبيق في هذه الحالة، من المحتمل حدوث أخطاء ANR.
عرض مثال
في ما يلي سلسلة محادثتَين متورّطتَين في حالة "توقّف مؤقت":
main (unknown): tid=1 systid=1568 com.android.server.pm.PackageManagerService$PackageManagerInternalImpl.getPackage(PackageManagerService.java:22701) com.android.server.pm.PackageManagerService$PackageManagerInternalImpl.filterOnlySystemPackages(PackageManagerService.java:22787) ... com.android.server.SystemServer.main(SystemServer.java:368) java.lang.reflect.Method.invoke(Native method) com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:517) com.android.internal.os.ZygoteInit.main(ZygoteInit.java:934) ActivityManager (unknown): tid=21 systid=1902 com.android.server.pm.PackageManagerService.getPackageSetting(PackageManagerService.java:23618) com.android.server.pm.PackageManagerService.getPackageUid(PackageManagerService.java:4542) ... android.os.Handler.handleCallback(Handler.java:907) android.os.Handler.dispatchMessage(Handler.java:99) android.os.Looper.loop(Looper.java:216) android.os.HandlerThread.run(HandlerThread.java:67) com.android.server.ServiceThread.run(ServiceThread.java:44)
الاقتراح
اطّلِع على سلاسل المحادثات المعنيّة بالتوقّف المفاجئ للعمليات وتحقَّق من الموارد/القيود التي حصلت عليها هذه سلاسل المحادثات. راجِع التوقف المفاجئ وخوارزميات منع التوقف المفاجئ للاطّلاع على الحلول الممكنة.
IO Root blocking
يتمّ وضع تعليق توضيحي بالعلامة
IO Root blocking
Triggered ANR
Triggered ANR
IO Root blocking
Root blocking
الاطّلاع على أمثلة
Thread main(THREAD_STATE_TIMED_WAITING) sun.misc.Unsafe.park( Unsafe.java:0 ) java.util.concurrent.locks.LockSupport.parkNanos( LockSupport.java:230 ) android.database.sqlite.SQLiteConnectionPool.waitForConnection( SQLiteConnectionPool.java:756 ) ... android.app.ActivityThread.main( ActivityThread.java:8192 )
Thread main(THREAD_STATE_NATIVE_WAITING) Syscall art::ConditionVariable::WaitHoldingLocks(art::Thread*) art::GoToRunnable(art::Thread*) art::JniMethodEnd(unsigned int, art::Thread*) libcore.io.Linux.fdatasync( Linux.java:0 ) libcore.io.ForwardingOs.fdatasync( ForwardingOs.java:105 ) ... java.io.RandomAccessFile.write( RandomAccessFile.java:559 ) ... android.app.ActivityThread.main( ActivityThread.java:8192 )
الاقتراح
بشكل عام، يجب ألا ينفذ تطبيقك عمليات مُكلّفة متعلّقة بوحدات الإدخال والإخراج في سلسلة التعليمات
الرئيسية. في حال كانت سلسلة التعليمات الرئيسية
IO Root blocking
Root blocking
يتم وضع العلامة
Root blocking
Triggered ANR
Root blocking
Triggered ANR
إذا كانت أي سلاسل تعليمات Triggered ANR
Root blocking
الاطّلاع على أمثلة
في ما يلي بعض الأمثلة استنادًا إلى حالة سلسلة المحادثات:
Thread main(THREAD_STATE_RUNNABLE) android.os.Parcel.createTypedArray( Parcel.java:3086 ) android.content.pm.PackageInfo.<init>( PackageInfo.java:546 ) ... android.app.ActivityThread$H.handleMessage( ActivityThread.java:2166 ) android.os.Handler.dispatchMessage( Handler.java:106 ) android.os.Looper.loop( Looper.java:246 ) android.app.ActivityThread.main( ActivityThread.java:8633 )
Thread main(THREAD_STATE_BLOCKED) DBHelper.runOnDB( DBHelper.java:97 ) DBHelper.runDb( DBHelper.java:125 ) ... java.lang.reflect.Method.invoke( Method.java:0 ) EventBus.invokeSubscriber( EventBus.java:510 ) postToSubscription( EventBus.java:437 ) ... android.os.Handler.handleCallback( Handler.java:938 ) android.os.Handler.dispatchMessage( Handler.java:99 ) android.os.Looper.loop( Looper.java:268 ) android.app.ActivityThread.main( ActivityThread.java:7904 )
الاقتراح
الحدّ من الأعمال المكثفة التي تستهلك وحدة المعالجة المركزية في سلسلة المهام الرئيسية استخدِم مؤشرات الترابط العاملة أو مؤشرات الترابط في الخلفية للقيام بالمهام المكثفة لوحدة المعالجة المركزية.
قلِّل من العمل المكثّف لوحدات الإدخال والإخراج، مثل التحميل من قاعدة بيانات، في سلسلة التعليمات الرئيسية.
Unknown root cause
تتم الإشارة إلى سلسلة محادثات بالعلامة Unknown root cause
عرض مثال
Thread main(THREAD_STATE_NATIVE_WAITING) __epoll_pwait android::Looper::pollInner(int) android::Looper::pollOnce(int, int*, int*, void**) android::android_os_MessageQueue_nativePollOnce(_JNIEnv*, _jobject*, long, int) android.os.MessageQueue.nativePollOnce( MessageQueue.java:0 ) android.os.MessageQueue.next( MessageQueue.java:335 ) android.os.Looper.loop( Looper.java:193 ) android.app.ActivityThread.main( ActivityThread.java:8019 )
الاقتراح
اتّبِع النصائح العامة حول كيفية منع حدوث أخطاء ANR. على سبيل المثال، حدِّد
الأماكن في الرمز البرمجي التي يمكن أن تكون فيها سلسلة التطبيق الرئيسية مشغولة لأكثر من