Android ANR 应用无响应
ANR 全称
Application not ResPonding
ANR 原因
Android 系统中,ActivityManagerService 和 WindowManagerService 会检测 App 的响应时间。如果 App 在特定时间无法响应屏幕触摸或键盘输入事件,或者特定事件没有处理完毕,就会出现 ANR。
ANR 本质是一个性能问题。ANR 机制实际上对 App 主线程进行限制,要求主线程在限定的时间内处理完一些操作。若处理超时,则认定主线程已经失去了响应其他操作的能力。主线程中的耗时操作,比如密集 CPU 运算,大量 IO、复杂界面布局等,都会降低应用程序的响应能力。
ANR 出现场景
AppErrors.appNotResponding()是弹出 ANR 对话框的唯一出口,调用该方法的场景才会有 ANR 提示。故调用该方法的场景会导致 ANR:
5 秒内无法响应屏幕触摸事件或键盘输入事件
前台服务 20 秒,后台服务 200s 内没有执行完毕
执行前台广播的 onReceive 函数时,10s 内没有处理完成;后台 60s
ContentProvider 的 publish 在 10s 内没有完成
如何避免 ANR
UI 线程尽量只做跟 UI 相关的工作
耗时的工作放入单独的线程处理
尽量用 Handler 来处理 UI 线程和其他线程的交互
分析 ANR 的侧重点
CPU 占用率方面
内存方面
评论