ANR產(chǎn)生原因
出現(xiàn)ANR一般有以下幾種原因:
-
KeyDispatchTimeout(常見(jiàn))
input事件在5s內(nèi)沒(méi)有處理完成
logcat日志關(guān)鍵字:Input event dispatching timed out -
BroadcastTimeout
前臺(tái)Broadcast:onReceiver在10S內(nèi)沒(méi)有處理完成發(fā)生ANR。
后臺(tái)Broadcast:onReceiver在60s內(nèi)沒(méi)有處理完成發(fā)生ANR。
logcat日志關(guān)鍵字:Timeout of broadcast BroadcastRecord -
ServiceTimeout
前臺(tái)Service:onCreate,onStart,onBind等生命周期在20s內(nèi)沒(méi)有處理完成發(fā)生ANR。
后臺(tái)Service:onCreate,onStart,onBind等生命周期在200s內(nèi)沒(méi)有處理完成發(fā)生ANR
logcat日志關(guān)鍵字:Timeout executing service -
ContentProviderTimeout
ContentProvider 在10S內(nèi)沒(méi)有處理完成發(fā)生ANR。
logcat日志關(guān)鍵字:timeout publishing content providers
典型的ANR場(chǎng)景
1)主線程頻繁進(jìn)行IO操作,比如讀寫(xiě)文件或者數(shù)據(jù)庫(kù);
2)硬件操作如進(jìn)行調(diào)用照相機(jī)或者錄音等操作;
3)多線程操作的死鎖,導(dǎo)致主線程等待超時(shí);
4)主線程操作調(diào)用join()方法、sleep()方法或者wait()方法;
5)耗時(shí)動(dòng)畫(huà)/耗資源行為導(dǎo)致CPU負(fù)載過(guò)重
6)system server中發(fā)生WatchDog ANR;
7)service binder的數(shù)量達(dá)到上限