Android中的ANR簡述

山有木xi發表於2020-05-08

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了,表現為彈出提示框,提示使用者該程式無法響應,列印相關日誌

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69917874/viewspace-2690614/,如需轉載,請註明出處,否則將追究法律責任。

相關文章