您好,登錄后才能下訂單哦!
ANR是Application Not responding,指應用程序未響應,Android系統如果超過預定時間未能得到有效響應或者響應時間過長,都會造成ANR,因為Android系統對于一些事件需要在一定的時間范圍內完成。ANR由消息處理機制保證, 核心原理是消息調度和超時處理,Android在系統層實現了一套精密的機制來發現ANR。
ANR本質上其實是一個性能的問題,它要求主線程在規定的時間內完成一些操作,如果處理超時,則會認為主線程失去了響應其他操作的努力,主線程的耗時操作,都會降低應用程序的響應能力
ANR機制主體實現在系統層,系統進程設計了不同的超時限制來跟蹤消息的處理。所有與ANR相關的消息,都會經過系統進程調度,然后派發到應用進程完成對消息的實際處理。 一旦應用程序處理消息不當,超時限制就起作用了,它會收集一些類似CUP使用情況等信息并報告用戶進程無響應情況
檢測ANR的核心是消息調度和超時處理
而在應用中基本上只有四種情況會導致ANR
Service Timeout:Service在特定的時間內無法處理完成
BroadcastQueue Timeout:BroadcastReceiver在特定時間內無法處理完成
ContentProvider Timeout:內容提供者執行超時
inputDispatching Timeout: 按鍵或觸摸事件在特定時間內無響應。
而整個ANR機制可以分為:ANR檢測機制和ANR報告機制
Service檢測機制
在ANR機制中,Service運行在應用程序的主線程,如果Service的執行時間超過20秒,就會引發ANR。
Android是通過設置定時消息實現監測Service超時的。定時消息是由AMS的消息隊列處理的(system_server的ActivityManager線程)。 AMS有Service運行的上下文信息,所以會在AMS中設置一套超時檢測機制
輸入事件檢測機制
應用程序可以接收輸入事件(按鍵、觸屏、軌跡球等),當5秒內沒有處理完畢時,則會引發ANR。
ANR報告機制
無論哪種類型的ANR發生以后,最終都會調用AppErrors.appNotResponding()方法,想用戶或者開發者報告發生ANR了,表現為彈出提示框,提示用戶該程序無法響應,打印相關日志
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。