前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Android应用ANR分析

Android应用ANR分析

作者头像
用户1205080
发布于 2019-03-18 06:48:51
发布于 2019-03-18 06:48:51
1.2K00
代码可运行
举报
文章被收录于专栏:编码前线编码前线
运行总次数:0
代码可运行

概述

Android应用的UI线程被阻塞太久时,就会触发一个”Application Not Responding“(ANR)错误。如果APP运行在前台,系统就会弹出一个提示框,告知用户,用户可以选择继续等待或者强制关掉。

ANR的原因

ANR是因为负责更新UI的主线程无法处理用户输入事件或绘制操作,而导致的糟糕体验。

在Android中,程序的响应性是由Activity Manager与Window Manager系统服务来负责监控的,当系统检测到下面的条件之一时会显示ANR的对话框:

  • 对输入事件(例如硬件点击或者屏幕触摸事件),5秒内都无响应。
  • BroadcastReceiver不能在10秒内结束接收到的任务。

ANR的触发场景

  1. 在主线程执行耗时的IO操作。
  2. 在主线程执行耗时的计算。
  3. 在主线程与其他进程进行同步的binder调用,并且另一个进程需要很长时间才能返回。
  4. 主线程因等待其他线程的同步锁( synchronized)而被长时间阻塞。
  5. 主线程与另一个线程处于死锁状态。

检测ANR

Strict mode

使用 StrictMode可以帮助你在开发的过程中发现在主线程意外的IO操作。

可以在Application、Activity或者其他应用组件进行配置:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public void onCreate() {     if (DEVELOPER_MODE) {         StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()                 .detectDiskReads()                 .detectDiskWrites()                 .detectNetwork()   // or .detectAll() for all detectable problems                 .penaltyLog()                 .build());         StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()                 .detectLeakedSqlLiteObjects()                 .detectLeakedClosableObjects()                 .penaltyLog()                 .penaltyDeath()                 .build());     }     super.onCreate();}
允许后台ANR弹窗

默认情况下,Android只显示前台ANR弹窗,如果需要允许显示后台ANR弹窗,就要到开发者选项,开启”Show all ANRs“。

TraceView

使用Traceview去跟踪正在运行的应用,并定位主线程忙碌的位置。

分析traces日志文件

当发生ANR,Android系统会存储日志文件。 日志路径: 旧版系统: /data/anr/traces.txt 新版系统: /data/anr/anr_*

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public class MainActivity extends AppCompatActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        findViewById(R.id.btn_doANR).setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                try {                    Thread.sleep(100000);                } catch (InterruptedException e) {                    e.printStackTrace();                }            }        });    }}

上面代码触发了ANR,相关日志:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
"main" prio=5 tid=1 Sleeping  | group="main" sCount=1 dsCount=0 flags=1 obj=0x75115ec8 self=0xeb674000  | sysTid=10723 nice=-10 cgrp=default sched=0/0 handle=0xf02fa494  | state=S schedstat=( 384398145 34829357 257 ) utm=26 stm=12 core=2 HZ=100  | stack=0xff10b000-0xff10d000 stackSize=8MB  | held mutexes= // Java调用堆栈信息,可以查看调用关系,定位到具体位置  at java.lang.Thread.sleep(Native method)  - sleeping on <0x02ed72b7> (a java.lang.Object)  at java.lang.Thread.sleep(Thread.java:373)  - locked <0x02ed72b7> (a java.lang.Object)  at java.lang.Thread.sleep(Thread.java:314)  at com.github.xch168.anrdemo.MainActivity$1.onClick(MainActivity.java:18)// 触发ANR的方法  at android.view.View.performClick(View.java:6597)  at android.view.View.performClickInternal(View.java:6574)  at android.view.View.access$3100(View.java:778)  at android.view.View$PerformClick.run(View.java:25885)  at android.os.Handler.handleCallback(Handler.java:873)  at android.os.Handler.dispatchMessage(Handler.java:99)  at android.os.Looper.loop(Looper.java:193)  at android.app.ActivityThread.main(ActivityThread.java:6669)  at java.lang.reflect.Method.invoke(Native method)  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

