Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Bugly即将支持的ANR,精神哥告诉你是个什么鬼?

Bugly即将支持的ANR,精神哥告诉你是个什么鬼?

作者头像
腾讯Bugly
发布于 2018-03-22 09:05:29
发布于 2018-03-22 09:05:29
2.8K11
代码可运行
举报
文章被收录于专栏:腾讯Bugly的专栏腾讯Bugly的专栏
运行总次数:1
代码可运行

上帝说要有ANR,于是Bugly就有了ANR上报,那么ANR到底是什么?

最近很多童鞋问起精神哥ANR的问题,那么这次就来聊一下,鸡爪怎么泡才好吃,噢不,是如何快速定位ANR。

ANR是什么

简单说,通常就是App运行的时候,duang~卡住了,怎么搞都动不了。当卡住超过一定时间,Android系统认为这就是一次“ANR(Application Not Responding)”。

具体说,在以下情况发生时,会发生ANR(可能在不同ROM 中时间有所更改):

  • 用户的输入在5s内没被App响应;
  • BroadcastReceiver的onReceiver()超过10s;
  • Service中各生命周期函数执行超过20s。

ANR必须死

用户在App的绝大部分操作,都需要有App的主动回应,比如按下按钮之后按钮样式的改变、下拉滚动条内容的移动、加载资源时的菊花转转转,它们都是“操作-反馈”配对的模式。对于我们手机上最常见的触摸操作,0.1s的响应延迟已经有很明显的卡顿感了。而对于常见的ANR,用户至少要等5s以上!

发生了ANR,往往会弹出对话框,问用户是继续等待还是直接关掉:

相信几乎所有Android手机用户都见过这个然并卵的ANR对话框,但大部分普通用户根本不知道这个对话框在讲什么,并且往往也只有关闭App。漫长的等待就给我看这个?从用户的体验看,就是心中一万只草泥马奔腾起来撞火车的感受。可见ANR对于应用的影响并不亚于Crash。

一般来说,界面相对越不“流畅”的App(说明UI线程耗时操作多)越容易发生ANR(一个输入事件在某个设备A上4秒有了反馈,并不意味着它在其他设备B上是安全的)。ANR其实就是界面卡顿的极端情况。反过来,只要通过合理的方案消灭了App出现的ANR,往往也同时会使App展示界面表现会更加顺滑流畅。

一些典型的ANR 问题场景

这里举几个容易发生ANR的场景:

1)最常见的错误,UI线程等待其它线程释放某个锁,导致UI线程无法处理用户输入;

2)游戏中每帧动画都进行了比较耗时的大量计算,导致CPU忙不过来;

3)Web应用中,网络状态不稳定,而界面在等待网络数据;

4)UI线程中进行了一些磁盘IO(包括数据库、SD卡等等)的操作,在个别设备上因为硬件损坏等原因阻塞住了;

5)手机被其他App占用着CPU,自己获取不到足够的CPU 时间片,纯属误伤。

通过ANR 日志定位问题

当ANR发生时,我们往往通过Logcat和traces文件(目录/data/anr/)的相关信息输出去定位问题。主要包含以下几方面:

1)基本信息,包括进程名、进程号、包名、系统build号、ANR 类型等等;

2)CPU使用信息,包括活跃进程的CPU 平均占用率、IO情况等等;

3)线程堆栈信息,所属进程包括发生ANR的进程、其父进程、最近有活动的3个进程等等。

这里举个简单的例子(实际上因为各App所处环境各异,可能出现各种各样复杂的ANR情况)当App运行卡住,弹出ANR对话框,查看Logcat输出:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ActivityManager: ANR in com.tencent.bugly.demo (com.tencent.bugly.demo/.MainActivity)
ActivityManager: PID: 18617
ActivityManager: Reason: Input dispatching timed out (Waiting because the touched window has not finished processing the input events that were previously delivered to it.)
ActivityManager: Load: 18.42 / 18.09 / 18.29
ActivityManager: CPU usage from 5924ms to 475ms ago:
ActivityManager: 93% 18617/com.tencent.bugly.demo: 93% user + 0% kernel / faults: 75 minor
……
ActivityManager: CPU usage from 2906ms to 3429ms later:
ActivityManager: 96% 18617/com.tencent.bugly.demo: 96% user + 0% kernel
……
ActivityManager: 55% TOTAL: 51% user + 3.8% kernel

