Android ANR分析实践(一):北京×××搭建ANR是什么、产生的原因及如何避免ANR

一、 什么是北京×××搭建 dsluntan.com VX:17061863513ANR

ANR,(Application Not Responding) 即应用程序无响应,在android应用中,当我们的UI线程被阻塞,就会弹出如下对话框,用户可以选择继续等待或者关闭这个应用程序,这种现象我们称之为ANR.

二、 ANR的类型

ANR的类型大致分为以下三种

1、主线程对输入事件在5秒内没有处理完毕 产生这种ANR的前提是要有输入事件,如果用户没有触发任何输入事件,即便是主线程阻塞了,也不会产生ANR,因为InputDispatcher没有分发事件给应用程序,当然也不会检测处理超时和报告ANR了。

2、主线程在执行BroadcastReceiver的onReceive函数时10秒内没有执行完毕,后台进程是60秒 这种情况的ANR系统不会显示对话框提示,仅是输出log而已。

3、主线程在执行Service的各个生命周期函数时20秒内没有执行完毕,后台进程为200秒
同样对这种情况的ANR系统也不会显示对话框提示,仅是输出log。

三种类型的ANR只有第一种会有弹框。

Type

Method call

Log sample

time out

Input dispatch

onClick(),onTouch(),onKeydown(),onKeyup()

Input dispatching timed out

5

Broadcast

onReceive()

Timeout of broadcast

FG: 10, BG 60

Service

onBind(),onCreate(),onStartCommand(),onUnbind(),onDestroy()

Timeout executing service

FG: 20, BG 200

三、 ANR产生的原因

大致分为两类:

1.应用自身进程引起的问题,比如, 在oncreate ,onstart等生命周期中执行耗时操作,ui线程阻塞,挂起,死循环等

2,其他进程引起的,比如:io操作导致cpu使用过高,导致当前应用进程无法抢占到cpu时间片

细分的话可以分为以下一些情况:

耗时的网络访问
大量的数据读写
数据库操作
硬件操作(比如camera)
调用thread的join()方法、sleep()方法、wait()方法或者等待线程锁的时候
service binder的数量达到上限
system server中发生WatchDog ANR
service忙导致超时无响应
其他线程持有锁,导致主线程等待超时
其它线程终止或崩溃导致主线程一直等待...
四、如何避免ANR

耗时的工作()比如数据库操作,I/O,网络操作),采用单独的工作线程处理
用Handler来处理UIthread和工作thread的交互
合理使用 Handler 来处理其他线程请求;
合理使用并遵循 Android 生命周期, 避免在 onCreate() and onResume() 做过多的事情;
使用一些架构形成规范来避免内存等问题,例如:MVP、RxJava;
经常使用工具来检查内存问题,例如:MAT、TraceView、AS 自带等工具;
避免加载大图片引起内存不足导致 ANR;
避免内存泄露引起的 ANR。

原文地址:http://blog.51cto.com/13927407/2161060

时间: 2024-10-12 00:36:25

Android ANR分析实践(一):北京×××搭建ANR是什么、产生的原因及如何避免ANR的相关文章

Android anr 分析方法

一.ANR(Application Not Responding)定义 在Android上,如果你的应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:Application Not Responding)对话框.用户可以选择“等待”而让程序继续运行,也可以选择“强制关闭”.所以一个流畅的合理的应用程序中不能出现anr,而让用户每次都要处理这个对话框.因此,在程序里对响应性能的设计很重要,这样系统不会显示ANR给用户. 二.出现ANR的原因 默认情况

ANR 分析思路浅析

一.引言 ANR问题是android中常见且令人头疼的问题,相当多的时候不易直接分析出原因. 二.ANR的定义   下面先看下百度百科给ANR的定义: ANR问题常因在main(主线程)线程执行了复杂耗时的操作,比如文件IO.网络访问.无限循环等,最终无奈地被系统抛出ANR. 三.ANR的一般分析思路 1) 从手机的/data/traces/目录导出traces.txt文件: 2) 从traces.txt文件获取ANR产生的时间点T1: 3) 从traces.txt文件获取main线程的运行状态

