android模拟anr,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日志

3f1c38899584

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。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值