分析一下,从Logcat可以得到以下信息:

  1. com.tencent.bugly.demo这个App的MainActivity发生了ANR,进程号18617;
  2. ANR原因:用户输入超时;
  3. ANR发生前、后一段时间分别附在情况:在ANR发生前后,CPU有90+%耗费在这个demo上,说明很可能是这个demo自身性能引起的。

接下来再看traces文件确认:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
----- pid 18617 at xxxx -----
Cmd line: com.tencent.bugly.demo
JNI: CheckJNI is off; workarounds are off; pins=0; globals=272 (plus 2 weak)
DALVIK THREADS:
"main" prio=5 tid=1 SUSPENDED
| group="main" sCount=1 dsCount=0 obj=0x415e4e58 self=0x415d3028
| sysTid=18617 nice=0 sched=0/0 cgrp=apps handle=1074372948
| state=S schedstat=( 38588000572 591063492 5767 ) utm=3846 stm=12 core=0
at com.tencent.bugly.demo.MainActivity$3.doCalc(MainActivity.java:~38)
at com.tencent.bugly.demo.MainActivity$3.onClick(MainActivity.java:33)
……

分析一下,traces文件中包含以下信息:

1、进程号:18617;包名:com.tencent.bugly.demo;

2、发生ANR时,main线程被挂起(也可能是其他等待状态,比如TIMED_WAIT);

3、线程的几个重要参数:

  • group:线程组名称“main”;
  • sCount:Suspended个数“1”;
  • obj:线程的Java对象地址;
  • self:线程的Native对象地址;
  • sysTid:线程号(这里主线程的线程号=进程号)“18617”;

4、具体堆栈:从堆栈可以很清晰看出是doCalc()方法出的问题,由onClick触发。

综合以上分析,问题还原为:com.tencent.bugly.demo这个App的MainActivity中有个耗时的doCalc方法在跑,无法响应用户的触摸或按键输入。OK,接下来在代码里找问题就好了。

如何解决ANR

当然是尽可能减少UI线程的耗时操作,以及BroadcastReceiver、Service生命周期中的标准回调方法啦。

Android官方文档建议:

1)使用AsyncTask类,可以很方便地实现子线程耗时操作与UI更新;

2)对于BroadcastReceiver的耗时操作,建议放到Service中执行;

3)对于自建的Thread,可以通过Handler使之与UI 线程通信(这里需要注意的是,Thread默认优先级和UI线程是一样的,建议设置一般线程优先级为Process.THREAD_PRIORITY_BACKGROUND)。

这些方案大家应该都知道,不过仍难免有大量的ANR是写代码时忽略了,在测试时没发生,最终在用户的手机上出现的。回想一下是不是都经历过用户会反馈“App卡死没反应了”,但开发GG客服MM们却又因为缺少日志或无法复现而束手无策?因此要修复ANR,首先是要能发现用户ANR了,并且能知道是哪段代码导致ANR了,这样才能谈修复

