天天看點

Android性能優化-------ANR

為什麼會發生ANR

  • 當您的 Activity 位于前台時,您的應用在 5 秒鐘内未響應輸入事件或 

    BroadcastReceiver

    (如按鍵或螢幕輕觸事件)。
  • 雖然前台沒有 Activity,但您的 

    BroadcastReceiver

     用了相當長的時間仍未執行完畢。

 常見的ANR類型

  1. 應用在主線程上非常緩慢地執行涉及 I/O 的操作。
  2. 應用在主線程上進行長時間的計算。
  3. 主線程在對另一個程序進行同步 binder 調用,而後者需要很長時間才能傳回。
  4. 主線程處于阻塞狀态,為發生在另一個線程上的長操作等待同步的塊。
  5. 主線程在程序中或通過 binder 調用與另一個線程之間發生死鎖。主線程不隻是在等待長操作執行完畢,而且處于死鎖狀态。如需更多資訊,請參閱維基百科上的死鎖。

可以總結為主線程由于各種原因無法繼續執行的導緻的問題。

如何去定位發現anr問題呢?

1、StrictMode

https://blog.csdn.net/weixin_40763897/article/details/89018306

2、拉取跟蹤資訊檔案

adb bugreport > bugreport.txt

提取出來的壓縮檔案,我們解壓縮會出現下面的檔案

Android性能優化-------ANR

 我們打開bugreport-xxxxxx檔案

 在其中搜尋am_anr

Android性能優化-------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

繼續閱讀