為什麼會發生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