Log中'main', 'system', 'radio', 'events'以及android log分析

在Android中不同的log写到不同的设备中,共有/dev/log/system, /dev/log/main, /dev/log/radion, /dev/log/events四中类型.其中默认Log.v等写入/dev/log/main中.Slog写入/dev/log/system中. 我们在使用logcat 抓去日至的时候, 可以指定buffer,来请求不同的环形缓冲区 ('main', 'system', 'radio', 'events',默认为"-b main -b system&q

Android异常分析(转)

关于异常 异常? 异常就是一种程序中没有预料到的问题,既然是没有预料到的,就可能不在原有逻辑处理范围内,脱离了代码控制,软件可能会出现各种奇怪的现象.比如:android系统常见异常现象有应用无响应.应用停止运行.冻屏.重启.死机等,这些异常系统有统一的异常处理机制,出现异常系统就会执行相应的操作,最终有相应的现象体现出来.另外,一些不在预料之中的界面显示问题,操作问题,运行卡顿问题等也可以归于异常,只不过这种异常是人为逻辑缺陷,对系统来说是正常的,但这些缺陷在异常现象中占比却相当大,直接体现出

Android软件安全开发实践(下)

Android开发是当前最火的话题之一,但很少有人讨论这个领域的安全问题.本系列将分两期,探讨Android开发中常见的安全隐患和解决方案.第一期将从数据存储.网络通信.密码和认证策略这三个角度,带你走上Android软件安全开发实践之旅. 过去两年,研究人员已发现Android上的流行软件普遍存在安全缺陷或安全漏洞.漏洞频发的原因可能有很多,例如以下几种. 与一切都是集中管理的iOS相比,Android提供了一种开放的环境,在获得了灵活性.可以满足各种定制需求的同时,也损失了部分安全性. 开发

Android Volley分析(二)——实现

在Android Volley分析(一)--结构中主要分析了Volley的基本组件和框架结构,组件主要是定义的接口,也就是说我们可以实现这些接口来定制自己的Volley版本,比如NetWork.Cache.Request等等.Android Volley在com.android.volley.toolbox下已经做了这些工作,下面就看看这些具体的实现内容 先看一个Volley使用的例子 final TextView mTextView = (TextView) findViewById(R.id

Android多线程分析之四:MessageQueue的实现

罗朝辉 (http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 在前面两篇文章<Android多线程分析之二:Thread的实现>,<Android多线程分析之三:Handler,Looper的实现>中分别介绍了 Thread 的创建,运行,销毁的过程以及 Thread与 Handler,Looper 之间的关联:Thread 在其 run() 方法中创建和运行消息处理循环 Looper,而 Looper::loop() 方法不断地从 Messag

Android多线程分析之二:Thread的实现

Android多线程分析之二:Thread 罗朝辉 (http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 在前文<Android多线程分析之一:使用Thread异步下载图像>中演示了如何使用 Thread 处理异步事务.示例中这个 Java Thread 类都是位于 Framework 层的类,它自身是通过 JNI 转调 dalvik 里面的 Thread 相关方法实现的.因此要分析 Androd 中的线程,就需要分析这两层中的与线程相关的代码,这就是本文要

Android多线程分析之一:使用Thread异步下载图像

罗朝辉 (http://blog.csdn.net/kesalin) CC 许可,转载请注明出处 打算整理一下对 Android Framework 中多线程相关知识的理解,主要集中在 Framework 层的 Thread, Handler, Looper, MessageQueue, Message, AysncTask,当然不可避免地要涉及到 native 方法,因此也会分析 dalvik 中和线程以及消息处理相关的代码:如 dalvik 中的 C++ Thread 类以及 Message