app专项测试2-anr
anr异常原因分析总结
简单的总结有以下两点:
1.主线程执行了耗时操作,比如数据库操作或网络编程
2.其他进程(就是其他程序)占用CPU导致本进程得不到CPU时间片,比如其他进程的频繁读写操作可能会导致这个问题。
细分的话,导致ANR的原因有如下几点:
1.耗时的网络访问
2.大量的数据读写
3.数据库操作
4.硬件操作(比如camera)
5.调用thread的join()方法、sleep()方法、wait()方法或者等待线程锁的时候
6.service binder的数量达到上限
7.system server中发生WatchDog ANR
8.service忙导致超时无响应
9.其他线程持有锁,导致主线程等待超时
10.其它线程终止或崩溃导致主线程一直等待。
下面是具体的分析:
ANR的全称是application not responding,根据它的意思我们就能看出来是应用程序未响应,就像是我们在电脑上碰到的程序未响应,一般电脑出现这种情况,可能是由于我们打开了很多应用程序,占用了大量的内存,或者CPU时间片被一个应用程序长时间占用,不够分配,导致部分应用程序出现了无响应。Android和Windows基本一样,接下来我们就分析一下Android是怎么产生的这个问题。
下图就是我们见到的APP无响应的时候出现的对话框,产生ANR的原因很多,但是只有在Activty中的Anr才会弹出对话框,对话框有两个选项,一个是等待,一个是关闭程序供用户选择: 
为什么会产生ANR(Application not response)这种情况呢?
在Android里, App的响应能力是由Activity Manager和Window Manager系统服务来监控的.,通常情况下产生ANR有这么三个条件:
1.只有主线程才会产生ANR,主线程就是UI线程;
2.必须发生某些输入事件或特定操作,比如按键或触屏等输入事件,在BroadcastReceiver或Service的各个生命周期调用函数;
3.上述事件响应超时,不同的context规定的上限时间不同
具备了以上三个条件,那么加上这两个环境,就会产生ANR了:
1.5秒内无法对输入事件(按键及触摸)做出响应
2.广播接收器无法在10秒内结束运行
————————————————
ANR时系统做了什么
1.弹出一个对话框
2.将ANR信息输出到traces.txt文件中
traces.txt文件是一个ANR记录文件,用于开发人员调试,目录位于/data/anr中,无需root权限即可通过pull命令获取,下面的命令可以将traces.txt文件拷贝到当前目录下
adb pull /data/anr
3.将ANR信息输出到Logcat中
对ANR产生详细分析
为什么会产生ANR,在第一条讲解中,具体剖析(部分文章参考简书作者):
a.主线程对输入事件5秒内没有处理完毕
b.主线程在执行BroadcastReceiver的onReceive()函数时10秒内没有处理完毕
c.主线程在Service的各个生命周期函数时20秒内没有处理完毕。
那么导致ANR的根本原因是什么呢?简单的总结有以下两点:
1.主线程执行了耗时操作,比如数据库操作或网络编程
2.其他进程(就是其他程序)占用CPU导致本进程得不到CPU时间片,比如其他进程的频繁读写操作可能会导致这个问题。
细分的话,导致ANR的原因有如下几点:
1.耗时的网络访问
2.大量的数据读写
3.数据库操作
4.硬件操作(比如camera)
5.调用thread的join()方法、sleep()方法、wait()方法或者等待线程锁的时候
6.service binder的数量达到上限
7.system server中发生WatchDog ANR
8.service忙导致超时无响应
9.其他线程持有锁,导致主线程等待超时
10.其它线程终止或崩溃导致主线程一直等待。
————————————————
如何避免ANR呢
合理使用 UI 主线程,UI线程尽量只做跟UI相关的工作 ,耗时操作放入其他线程工作(比如数据库操作,I/O,网络操作)-采用单独的工作线程处理);
合理使用 Handler 异步消息处理机制来处理其他线程请求。
合理使用并遵循 Android 生命周期, 避免在 onCreate() and onResume()做过多的事情;
使用一些架构形成规范来避免内存等问题,例如:MVP、RxJava;
经常使用工具来检查内存问题,例如:MAT、TraceView、AS 自带等工具;
避免加载大图片引起内存不足导致 ANR;
避免内存泄露引起的 ANR。

浙公网安备 33010602011771号