1. 程式人生 > >Android Fk:【Stability】應用ANR原理簡潔梳理

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檔案:

https://pan.baidu.com/s/1tp0Gc2GZQXNysut9hkejIA
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
這裡寫圖片描述