为了帮助广大开发者解决这一难题,腾讯Bugly针对iOS的卡顿及Android的ANR提供监测服务即将上线,协助开发者轻松定位问题。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2015-06-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 腾讯Bugly 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
Bugly监控ANR时,traces.txt文件有没有上传呀,上传到哪里呢
Bugly监控ANR时,traces.txt文件有没有上传呀,上传到哪里呢
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
笔记37 | Android App优化之ANR详解
地址 http://www.jianshu.com/u/c187b887771f ---- 什么是ADR ANR全名Application Not Responding, 也就是"应用无响应". 当操作在一段时间内系统无法处理时, 系统层面会弹出上图那样的ANR对话框. 在Android里, App的响应能力是由Activity Manager和Window Manager系统服务来监控的. 通常在如下两种情况下会弹出ANR对话框: 5s内无法响应用户输入事件(例如键盘输入, 触摸屏幕等). Broadca
项勇
2018/06/19
1.4K0
备战秋招 面试真题: 给你一个Demo 你如何快速定位ANR?
在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作“应用程序无响应”(ANR:Application Not Responding)对话框。用户可以选择“等待”而让程序继续运行,也可以选择“强制关闭”。因此,在程序里对响应性能的设计很重要,这样,系统不会显示ANR给用户。
Android技术干货分享
2019/08/27
7320
干货:ANR日志分析全面解析
这句话说的很笼统,要想深入分析定位ANR,需要知道更多知识点,一般来说,ANR按产生机制,分为4类:
2020labs小助手
2021/06/08
2.5K0
Android应用ANR分析
在Android中,程序的响应性是由Activity Manager与Window Manager系统服务来负责监控的,当系统检测到下面的条件之一时会显示ANR的对话框:
用户1205080
2019/03/18
1.2K0
Android App 优化之ANR详解
ANR全名Application Not Responding, 也就是"应用无响应". 当操作在一段时间内系统无法处理时, 系统层面会弹出上图那样的ANR对话框。
用户1269200
2018/08/28
1.1K0
Android App 优化之ANR详解
ANR 原理与实战技巧
00 手机用用,就卡卡卡。莫名其妙的出现一堆程序无响应,欲哭无泪。这是为什么呢?因为你用的android手机。 android手机,为了让手机卡的不成样子,还想让用户知道,就发明了A
用户1263308
2018/02/02
2K0
ANR 原理与实战技巧
Android性能优化面试题经典之ANR的分析和优化
例如,HTTP 请求、下载文件、访问REST API等。网络操作通常需要较长的时间,尤其在网络条件不好的情况下。
AntDream
2024/07/10
2400
Android性能优化面试题经典之ANR的分析和优化
Android高频面试专题 - 进阶篇(一)ANR
ANR:Application Not Responding,即应用无响应,Android系统对于一些事件需要在一定的时间范围内完成,如果超过预定时间能未能得到有效响应或者响应时间过长,都会造成ANR。一般地,这时往往会弹出一个提示框,告知用户当前xxx未响应,用户可选择继续等待或者Force Close。
Android扫地僧
2020/03/19
1.8K0
Android高频面试专题 - 进阶篇(一)ANR
Android ANR 分析学习总结
1. 什么情况下会发生anr (1). KeyDispatchTimeout(5 seconds) --主要类型按键或触摸事件在特定时间内无响应 (2). BroadcastTimeout(10 seconds) --BroadcastReceiver在特定时间内无法处理完成 (3). ServiceTimeout(20 seconds) --小概率类型 Service在特定的时间内无法处理完成 2. KeyDispatchTimeout超时原因 (1). 当前的事件没有机会得到处理(即UI线程正在处理
用户1127566
2018/06/06
2.2K0
ANR日志解析
这句话说的很笼统,要想深入分析定位ANR,需要知道更多知识点,一般来说,ANR按产生机制,分为4类:
派大星在吗
2021/12/16
2.2K0
都知道避免ANR,但该如何分析,定位,解决?
链接:https://www.jianshu.com/p/cfa9ed42e379
陈宇明
2020/12/16
4.5K0
都知道避免ANR,但该如何分析,定位,解决?
ANR问题的定位与分析
ANR问题,相信是日常应用测试中,各位小伙伴都会遇到的问题。本篇对ANR的类型、原因及出现场景、以及ANR定位与分析思路进行了总结!
用户5521279
2020/03/19
4.1K0
Android开发:不会ANR?这里有ANR解析和案例!
相比于发生应用程序崩溃,发生ANR更加让人头大,主要原因是崩溃发生的时候会在Logcat中打印出发生异常的位置,开发人员很容易就能定位到崩溃并解决,显然ANR没那么轻松;但是我们大可不必这么忧伤,因为有问题就会有解决办法,解决不了,只是因为没有用对方法
网易Leo
2021/12/13
1.5K0
oom和anr简单理解
ANR(Application Not Responding)定义 在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application Not Responding)对话框。用户可以选择“等待”而让程序继续运行,也可以选择“强制关闭”。
zhangjiqun
2024/12/16
1410
Android面试高级:内存泄露,OOM,ANR ,Devik 进程,Framework原理,Activity 生成一个 view,Android 中的动画,SurfaceView和View的
主要是hashmap,Vector等,如果是静态集合 这些集合没有及时setnull的话,就会一直持有这些对象。
zhangjiqun
2024/12/16
1400
Android性能优化(七)之你真的理解ANR吗?
在上一篇文章《Android性能优化(六)之卡顿那些事》中,我们提到了卡顿的成因、检测卡顿的途径以及避免卡顿的方法。卡顿再扩大就会产生大名鼎鼎的ANR(Application Not Responding),然后告诉用户你的App无响应,继续等待或者强制关闭,很大的概率用户可能会顺手卸载如此卡的App。
用户2898788
2018/08/21
1.1K0
Android性能优化(七)之你真的理解ANR吗?
Android ANR分析(trace文件的产生流程)
1.当一些带有超时机制的系统消息(如:Service的创建)判定超时后,会调用系统服务AMS接口,收集ANR相关信息并存档(data/anr/trace, data/system/dropbox)
北洋
2021/12/08
1.9K0
Android ANR分析(trace文件的产生流程)
微信Android客户端的ANR监控方案
ANR监控是一个非常有年代感的话题了,但是市面上的ANR监控工具,或者并非真正意义上的ANR的监控(而是5秒卡顿监控);或者并不完善,监控不到到所有的ANR。而想要得到一个完善的ANR监控工具,必须要先了解系统整个ANR的流程。本文分析了ANR的主要流程,给出了一个完善的ANR监控方案。该方案已经在Android微信客户端上经过全量验证,稳定地运行了一年多的时间。 我们知道ANR流程基本都是在system_server系统进程完成的,系统进程的行为我们很难监控和改变,想要监控ANR就必须找到系统进程跟
微信终端开发团队
2021/07/19
5.1K0
android学习笔记----ANR
编写能够赢得世界上所有性能测试的代码是可能的,但是仍然感觉迟钝,挂起或冻结很长时间,或者处理输入需要很长时间。应用程序的响应能力可能发生的最糟糕的事情是“应用程序无响应”(ANR)对话框。
砖业洋__
2023/05/06
6350
android学习笔记----ANR
Android ANR产生原因和解决办法
ANR (Application Not Responding)       ANR定义:在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application Not Responding)对话框。用户可以选择“等待”而让程序继续运行,也可以选择“强制关闭”。所以一个流畅的合理的应用程序中不能出现anr,而让用户每次都要处理这个对话框。因此,在程序里对响应性能的设计很重要,这样系统不会显示ANR给用户。     默认情况下,在android中Activity的最长执行时间是5秒,BroadcastReceiver的最长执行时间则是10秒。 第一:什么会引发ANR?     在Android里,应用程序的响应性是由Activity Manager和WindowManager系统服务监视的 。当它监测到以下情况中的一个时,Android就会针对特定的应用程序显示ANR: 1.在5秒内没有响应输入的事件(例如,按键按下,屏幕触摸) 2.BroadcastReceiver在10秒内没有执行完毕 造成以上两点的原因有很多,比如在主线程中做了非常耗时的操作,比如说是下载,io异常等。     潜在的耗时操作,例如网络或数据库操作,或者高耗时的计算如改变位图尺寸,应该在子线程里(或者以数据库操作为例,通过异步请求的方式)来完成。然而,不是说你的主线程阻塞在那里等待子线程的完成——也不是调用 Thread.wait()或是Thread.sleep()。替代的方法是,主线程应该为子线程提供一个Handler,以便完成时能够提交给主线程。以这种方式设计你的应用程序,将能保证你的主线程保持对输入的响应性并能避免由于5秒输入事件的超时引发的ANR对话框。 第二:如何避免ANR? 1、运行在主线程里的任何方法都尽可能少做事情。特别是,Activity应该在它的关键生命周期方法(如onCreate()和onResume())里尽可能少的去做创建操作。(可以采用重新开启子线程的方式,然后使用Handler+Message的方式做一些操作,比如更新主线程中的ui等) 2、应用程序应该避免在BroadcastReceiver里做耗时的操作或计算。但不再是在子线程里做这些任务(因为 BroadcastReceiver的生命周期短),替代的是,如果响应Intent广播需要执行一个耗时的动作的话,应用程序应该启动一个 Service。(此处需要注意的是可以在广播接受者中启动Service,但是却不可以在Service中启动broadcasereciver,关于原因后续会有介绍,此处不是本文重点) 3、避免在Intent Receiver里启动一个Activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点。如果你的应用程序在响应Intent广 播时需要向用户展示什么,你应该使用Notification Manager来实现。 总结:anr异常也是在程序中自己经常遇到的问题,主要的解决办法自己最常用的就是不要在主线程中做耗时的操作,而应放在子线程中来实现,比如采用Handler+mesage的方式,或者是有时候需要做一些和网络相互交互的耗时操作就采用asyntask异步任务的方式(它的底层其实Handler+mesage有所区别的是它是线程池)等,在主线程中更新UI。
张拭心 shixinzhang
2022/11/30
6910
相关推荐
笔记37 | Android App优化之ANR详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验