Android Fk:【Stability】應用ANR原理簡潔梳理
一.ANR的種類
1.1 ANR定義
Application Not Responding:即應用無響應
如果應用程式主執行緒在超時時間內對輸入事件沒有處理完畢,或者對特定操作沒有執行完畢,就會出現ANR
(主執行緒在特定的時間內沒有做完特定的事情)
1.2.ANR型別
1) KeyDispatchTimeout :
主要型別按鍵或觸控事件,input事件在5S內沒有處理完成發生ANR,關鍵Log:Reason: Input dispatching timed out xxxx
2)ServiceTimeout
Service主執行緒處理耗時,前臺Service在20s內,後臺Service在200s內沒有處理完成發生ANR,關鍵Log:Timeout executing service:/executing service XXX
3)BroadcastTimeout
前臺廣播在10S內,後臺廣播在60s內沒有被所有接收器處理完成發生ANR,關鍵Log:Timeout of broadcast XXX/Receiver during timeout:XXX/Broadcast of XXX
4)ProcessContentProviderPublishTimedOutLocked
ContentProvider publish在10s內沒有處理完成發生ANR,關鍵log:timeout publishing content providers
1.3.常見的原因
A.主執行緒耗時操作,如複雜的layout,龐大的for迴圈,IO等。 B.主執行緒被子執行緒同步鎖block C.主執行緒被Binder 對端block D.Binder被佔滿導致主執行緒無法和SystemServer通訊 E.得不到系統資源(CPU/RAM/IO)
二.ANR的原理簡化
2.0 ANR dialog顯示過程
2.1 KeyDispatchTimeout
InpuntManagerService會起兩個執行緒InputReader執行緒和InputDispatcherThread,InputDispatcherThread執行緒會由reader執行緒wake,起來後就threadloop不斷迴圈讀取input事件。
2.2 ServiceTimeout
2.3 BroadcastTimeout
2.4 ContentProvider PublishTimedout
三.總結
附上上面使用draw.io繪製的流程圖原稿以及下面詳細流程圖的uml檔案:
anr_simplify.xml 是上面的流程圖原稿,使用draw.io匯入即可
uml檔案使用安裝plantuml外掛的intellij或AndroidStudio開啟即可
如有問題或需要提醒自己注意的讀者可自行新增
詳細過程:
1.ANR dialog顯示過程
2.InputDispatch timeout
3.Service timeout
4.Broadcast timeout
5.ContentProvider publish timeout