前言
本文对Android中常发生的ANR现象的成因原理及主要发生场景进行了详细介绍,举例了几种典型的ANR场景实例。总结提供了优化改善的若干解决思路。
值得Android开发人员收藏
简介
ANR全称:Application Not Responding,也就是应用程序无响应
针对Android中常发生的ANR现象,要解决此问题,当真要从其原理开始分析,如下图所示
原因
Android系统中,ActivityManagerService(简称AMS)和WindowManagerService(简称WMS)会检测App的响应时间,如果App在特定时间无法相应屏幕触摸或键盘输入时间,或者特定事件没有处理完毕,就会出现ANR。其原因无非是以下四点:
- InputDispatching Timeout:5秒内无法响应屏幕触摸事件或键盘输入事件
- BroadcastQueue Timeout :在执行前台广播(BroadcastReceiver)的
onReceive()
函数时10秒没有处理完成,后台为60秒。 - Service Timeout :前台服务20秒内,后台服务在200秒内没有执行完毕。
- ContentProvider Timeout :ContentProvider的publish在10s内没进行完。
ANR分析办法
ANR重现
这里使用的是号称Google亲儿子的Google Pixel xl(Android 8.0系统)做的测试,生成一个按钮跳转到ANRTestActivity
,在后者的onCreate()
中主线程休眠20秒:
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_anr_test);
// 这是Android提供线程休眠函数,与Thread.sleep()最大的区别是
// 该使用该函数不会抛出InterruptedException异常。
SystemClock.sleep(20 * 1000);
}
在进入ANRTestActivity
后黑屏一段时间,大概有七八秒,终于弹出了ANR异常