1.1 概述
如果应用程序在一段时间内未做出响应或未结束执行,Android 系统会触发一个“应用程序无响应”(ANR) 对话框。一般来说,这种情况会在应用程序的 UI 线程因正在执行某项工作而无法按时处理输入事件时发生。具体来讲,检测到以下其中一种条件时会触发 ANR 对话框:
■ 应用程序未对键盘输入或触屏输入做出响应的时间长达 5 秒以上。
■ BroadcastReceiver 未在 10 秒内结束执行(后台广播则为 60 秒)。
■ Service 或 ContentProvider 的启动操作未在 20 秒内结束执行(后台服务则为 200 秒)。
有时,ANR 条件触发后并不显示对话框。这种情况通常是由于内部框架问题所致,例如在应用程序中发生 ANR 的同时,活动管理器或窗口管理器中存在死锁。这种情况最终会导致Android 看门狗超时。
1.1.1 Logcat ANR 消息
当应用程序中触发 ANR 时,会发出终止信号 (SIGABRT) 以结束无响应的应用程序。与此同时,logcat 的主缓冲区和系统缓冲区中会出现相应的消息。
在主 logcat 中,ANR 会显示一个针对应用程序的简单致命终止信号,如下所示:
Fatal signal 6 (SIGABRT) at 0x000002e5 (code=0), thread 29715 (com.android.settings)
更为详细的 ANR 消息可在系统 logcat 中查看。其中包含无响应应用程序的重要信息,包括应
用程序名称、ANR 原因、CPU 加载信息以及 IO 等待信息。
06-13 15:45:38.923 E/ActivityManager( 654):ANR in com.android.settings
(android/com.andro