探索App性能优化之稳定性优化-避免出现ANR

探索App性能优化之稳定性优化-避免出现ANR

Android小彩虹2021-07-08 15:20:21130A+A-

一、什么是ANR

ANR是Android中的概念,全称Application Not Responding(应用程序无响应),会弹出:页面无响应的对话框。如何定位和避免是Android程序员的必备修养。

二、发生ANR的条件

应用程序的响应性是由ActivityManager和WindowManager系统服务监视的,当ANR发生条件满足时,就会弹出ANR的对话框。

  • 1.Activity超过5秒无响应;
  • 2.BroadcastReceiver超过10秒无响应;
  • 3.ervice超过20秒无响应;

三、造成ANR的主要原因

当应用程序的UI线程响应超时才会引起ANR,超时产生的原因有两种:

  • 1.当前事件被某个事件给阻塞掉了,例如UI线程正在响应另外的事件;
  • 2.当前事件正在处理,但是由于耗时太长没有能及时的完成;

四、典型的ANR问题场景

  • 1.应用程序UI线程存在耗时操作(在UI线程中进行网络请求、数据库操作文件操作),可能会导致UI线程无法及时处理用户输入等;
  • 2.应用程序UI线程等待子线程释放某个锁,从而无法处理用户的请求的输入;
  • 3.耗时操作的动画需要大量的计算工作,可能导致CPU负载过重;
  • 4.垃圾设备中,弱网络,频繁操作

五、注意事项

  • 1.主线程被IO操作阻塞;
  • 2.Activity的所有生命周期回调都是执行在主线程的;
  • 3.Service默认执行在主线程中;
  • 4.BoardcastReceiver的回调onReceive()执行在主线程中;
  • 5.AsyncTask的回调除了doInBackground,其他都是在主线程中;
  • 6.没有使用子线程Looper的Handler的handlerMessage,post(Runnable)都是执行在主线程中;

六、如何解决ANR

ANR避免的思想:避免在主线程中做耗时操作。

  • 1.使用AsyncTask处理耗时IO操作
  • 2.使用Thread或HandlerThread提高优先级
  • 3.使用Handler处理工作线程的耗时操作
  • 4.Activity的onCreate和onResume回调尽量避免耗时操作

七、ANR定位和分析

ANR定位(traces文件):ANR日志存在/data/anr/traces.txt,可以分析logcat日志和traces文件的相关信息输出去定位出现ANR的原因。

主要包含以下几方面:

  • 1.基本信息,包括进程名、进程号、包名、系统build号、ANR类型等;
  • 2.CPU使用信息,包括活跃进程的CPU 平均占用率、IO情况等;
  • 3.线程堆栈信息,所属进程包括发生ANR的进程、其父进程、最近有活动的3个进程等。

八、ANR的检测工具

BlockCanary使用方式和LeakCanary相同

点击这里复制本文地址 以上内容由权冠洲的博客整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!

支持Ctrl+Enter提交

联系我们| 本站介绍| 留言建议 | 交换友链 | 域名展示
本站资源来自互联网收集,仅供用于学习和交流,请遵循相关法律法规,本站一切资源不代表本站立场,如有侵权、后门、不妥请联系本站删除

权冠洲的博客 © All Rights Reserved.  Copyright quanguanzhou.top All Rights Reserved
苏公网安备 32030302000848号   苏ICP备20033101号-1

联系我们