ANR 出现的场景,定位办法以及解决方案

ANR 出现的场景,定位办法以及解决方案

1. 定义

Application not response,简称 ANR,即应用程序无响应。

当应用在5秒内对用户输入或点击等事件无响应时,Android便会认为应用无响应,弹出ANR 提示窗。

2. 原因

Android 应用在启动时会创建一个UI线程,该线程只负责 UI 界面更新,在该线程中进行耗时操作会导致线程阻塞,可能引起ANR。

3. 产生场景

  1. Activity 内对事件 5 秒无法完成处理;
  2. BroadcastReceiver 内对事件10秒无法完成处理;
  3. Service 的各个生命周期函数在特定时间(20秒)内无法完成处理;

4. 问题定位

  1. logcat 分析崩溃日志;

  2. 当一个进程发生了ANR了以后,系统会在/data/anr目录下创建一个文件 traces.txt

adb pull /data/anr/traces.txt

5. 代码检测

  1. 使用Android SDK自带的 StrictMode(严格模式)进行检测

  2. 使用非侵入时的性能监控函数库 BlockCanary

    • 非侵入式,简单的两行就打开监控,不需要到处打点,破坏代码优雅性。

    • 精准,输出的信息可以帮助定位到问题所在(精确到行),不需要像Logcat一样,慢慢去找。

6. 解决

解决方案是对于耗时的操作,比如访问网络、访问数据库等操作,需要开辟子线程,在子线程处理耗时的操作,主线程主要实现UI的操作。

你可能感兴趣的:(ANR 出现的场景,定位办法以及解决方案)