ANR产生的原因、如何避免、问题定位
ANR
在Android中,应用程序的响应是由Activity Manager和WindowManager系统服务监视的 。当它监测到A、B、C情况中的一个时,Android就会针对特定的应用程序显示ANR:
A. KeyDispatchTimeout在5秒内没有响应输入的事件(例如,按键按下,屏幕触摸)--主要类型
B. BroadcastTimeout.BroadcastReceiver在10秒内没有执行完毕
C. ServiceTimeout.Service在特定时间内(20秒内)无法处理完成--小概率类型
造成ABC的原因有很多,比如在主线程中做了非常耗时的操作,如下载,io异常等。还需要注意的是产生这种ANR的前提是要有输入事件,如果用户没有触发任何输入事件,即便是主线程阻塞了,也不会产生ANR,因为InputDispatcher没有分发事件给应用程序,当然也不会检测处理超时和报告ANR了。
1.如何分析ANR
ANR发生时都会在log中输出错误信息,从log中可以获得ANR的类型,CPU的使用情况,CPU使用率过高有可能是CPU饥饿导致了ANR。CPU使用率过低说明主线程被block了,如果IOwait高是因为主线程进行I/O操作造成的。 除了log输出外,你会发现各个应用进程和系统进程的函数堆栈信息都输出到了一个/data/anr/traces.txt的文件中,这个文件是分析ANR原因的关键文件.要获取到该文件可使用adb指令进行赋权后拉出查看调用stack。通过log、trace.text、代码结合分析ANR的成因(iowait?Memoryleak?Block?)
2.怎么避免ANR
要避免问题的产生,就要抓住问题产生的原因(ABC三种):(1)避免在主线程上进行复杂耗时的操作,比如说发送接收网络数据/进行大量计算/操作数据库/读写文件等。这个可以通过使用AsyncTask或者使用多线程来实现。(2)broadCastReceiver 要进行复杂操作的的时候,可以在onReceive()方法中启动一个Service来处理(3)在设计及代码编写阶段避免出现出现同步/死锁或者错误处理不恰当等情况。
1:UI线程尽量只做跟UI相关的工作
2:CPU满负荷, I/O阻塞的 耗时的工作(比如数据库操作,I/O,连接网络或者别的有可能阻碍UI线程的操作)把它放入单独的线程处理
3:尽量用Handler来处理UIthread和别的thread之间的交互
Handler主要有两个作用:在工作线程中发送消息。在UI线程中获取、处理消息。
4. 内存不够用的,增大VM内存, 使用largeHeap属性, 排查内存泄露.
ANR问题定位trace文件。
https://blog.csdn.net/qq_29033193/article/details/89084860
注意最后搜索.txt是“DALVIK”
- Android anr 产生的原因和如何避免
- Android ANR产生的原因及如何避免
- ANR产生的原因及如何避免?
- 如何快速定位TempDB产生问题
- linux僵尸进程产生的原因以及如何避免产生僵尸进程
- 如何快速定位TempDB产生问题
- epoll在多进程下产生的“惊群”现象——如何避免——多进程因为文件描述符继承问题导致
- Android ANR产生的原因及定位分析
- 线程脏读产生的原因以及如何避免
- 接口测试:如何定位BUG的产生原因
- ANR产生的原因及其定位分析
- 死锁产生的原因&&必要条件&&如何避免死锁
- 详解java中产生死锁的原因及如何避免
- time_wait状态产生的原因,危害,如何避免
- 如何快速定位TempDB产生问题
- linux僵尸进程产生的原因以及如何避免产生僵尸进程
- Android开发中的ANR问题如何避免?
- ANR产生的原因及其定位分析
- 如何避免spark dataframe的JOIN操作之后产生重复列(Reference '***' is ambiguous问题解决)
- Android面试(二)ListView优化,ListView和Scrollview冲突问题,mvc模式,什么是ANR 如何避免它?