ANR的類型
- KeyDispatchTimeout(5 seconds) --主要類型按鍵或觸摸事件在特定時(shí)間內(nèi)無(wú)響應(yīng)
- BroadcastTimeout(10 seconds) --BroadcastReceiver在特定時(shí)間內(nèi)無(wú)法處理完成
- ServiceTimeout(20 seconds) --小概率類型 Service在特定的時(shí)間內(nèi)無(wú)法處理完成
- Service ANR,前臺(tái)進(jìn)程中Service生命周期不能超過(guò)20秒,后臺(tái)進(jìn)程中Service的生命周期不能超過(guò)200秒。 在啟動(dòng)Service時(shí),拋出定時(shí)消息SERVICE_TIMEOUT_MSG或SERVICE_BACKGOURND_TIMEOUT_MSG,如果定時(shí)消息響應(yīng)了,則說(shuō)明發(fā)生了ANR
- Broadcast ANR,前臺(tái)的“串行廣播消息”必須在10秒內(nèi)處理完畢,后臺(tái)的“串行廣播消息”必須在60秒處理完畢, 每派發(fā)串行廣播消息到一個(gè)接收器時(shí),都會(huì)拋出一個(gè)定時(shí)消息BROADCAST_TIMEOUT_MSG,如果定時(shí)消息響應(yīng),則判斷是否廣播消息處理超時(shí),超時(shí)就說(shuō)明發(fā)生了ANR
- Input ANR,輸入事件必須在5秒內(nèi)處理完畢。在派發(fā)一個(gè)輸入事件時(shí),會(huì)判斷當(dāng)前輸入事件是否需要等待,如果需要等待,則判斷是否等待已經(jīng)超時(shí),超時(shí)就說(shuō)明發(fā)生了ANR
詳見(jiàn)ANR機(jī)制及問(wèn)題分析
如何分析ANR
需要經(jīng)過(guò)日志獲取、問(wèn)題定位和場(chǎng)景還原三個(gè)步驟。
- 分析Log。
從LOG可以看出ANR的類型,CPU的使用情況,如果CPU使用量接近100%,說(shuō)明當(dāng)前設(shè)備很忙,有可能是CPU饑餓導(dǎo)致了ANR,如果CPU使用量很少,說(shuō)明主線程被BLOCK了,如果IOwait很高,說(shuō)明ANR有可能是主線程在進(jìn)行I/O操作造成的。
- 從trace.txt查看stack調(diào)用情況。
- 看代碼
- 仔細(xì)查看ANR的成因(iowait?block?memoryleak?)
詳見(jiàn)[[轉(zhuǎn)]Android ANR 分析解決方法]