Android ANR 小结

ANR说明和原因

ANR全称:Application Not Responding,应用程序无响应。

原因:Android系统中,ActivityManagerService(AMS)和WindowManagerService(WMS)会检测App的响应时间,如果在特定时间无法响应屏幕触摸或者键盘输入时间,或者特定事件没有处理完毕,就会出现ANR。

以下4个条件都可以造成ANR发生:
1、5秒内无法响应屏幕触摸事件或者键盘输入事件。
2、在执行前台广播(BroadcastReceiver)的onReceiver函数时10S没有处理完成,后台为60S。
3、前台服务service20S内,后台服务200s内没有执行完毕。
4、ContentProvider的publish在10s内没有进行完。

如何避免:尽量避免在主线程中做耗时操作。

ANR分析方法

Log日志

image.png

WaitingInMainSignalCatcherLoop,大概意思为主线程等待异常。
The application may be doing too much work on its main thread.告知可能在主线程做了太多的工作。

traces.txt

adb pull /data/anr/traces.txt

traces.txt默认会被导出到Android SDK的\platform-tools目录
可以通过log找到相关问题
进程id和包名
造成ANR的原因
造成ANR的具体行数

特别注意:产生新的ANR,原来的traces.txt文件会被覆盖。

Java线程调用分析

通过JDK提供的命令可以帮助分析和调试Java应用

jstack {pid}

DDMS分析ANR问题

使用DDMS——Update Threads工具

造成ANR原因以及解决办法

常见的主要是主线程耗时操作导致的ANR。其他原因还有很多:
1、主线程阻塞或主线程数据读取
解决办法:避免死锁的出现,使用子线程来处理耗时操作或阻塞任务。尽量避免在主线程query provider、不要滥用SharePreference;

SharePreference是一个轻量级存储方式。
1、不能存储过大的key和value。
原因:第一次重sp中获取值的时候,可能阻塞主线程,使得界面卡顿。
解析sp的时候会产生大量的临时对象,导致频繁GC,引起界面卡顿。
这些key和value会永远存储在内存中,占用大量内存。
2、存储JSON或HTML等特殊符号很多的value
json如果比较大,会引起SP读取速度下降;另外里面很多特殊符号需要转义,引发额外的字符串拼接和函数调用开销。
3、多次edit多次apply
每次edit都会创建一个Editor对象,额外占用内存;多次apply可能造成界面卡顿。
4、不能跨进程使用

2、CPU满负荷,I/O阻塞
解决办法:文件读写或者数据库操作放在子线程异步操作。
3、内存不足。
解决办法:内存优化。
4、各大组件ANR。

你可能感兴趣的:(Android ANR 小结)