性能优化(二):ANR

介绍

ANR全称Application Not Responding,意思就是程序未响应。如果一个应用无法响应用户的输入,系统就会弹出一个ANR对话框,用户可以自行选择继续等待亦或者是停止当前程序。

Android系统会监控程序的响应状况,一旦出现下面情况,则弹出ANR对话框

input事件5秒之内再次有事件才会ANR,如果没有不会弹窗

原因:

  • 主线程中存在耗时的计算
  • 主线程被IO操作(从4.0之后网络IO不允许在主线程中)阻塞。
  • 主线程中错误的操作,比如Thread.wait或者Thread.sleep等

代码规范

  • 使用异步子线程处理耗时IO操作。
  • 使用Thread或者HandlerThread时,调用Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)降低优先级,以此降低与主线程竞争的能力。否则仍然会降低程序响应,因为默认Thread的优先级和主线程相同。
  • 使用Handler处理工作线程结果,而不是使用Thread.wait()或者Thread.sleep()来阻塞主线程。
  • Activity的onCreate和onResume回调中尽量避免耗时的代码
  • BroadcastReceiver中onReceive代码也要尽量减少耗时,建议使用IntentService处理。IntentService是一个异步的,会自动停止的服务,很好解决了传统的Service中处理完耗时操作忘记停止并销毁Service的问题
  • Service 或 ContentProvider,虽然应用在后台运行时生命周期函数不会有用户输入引起无响应的 ANR,但其执行时间过长也会引起 Service 或 ContentProvider 的 ANR

排查

系统对 ANR 的捕捉原理:

原因:

  • 线程阻塞或死锁导致的 ANR
  • Binder 导致的 ANR:Binder 通信数据量过大
  • 数据导致的 ANR:频繁 GC 触发 STW 导致主线程暂停,处理事件时间被拉长

排查:

  • main线程状态
  • 关联线程状态
  • CPU 问题:主线程事件
  • GC 问题

日志:

  • /data/anr/traces.txt
    • 通过命令 adb pull /data/anr/ 获取
  • mainlog
    • 需要在程序运行时就时刻记录 adb logcat -v time -b main >mainlog.log
    • 在 mainlog 日志 搜索关键词 ANR in
  • bugreport
    • adb bugreport生成zip包,解压后查看卡顿主线程
  • eventlog
    • 在 eventlog 日志 搜索关键词 am_anr
相关推荐
丷丩4 小时前
三级缓存下MVT地图瓦片服务性能优化策略
算法·缓存·性能优化·gis·geoai-up
小短腿的代码世界5 小时前
Qwt性能优化实战:从源码架构到百万级数据点的实时渲染优化
信息可视化·性能优化·架构
沪漂阿龙6 小时前
MySQL 面试题爆款详解:InnoDB 页机制、B+树索引、Buffer Pool、Redo Log、页分裂与性能优化一次讲透
b树·mysql·性能优化
Pu_Nine_98 小时前
IntersectionObserver 详解:封装 Vue 指令实现图片懒加载
前端·javascript·vue.js·性能优化
爱喝水的鱼丶9 小时前
SAP-ABAP:数据类型与数据对象(8篇) 第七篇:进阶优化篇——基于类型与对象特征的性能优化技巧
运维·数据库·学习·性能优化·sap·abap·开发交流
jiayong2312 小时前
前端面试题库 - 工程化与性能优化篇
前端·面试·性能优化
计算机安禾13 小时前
【c++面向对象编程】第35篇:构造函数与异常:如何避免资源泄露?
开发语言·javascript·c++·算法·性能优化
绝知此事14 小时前
【计算机网络系列 3/3】网络安全与性能优化:HTTPS、WebSocket、负载均衡实战
计算机网络·web安全·性能优化
WL_Aurora14 小时前
MySQL慢查询分析与优化实战
mysql·性能优化·慢查询·查询优化
阿坤带你走近大数据1 天前
Java中的JVM、类加载记住、多线程、性能优化的概念
java·jvm·性能优化