如何避免ANR

  1. 在工作线程中,执行耗时操作,如网络、DB操作或者Bitmap大小调整的操作。
  2. 使用AsyncTask来执行耗时操作。
  3. 使用线程或者HandlerThread,要通过 Process.setThreadPriority()并传递 THREAD_PRIORITY_BACKGROUND来设置线程的优先级为”background“,不然这个线程仍然会使得你的应用显得卡顿,因为这个线程默认与UI线程有着同样的优先级。
  4. 避免在BroadcastReceiver中执行耗时操作,如保存数据或者注册一个Notification。不能通过工作线程来执行复杂的任务操作,而应该启动一个 IntentService来响应BroadcastReceiver中的长时间任务。

参考链接

  1. [ANRs]https://developer.android.com/topic/performance/vitals/anr
  2. [避免出现程序无响应ANR]http://hukai.me/android-training-course-in-chinese/performance/perf-anr/index.html
  3. [Android应用ANR分析]https://www.jianshu.com/p/30c1a5ad63a3
  4. [StrictMode]https://developer.android.com/reference/android/os/StrictMode.html
  5. [ANR监测机制]https://www.jianshu.com/p/ad1a84b6ec69
  6. [理解Android ANR的触发原理]https://gityuan.com/2016/07/02/android-anr/
  7. [Android ANR日志分析指南]https://juejin.im/post/5be698d4e51d452acb74ea4c
  8. [ANR 原理与实战技巧]https://mp.weixin.qq.com/s/7h-waxrNn-K2XFmRA92p5w
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-03-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编码前线 微信公众号,前往查看

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

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
干货:ANR日志分析全面解析
这句话说的很笼统,要想深入分析定位ANR,需要知道更多知识点,一般来说,ANR按产生机制,分为4类:
2020labs小助手
2021/06/08
2.4K0
ANR日志解析
这句话说的很笼统,要想深入分析定位ANR,需要知道更多知识点,一般来说,ANR按产生机制,分为4类:
派大星在吗
2021/12/16
2.1K0
笔记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.3K0
Android App 优化之ANR详解
ANR全名Application Not Responding, 也就是"应用无响应". 当操作在一段时间内系统无法处理时, 系统层面会弹出上图那样的ANR对话框。
用户1269200
2018/08/28
1.1K0
Android App 优化之ANR详解
[068]破局ANR
ANR是Android中经常遇到的问题,常规的ANR问题,一般可以通过adb日志和trace文件,找到导致ANR的原因,但是有很多偶发的ANR问题,难以采用常规的手段来分析的,通过学习字节跳动整治ANR的系列文章,聊聊自己的感悟。
王小二
2022/05/14
1.7K0
[068]破局ANR
Android中四大组件以及如何避免anr
             第一步:新建一个类继承自activity,  并且为该activity设置布局文件  
fanfan
2022/05/07
5230
【Android应用开发】 Android 崩溃日志 本地存储 与 远程保存
示例代码下载 : http://download.csdn.net/detail/han1202012/8638801;
韩曙亮
2023/03/27
2.2K0
【Android应用开发】 Android 崩溃日志 本地存储 与 远程保存
Android中一个简单有用的发现性能问题的方法
在Android中,性能优化是我们持之不懈的工作。这其中,在主线程执行耗时的任务,可能会导致界面卡顿,甚至是ANR(程序未响应)。当然Android提供了很多优秀的工具,比如StrictMode,Method Tracing等,便于我们检测问题。
技术小黑屋
2018/09/05
6300
Android内存泄露和ANR
内存泄漏(Memory Leak)是指程序在运行过程中,由于疏忽或错误未能释放不再使用的内存,导致这部分内存无法被回收,最终可能引发应用卡顿、崩溃或系统性能下降。
进击的阿斌
2025/02/13
1700
Android性能调优利器StrictMode
作为Android开发,日常的开发工作中或多或少要接触到性能问题,比如我的Android程序运行缓慢卡顿,并且常常出现ANR对话框等等问题。既然有性能问题,就需要进行性能优化。正所谓工欲善其事,必先利其器。一个好的工具,可以帮助我们发现并定位问题,进而有的放矢进行解决。本文主要介绍StrictMode 在Android 应用开发中的应用和一些问题。
技术小黑屋
2018/09/05
1.3K0
Android性能调优利器StrictMode
StrictMode介绍[通俗易懂]
  最新的Android平台中(Android 2.3起),新增加了一个新的类,叫StrictMode(android.os.StrictMode)。这个类可以用来帮助开发者改进他们编写的应用,并且提供了各种的策略,这些策略能随时检查和报告开发者开发应用中存在的问题,比如可以监视那些本不应该在主线程中完成的工作或者其他的一些不规范和不好的代码。
