題外話:哎饶氏,太菜逼了述寡,java不會導致基本看不太懂鬼雀。大概就是一種每一個字我都認識乎芳,合一起都看不懂的感覺沪编⊥鸲海總之先記錄下來把坎匿,后面有新的再整理進來。
2019/04/19 出現(xiàn)了一個退出登陸ANR的bug雷激。所以ANR和Crash的區(qū)別到底在哪里呢替蔬?
一、ANR (Application Not Responding)
1.是什么屎暇?
當操作在一段時間內(nèi)系統(tǒng)無法處理時承桥,會彈出一個彈窗顯示表示應用程序無響應。
為什么會產(chǎn)生ANR根悼?
KeyDispatchTimeout(5 seconds) ——主要類型按鍵或觸摸事件在特定時間內(nèi)無響應凶异。
BroadcastTimeout(10 seconds) ——BroadcastReceiver在特定時間內(nèi)無法處理完成蜀撑。
每次廣播到來時,會重新創(chuàng)建 BroadcastReceiver 對象,并且調(diào)用 onReceive() 方法,執(zhí)行完以后該對象即被銷毀。當 onReceive() 方法在 10 秒內(nèi)沒有執(zhí)行完畢,Android會認為該程序無響應剩彬。所以在BroadcastReceiver 里不能做一些比較耗時的操作 , 否側會彈出 ANR的對話框酷麦。
ServiceTimeout(20 seconds) ——小概率類型 Service在特定的時間內(nèi)無法處理完成。
超時一般有兩種原因喉恋,一是當前的事件沒有機會得到處理(即UI線程正在處理前一個事件沃饶,沒有及時的完成或者looper被某種原因阻塞住了),二是當前的事件正在處理轻黑,但沒有及時完成糊肤。
3.怎么解決ANR
Android中主線程更新UI,子線程執(zhí)行耗時操作氓鄙。不要在主線程做繁重的操作馆揉。 盡量用Handler來處理UIthread和別的thread之間的交互。
如果所有的工作都在UI線程抖拦,一些比較耗時的工作比如(訪問網(wǎng)絡升酣,下載數(shù)據(jù),查詢數(shù)據(jù)庫等)蟋座,很容易造成主線程的阻塞拗踢,導致事件停止分發(fā)(包括繪制事件)。輕則降低用戶體驗向臀,更壞的情況是巢墅,如果主線程被阻塞超過5秒,就會導致ANR券膀,彈出應用程序沒有響應君纫,是等待還是關閉的警告
4.定位
- 首先分析log
- 從trace.txt文件查看調(diào)用stack.
ANR產(chǎn)生時, 系統(tǒng)會生成一個traces.txt的文件放在/data/anr/下. 可以通過adb命令adb pull data/anr/traces.txt .
將其導出到本地。
P0級別的信息: Did芹彬、堆棧信息(如有)蓄髓、app版本號、ci 鏈接舒帮。
P1級別的信息: trace.txt(對故障機執(zhí)行adb pull /data/anr/ ~/Desktop/yourpath/ 將導出的trace相關文件打包附在JIRA上 ) mapping文件(可在ci上找到)等
提供這些信息基本上就ok了~ - 看代碼
- 仔細查看ANR的成因(iowait?block?memoryleak?)