为什么会发生ANR
- 当您的 Activity 位于前台时,您的应用在 5 秒钟内未响应输入事件或
(如按键或屏幕轻触事件)。BroadcastReceiver
- 虽然前台没有 Activity,但您的
用了相当长的时间仍未执行完毕。BroadcastReceiver
常见的ANR类型
- 应用在主线程上非常缓慢地执行涉及 I/O 的操作。
- 应用在主线程上进行长时间的计算。
- 主线程在对另一个进程进行同步 binder 调用,而后者需要很长时间才能返回。
- 主线程处于阻塞状态,为发生在另一个线程上的长操作等待同步的块。
- 主线程在进程中或通过 binder 调用与另一个线程之间发生死锁。主线程不只是在等待长操作执行完毕,而且处于死锁状态。如需更多信息,请参阅维基百科上的死锁。
可以总结为主线程由于各种原因无法继续执行的导致的问题。
如何去定位发现anr问题呢?
1、StrictMode
https://blog.csdn.net/weixin_40763897/article/details/89018306
2、拉取跟踪信息文件
adb bugreport > bugreport.txt
提取出来的压缩文件,我们解压缩会出现下面的文件

我们打开bugreport-xxxxxx文件
在其中搜索am_anr
我们可以看到出错的程序
com.yuanxuzhen.testandroid
pid 21165
time:08-19 17:24:50.271
我们打开Fs/data/anr下的文件
anr_2021-08-19-17-24-50-325 我们这里可以看到对应的时间戳和上面是一样的
我们打开看下
suspend all histogram: Sum: 337us 99% C.I. 2us-199us Avg: 37.444us Max: 199us
DALVIK THREADS (16):
"main" prio=5 tid=1 Runnable
| group="main" sCount=0 dsCount=0 flags=0 obj=0x71cc0d38 self=0xeca71e00
| sysTid=21165 nice=-10 cgrp=default sched=0/0 handle=0xece97dc0
| state=R schedstat=( 9490609584 48237468 399 ) utm=944 stm=4 core=6 HZ=100
| stack=0xff3b0000-0xff3b2000 stackSize=8192KB
| held mutexes= "mutator lock"(shared held)
at com.yuanxuzhen.testandroid.performOpti.PerformAnrActivity$1.onClick(PerformAnrActivity.java:23)
at android.view.View.performClick(View.java:7188)
at com.google.android.material.button.MaterialButton.performClick(MaterialButton.java:967)
at android.view.View.performClickInternal(View.java:7165)
at android.view.View.access$3500(View.java:814)
at android.view.View$PerformClick.run(View.java:27657)
at android.os.Handler.handleCallback(Handler.java:883)
at android.os.Handler.dispatchMessage(Handler.java:100)
at android.os.Looper.loop(Looper.java:230)
at android.app.ActivityThread.main(ActivityThread.java:8010)
at java.lang.reflect.Method.invoke(Native method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:526)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1034)
我们可以看到tid和上面对上了,说明当时主线程在做堆栈中的事情。
com.yuanxuzhen.testandroid.performOpti.PerformAnrActivity$1.onClick(PerformAnrActivity.java:23)
我们就去提示的位置看看逻辑是否有上面我们说的ANR类型。
官方文档地址
https://developer.android.google.cn/topic/performance/vitals/anr?hl=zh-cn#slow_code_on_the_main_thread
https://source.android.google.cn/source/read-bug-reports.html?hl=zh-cn