1、anr产生的原因
只有当应用程序的UI线程响应超时才会引起ANR,超时产生原因一般有两种。
当前的事件没有机会得到处理,例如UI线程正在响应另一个事件,当前事件由于某种原因被阻塞了。
当前的事件正在处理,但是由于耗时太长没能及时完成。
根据ANR产生的原因不同,超时事件也不尽相同,从本质上将,产生ANR的原因有三种,大致可以对应到android中四大组件中的三个(Activity/View,BroadcastReceiver和Service)。
KeyDispatchTimeout
最常见的一种类型,原因就是View的点击事件或者触摸事件在特定的时间(5s)内无法得到响应。
BroadcastTimeout
原因是BroadcastReceiver的onReceive()函数运行在主线程中,在特定的时间(10s)内无法完成处理。
ServiceTimeout
比较少出现的一种类型,原因是Service的各个生命周期函数在特定时间(20s)内无法完成处理。
**
2、典型的anr场景*
应用程序UI线程存在耗时操作。例如在UI线程中进行联网请求,数据库操作或者文件操作等。
应用程序的UI线程等待子线程释放某个锁,从而无法处理用户的输入。
耗时的动画需要大量的计算工作,可能导致CPU负载过重。
3、anr的定位及分析
当发生ANR时,可以通过结合Logcat日志和生成的位于手机内部存储的/data/anr/traces.tex文件进行分析和定位
DALVIK THREADS (41):
“main” prio=5 tid=1 Sleeping
| group=“main” sCount=1 dsCount=0 obj=0x73467fa8 self=0x7fbf66c95000
| sysTid=2976 nice=0 cgrp=default sched=0/0 handle=0x7fbf6a8953e0
| state=S schedstat=( 0 0 0 ) utm=60 stm=37 core=1 HZ=100
| stack=0x7ffff4ffd000-0x7ffff4fff000 stackSize=8MB
| held mutexes=
at java.lang.Thread.sleep!(Native method)
- sleeping on <0x35fc9e33> (a java.lang.Object)
at java.lang.Thread.sleep(Thread.java:1031) - locked <0x35fc9e33> (a java.lang.Object)
at java.lang.Thread.sleep(Thread.java:985) // 主线程中sleep过长时间, 阻塞导致无响应.
at com.tencent.bugly.crashreport.crash.c.l(BUGLY:258) - locked <@addr=0x12dadc70> (a com.tencent.bugly.crashreport.crash.c)
at com.tencent.bugly.crashreport.CrashReport.testANRCrash(BUGLY:166) // 产生ANR的那个函数调用 - locked <@addr=0x12d1e840> (a java.lang.Class<com.tencent.bugly.crashreport.CrashReport>)
at com.anly.githubapp.common.wrapper.CrashHelper.testAnr(CrashHelper.java:23)
at com.anly.githubapp.ui.module.main.MineFragment.onClick(MineFragment.java:80) // ANR的起点
at com.anly.githubapp.ui.module.main.MineFragment_ViewBinding 2. d o C l i c k ( M i n e F r a g m e n t V i e w B i n d i n g . j a v a : 47 ) a t b u t t e r k n i f e . i n t e r n a l . D e b o u n c i n g O n C l i c k L i s t e n e r . o n C l i c k ( D e b o u n c i n g O n C l i c k L i s t e n e r . j a v a : 22 ) a t a n d r o i d . v i e w . V i e w . p e r f o r m C l i c k ( V i e w . j a v a :