Android anr的產生與分析

ANR即Application Not Responding應用無響應,一般在ANR的時候會彈出一個應用無響應對話框。

1 查看Android anr的出現:

需要在開發者選項中設置了“顯示所有應用無響應-爲後臺應用顯示無響應ANR對話框”

2 查看Android anr的日誌

1插上Android手機,使用adb logcat -v time 獲取當前Android app anr日誌,日誌中查找anr和包名關鍵字

2位於/data/anr/文件夾下面,trace文件,我們可以通過ANR產生的traces日誌文件分析應用在哪裏產生了ANR,以此來有效解決應用中的ANR。

【是Android Davik虛擬機在收到異常終止信號時產生的,最常見的一個觸發條件就是Android應用中產生了FC(force close)。由於該文件的產生是在DVM中的,所以只有運行DVM實例的進程才能產生該文件,也就是說只有Java代碼才能產生該文件,App應用的Native層(如Android Library、用c/c++編譯的庫)即使異常也不會產生ANR日誌文件。】

3爲什麼會產生ANR

在Android裏,應用程序的響應是由ActivityManager和WindowManager服務系統服務監視的,當檢測到下面三種情況的任何一種時,Android就會針對特定的應用程序顯示ANR對話框。

  • Activity的UI在5秒內沒有響應輸入事件(例如,按鍵按下,屏幕觸摸)–主要類型
  • BroadcastReceiver在10秒內沒有執行完畢
  • Service在特定時間內(20秒內)無法處理完成–小概率類型
  • 造成ANR的原因有很多,無論是在Activity或者BroadcastReceiver還是在Service,我們看到都是在主線程中操作引起的ANR,因此我們應該避免在主線程做太多耗時的操作,網絡請求不用說了,Android4.0以後就禁止在主線程成執行請求了,除此之外就是要注意如下幾個方面:
  • 主線程頻繁進行IO操作,比如讀寫文件或者數據庫;
  • 硬件操作如進行調用照相機或者錄音等操作;
  • 多線程操作的死鎖,導致主線程等待超時;
  • 主線程操作調用join()方法、sleep()方法或者wait()方法;
  • system server中發生WatchDog ANR;
  • service binder的數量達到上限。
  1. 4如何避免ANR
  • 避免在主線程進行復雜耗時的操作,特別是文件讀取或者數據庫操作;
  • 避免頻繁實時更新UI;
  • BroadCastReceiver 要進行復雜操作的的時候,可以在onReceive()方法中啓動一個Service來處理;
  • 避免在IntentReceiver裏啓動一個Activity,因爲它會創建一個新的畫面,並從當前用戶正在運行的程序上搶奪焦點。如果你的應用程序在響應Intent廣 播時需要向用戶展示什麼,你應該使用Notification Manager來實現。
  • 在設計及代碼編寫階段避免出現出現同步/死鎖或者錯誤處理不恰當等情況。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章