Android anr的产生与分析

ANR即Application Not Responding应用无响应,一般在ANR的时候会弹出一个应用无响应对话框。

1 查看Android anr的出现:

需要在开发者选项中设置了“显示所有应用无响应-为后台应用显示无响应ANR对话框”

2 查看Android anr的日志

1插上Android手机,使用adb logcat -v time 获取当前Android app anr日志,日志中查找anr和包名关键字

2位于/data/anr/文件夹下面,trace文件,我们可以通过ANR产生的traces日志文件分析应用在哪里产生了ANR,以此来有效解决应用中的ANR。

【是Android Davik虚拟机在收到异常终止信号时产生的,最常见的一个触发条件就是Android应用中产生了FC(force close)。由于该文件的产生是在DVM中的,所以只有运行DVM实例的进程才能产生该文件,也就是说只有Java代码才能产生该文件,App应用的Native层(如Android Library、用c/c++编译的库)即使异常也不会产生ANR日志文件。】

3为什么会产生ANR

在Android里,应用程序的响应是由ActivityManager和WindowManager服务系统服务监视的,当检测到下面三种情况的任何一种时,Android就会针对特定的应用程序显示ANR对话框。

  • Activity的UI在5秒内没有响应输入事件(例如,按键按下,屏幕触摸)–主要类型
  • BroadcastReceiver在10秒内没有执行完毕
  • Service在特定时间内(20秒内)无法处理完成–小概率类型
  • 造成ANR的原因有很多,无论是在Activity或者BroadcastReceiver还是在Service,我们看到都是在主线程中操作引起的ANR,因此我们应该避免在主线程做太多耗时的操作,网络请求不用说了,Android4.0以后就禁止在主线程成执行请求了,除此之外就是要注意如下几个方面:
  • 主线程频繁进行IO操作,比如读写文件或者数据库;
  • 硬件操作如进行调用照相机或者录音等操作;
  • 多线程操作的死锁,导致主线程等待超时;
  • 主线程操作调用join()方法、sleep()方法或者wait()方法;
  • system server中发生WatchDog ANR;
  • service binder的数量达到上限。
  1. 4如何避免ANR
  • 避免在主线程进行复杂耗时的操作,特别是文件读取或者数据库操作;
  • 避免频繁实时更新UI;
  • BroadCastReceiver 要进行复杂操作的的时候,可以在onReceive()方法中启动一个Service来处理;
  • 避免在IntentReceiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。如果你的应用程序在响应Intent广 播时需要向用户展示什么,你应该使用Notification Manager来实现。
  • 在设计及代码编写阶段避免出现出现同步/死锁或者错误处理不恰当等情况。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值