application not response 簡稱ANR ,應(yīng)用程序無響應(yīng)。當(dāng)應(yīng)用在5秒內(nèi)對用戶輸入或點(diǎn)擊等事件無響應(yīng)時(shí),Android便會(huì)認(rèn)為應(yīng)用無響應(yīng),彈出ANR 提示窗
1.產(chǎn)生場景
activity內(nèi)對事件 5秒無法完成處理
BroadcastReceiver 內(nèi)對事件10秒無法完成處理
Service 的各個(gè)生命周期函數(shù)在特定時(shí)間(20秒)內(nèi)無法完成處理
2.原理
Android 應(yīng)用在啟動(dòng)時(shí)會(huì)創(chuàng)建一個(gè)UI線程,該線程只負(fù)責(zé)UI界面更新,在該線程中進(jìn)行耗時(shí)操作會(huì)導(dǎo)致線程阻塞,可能引起ANR
3.定位分析
當(dāng)一個(gè)進(jìn)程發(fā)生了ANR了以后,系統(tǒng)會(huì)在/data/anr目錄下創(chuàng)建一個(gè)文件traces.txt,通過分析這個(gè)文件就能定位出ANR的原因。
文件導(dǎo)出
adb pull /data/anr/traces.txt
或者也可以直接查看lockat日志進(jìn)行分析
4.檢測預(yù)防
1.使用Android SDK自帶的StrictMode(嚴(yán)格模式)進(jìn)行檢測
StrictMode使用教程地址:
https://droidyue.com/blog/2015/09/26/android-tuning-tool-strictmode/
2.使用BlockCanary
BlockCanary是一個(gè)非侵入時(shí)的性能監(jiān)控函數(shù)庫,其特點(diǎn)有:
a.非侵入式,簡單的兩行就打開監(jiān)控,不需要到處打點(diǎn),破壞代碼優(yōu)雅性。
b.精準(zhǔn),輸出的信息可以幫助定位到問題所在(精確到行),不需要像Logcat一樣,慢慢去找。
目前包括了核心監(jiān)控輸出文件,以及UI顯示卡頓信息功能且集成簡單快速
教程:
http://www.itdecent.cn/p/cd7fc77405ac
5.解決
解決方案寫下來其實(shí)就是一句話的事:不要再主線程進(jìn)行耗時(shí)操作,涉及網(wǎng)絡(luò)請求、文件讀取、數(shù)據(jù)庫訪問等耗時(shí)操作的事件盡量開一個(gè)子線程去執(zhí)行。具體ANR 的避免還是需要在日常編碼中注意規(guī)范。