Android性能之ANR

1. ANR的现象.

ANR

2.何为ANR.

ANR全程Application Not responding, 也就是”应用无响应”.当操作在一段时间内系统无法处理时 系统层面会弹出ANR对话框.用户可以选择”等待”让程序继续运行, 也可以”强制关闭”. 一个流程的合理的应用程序中不能出现ANR.

3.为什么会产生ANR

在Android理, App的响应能力是有Activity Manager和Window Manager系统服务来监控的, 通常在如下两种情况会弹出ANR对话框:

  • 5s内无法响应用户输入时间(例如键盘输入, 触摸屏幕等).
  • BroadcastReceiver在10S内无法结束.
    造成以上两种情况的首要原因就是在主线程(UI线程)里面做的太多阻塞耗时的操作, 例如文件读写, 数据库督学, 网络查询等等.

    4.ANR分析

    获取ANR产生的trace文件.
    1
    $adb pull data/anr/trace.txt

在log中搜索”ANR in” 或 “am_anr”,会找到ANR发生的log,该行包含了ANR的时间, 进程, 是何种ANR等信息. 以及线程的调用栈信息, 也是分析ANR的核心所在.

5. 如何避免ANR

  • 不要再主线程(UI线程)里面做繁重的操作;
  • 避免频繁实时更新UI;
  • BroadCastReceiver要进行复杂操作的时候, 可以再onReceive()方法中启动一个Service来处理;
  • 避免在IntentReceiver里启动一个Activity, 应该使用Notification Manager来实现
  • 尽量避免主线程被锁的情况, 在一些同步的操作主线程有可能被锁,需要等待其他线程四方相应的锁才能执行, 这样会有一定的ANR风险