全栈程序员站长
2022/08/14
4630
StrictMode使用详解
StrictMode最常用来捕捉应用程序的主线程,它将报告与线程及虚拟机相关的策略违例。一旦检测到策略违例(policy violation),你将获得警告,其包含了一个栈trace显示你的应用在何处发生违例。除了主线程,我们还可以在Handler,AsyncTask,AsyncQueryHandler,IntentService等API中使用StrictMode。
全栈程序员站长
2022/09/06
5550
StrictMode使用详解
Android处理崩溃的一些实践
对于任何程序来说,崩溃都是一件很难避免的事情,当然Android程序也不例外。在Android程序中,引起崩溃的多属于运行时异常或者错误,对于这些异常我们很难做到类似Checked Exception那样显式捕获,因而最终导致了程序崩溃。本文讲介绍一些如何处理崩溃的实践,比如收集崩溃的stacktrace,甚至如何避免出现程序已停止的对话框。
技术小黑屋
2018/09/05
1.5K0
Android处理崩溃的一些实践
【错误记录】Flutter 混合开发获取 BinaryMessenger 报错 ( FlutterActivityAndFragmentDelegate.getFlutterEngine() )
在 Flutter 混合开发中 , 开发 Android 与 Flutter 信息交互功能 ;
韩曙亮
2023/03/29
5190
【错误记录】Flutter 混合开发获取 BinaryMessenger 报错 ( FlutterActivityAndFragmentDelegate.getFlutterEngine() )
【错误记录】Android 应用配置第三方 so 动态库 ( /data/app/comxxx==/base.apk/lib/arm64-v8a]couldn‘t find “libx.so“ )
Java 中加载动态库时 , 由于在应用中没有配置对应动态库信息 , 报上述错误 ;
韩曙亮
2023/03/29
9800
【错误记录】Android 应用配置第三方 so 动态库 ( /data/app/comxxx==/base.apk/lib/arm64-v8a]couldn‘t find “libx.so“ )
子线程 真的不能更新UI ?
一般情况,我们在子线程直接操作UI,没有用handler切到主线程,就会报这个错。
胡飞洋
2020/07/23
1.3K0
子线程 真的不能更新UI ?
【错误记录】Android 应用中启动 FlutterActivity 报错 ( have you declared this activity in your AndroidManifest )
在 Android 中启动 FlutterActivity 报错 : Android 应用调用 Flutter 应用界面 ;
韩曙亮
2023/03/29
7250
【错误记录】Android 应用中启动 FlutterActivity 报错 ( have you declared this activity in your AndroidManifest )
都知道避免ANR,但该如何分析,定位,解决?
链接:https://www.jianshu.com/p/cfa9ed42e379
陈宇明
2020/12/16
4.5K0
都知道避免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
linkToDeath机制了解和使用
在学习Binder和AIDL的过程中遇到的一些有意思的事情~! linkToDeath机制,我们先看看官网如何介绍:
静默加载
2020/05/28
2.1K0
相关推荐
干货:ANR日志分析全面解析
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文