Android开发- Android ANR原因分析

Android性能优化 -- ANR问题定位分析_reason input dispatching timed out (waiting to se 从上面的日志中,我们看到造成ANR的原因是Inputdispatchingtimedout,那么除此之外,还有什么其他的错误。 阅读详情

1 ANR简介

ANR,全称是Application Not Responding,即应用程序无响应(不是Activity无响应)。当App在特定时间内无法响应屏幕触摸或键盘输入事件,或者特定事件没有处理完毕,就会发生ANR。

2 深入理解ANR:

2.1 特定时间:
        InputDispatching Timeout:5秒内无法响应屏幕触摸事件或键盘输入事件;
        BroadcastQueue Timeout :在执行前台广播(BroadcastReceiver)的onReceive()函数时10秒没有处理完成,后台为60秒;
        Service Timeout :前台服务20秒内,后台服务在200秒内没有执行完毕;
        ContentProvider Timeout :ContentProvider的publish在10s内没进行完; 

2.2 经常发生ANR的场景:

(1): 应用程序UI线程存在耗时操作, 如UI线程进行网络请求, 数据库操作或者文件操作, 这些耗时操作的情况都可能会导致UI线程无法及时处理用户的输入,导致ANR产生。

例如,这是一个主线程执行耗时操作的log:


(2):UI线程等待子线程释放一个锁,从而无法处理用户的请求输入;
(3):耗时操作的动画需要大量的计算工作, 导致CPU的负荷很重。

3. 如何避免ANR的发生:

尽量避免在主线程(UI线程)中作耗时操作。或者说,耗时操作尽可能在子线程中进行,而UI的更新一定得在主线程中(UI线程)进行。 

4. ANR的分析方法: 

主要考虑主线程的执行代码:

  1. 应用在主线程上非常缓慢地执行涉及 I/O 的操作。
  2. 应用在主线程上进行长时间的计算。
  3. 主线程在对另一个进程进行同步 binder 调用,而后者需要很长时间才能返回。
  4. 主线程处于阻塞状态,为发生在另一个线程上的长操作等待同步的块。
  5. 主线程在进程中或通过 binder 调用与另一个线程之间发生死锁。主线程不只是在等待长操作执行完毕,而且处于死锁状态。

分析方法:

4.1 通过log来分析:
   用logcat可以清晰的看到ANR发生的时机(见“5 ANR举例”);

 4.2 查看traces.txt:
    ANR发生,通常,系统会将相关信息写入到traces.txt文件中,即“/data/anr/traces.txt”文件。我们可以通过分析这个文件,从而定位ANR发生时的场景;

adb root
adb shell ls /data/anr
adb pull /data/anr/traces.txt

4.3 通过traceview等工具来分析:
   入下图(traceview):

分析:

上图中,耗时代码都在子线程AsyncTask中进行,所以不会发生ANR。 如果main中有大面积的红色区域块,说明在主线程中有耗时操作,就有ke能发生ANR。

5 ANR举例:

分析如下代码:

btn.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        try {
            Thread.sleep(100000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
});

分析:

在主线程中,用sleep来模拟耗时操作。 

运行程序log如下:

2014-10-12 11:12:23.612 3105-3180/system_process E/ActivityManager: ANR in com.example.app1 (com.example.app1/.MainActivity)
    PID: 19534
    Reason: Input dispatching timed out 

(com.example.app1/com.example.app1.MainActivity, Waiting to send non-key event because the touched window has not finished processing certain input events that were delivered to it over 500.0ms ago.  Wait queue length: 2.  Wait queue head age: 8602.5ms.)
    Parent: com.example.app1/.MainActivity
    Load: 7.01 / 6.89 / 6.74
CPU usage from 0ms to 6142ms later (2014-10-12 11:12:17.718 to 2014-10-12 11:12:23.811):
      16% 3105/system_server: 7.9% user + 8.1% kernel / faults: 6549 minor


      0.3% 2779/media.codec: 0.2% user + 0% kernel / faults: 35716 minor
      10% 763/surfaceflinger: 8.2% user + 2.6% kernel / faults: 419 minor
    ...
     
      0.1% 27263/kworker/4:2: 0% user + 0.1% kernel
      0.1% 27743/kworker/0:0: 0% user + 0.1% kernel
    15% TOTAL: 10% user + 5.4% kernel + 0.1% iowait + 0.2% irq + 0% softirq

说明:

很明显,发生了ANR,而且,在log中,也能看到具体发生ANR的类名,方法名,进程ID,原因等信息。该例中的这些信息是:

ANR in com.example.app1 (com.example.app1/.MainActivity)
    PID: 19534
    Reason: Input dispatching timed out  

6 ANR源码调用:

只有发生ANR,那么,AppNotRespondingDialog.show();就会被调用:

AppNotRespondingDialog.show();

在ActivityManagerService,有如下代码:

case SHOW_NOT_RESPONDING_MSG: {

    ......

    Dialog d = new AppNotRespondingDialog(ActivityManagerService.this,
                                mContext, proc,
                   (ActivityRecord)data.get("activity"));
    d.show();
    proc.anrDialog = d;

    ......

}

Monkey测试必现ANR问题分析与解决 Android系统Monkey测试ANR报错、Android Frameworks、SystemUI 阅读详情

相关推荐

Android9.0 framework层InputDispatching造成的的ANR原理分析

Android系统中,在app中进行一些操作时,系统中的ActivityManagerService(简称AMS)和WindowManagerService(简称WMS)会在app进行操作app时, 检测App的响应时间,如果App在特定时间无法响应屏幕触摸或键盘输入时间,或者特定事件没有处理完毕,就会出现ANR。

安卓兼职framework和app工程师的博客 1219

Android ANR视角InputDispatcher

作者:王小二前言有好多人向我咨询过Input ANR问题,说实话,我也是一直无法彻底的解释清楚,我下决心要彻底搞懂这块知识点。话不多说先上图一个event的正常流程Inp...

嵌入式Linux 1901

行为验证码 AJ-Captcha 使用文档

AJ-Captcha验证码系统集成指南:需添加captcha-spring-boot-starter和Redis依赖,配置Redis连接。核心实现包括Redis缓存服务类CaptchaCacheRedisImpl(含设置、查询、删除验证码等方法)、SPI配置文件及Spring Boot配置类(配置验证码属性和Redis模板)。系统支持验证码生成、校验、防刷等安全功能,适用于Web应用安全验证场景。

千层冷面的博客 2119

Reason: Input dispatching timed out (Waiting to send non-key event because the touched window

这个错误信息表示你的应用出现了ANR(Application Not Responding),原因是输入分发超时。系统在尝试发送一个非键盘事件(如触摸事件)时,目标窗口未能在规定时间(通常是500ms)内完成对一些之前传递给它的输入事件的处理。这通常意味着主线程(UI线程)被阻塞了太长时间,没有及时处理输入事件或完成其他任务。

chezabo6116的博客 4001

【kubeEdge】离线部署

根据k8s的这个规则,可以将节点通过 label 的方式进行分组,比如将某几个节点都打上标签为 name=edge,当调度应用到 edge 节点时,会找到 label 为 edge 的所有节点,根据设置的副本数,将应用启动起来,如果设置的副本数超过了设置 edge 标签的节点数,则多出的将会显示 pending 状态,从而无法启动。清除 keadm init 或 keadm join 造成的影响均可使用 keadm reset,这个操作会删除 /etc/kubeedge 下的文件,如有需要请提前备份。

qq_42944740的博客 1716

DDR5内存命令真值表详解:如何正确解析JESD79-5标准中的关键指令

本文深度解析JESD79-5标准中的DDR5内存命令真值表,将其视为动态通信协议进行拆解。详细阐述了1-Cycle与2-Cycle命令的区别、Bank Group寻址机制以及模式寄存器(MR)操作流程,为硬件与固件工程师提供了从信号解析到系统调试的完整实战指南,是理解和优化高性能计算平台内存子系统的核心。

numpy6sculptor的博客 550

Android开发之ANR原因分析

第一步拿到anr日志文件 bogon:wyze-doorbell-wireless-android-14 xiayiye5$ adb shell 进入手机目录 HS8917QC:/ $ cd data/anr 进入anr目录 HS8917QC:/data/anr $ ls 查看anr日志劣币哦啊文件 traces.txt traces.txt.bugreport HS8917QC:/data/anr $ ls -l 查看anr最近的一次列表文件 total 6408 -rw-rw-rw- 1 syst

xiayiye5的博客 1038

双硬盘下Ubuntu 16.04与Win10双系统的安装

之前写过一个双系统安装过程,今天再次整理的原因是想重点强调双硬盘的区别。标红的一定要注意看,那就是我自己一步一步踏出来的坑啊...   基础步骤就不再重复,重点讲区别,需要看详细步骤的童鞋(或者你只有一个硬盘)请看我上一篇博客https://blog.youkuaiyun.com/weixin_40308540/article/details/80157444   区别:双硬盘和单硬盘的区别是什么呢?...

不吃包子 1125

Android App开发之ANR异常的原因分析及处理总结

Android App开发之ANR异常的原因分析及处理总结ANR的全称是application not responding,根据它的意思我们就能看出来是应用程序未响应,就像是我们在电脑上碰到的程序未响应,一般电脑出现这种情况,可能是由于我们打开了很多应用程序,占用了大量的内存,或者CPU时间片被一个应用程序长时间占用,不够分配,导致部分应用程序出现了无响应。Android和Windows基本一样,

白色枫车 1万+

【应用】OpenClaw玩转有道云笔记

功能名称核心原理实操示例(直接复制可用)实操避坑+补充说明网页剪藏插件自动抓取网页正文、下载图片,通过 API 发送到你的有道云笔记,内联图片避免防盗链失效帮我把这个网页剪藏到云笔记:https://example.com/article1. 避坑:知乎、公众号等需登录的网站,先在浏览器登录再剪藏;2. 原理:自动过滤广告,只留正文;3. Twitter/X 剪藏需额外配置 APIFY_API_TOKEN(见1.2.4)创建笔记。

海兰 716

基于YOLOv11的军事目标识别系统设计与实现(坦克、舰船检测)

DOTA-v2.0(包含多种军事装备的航拍图像)图片数量:11,268类别:18类,包括坦克、舰船、战斗机等分辨率:800×800~4000×4000HRSC2016(高分辨率舰船检测数据集)图片数量:1,061类别:舰船及子类特点:包含多种视角和复杂背景图片数量:5,000+类别:22种军用飞机标注:精确边界框自建数据集建议收集来源:公开军事演习视频、卫星图像、模拟游戏截图数据增强:模拟不同天气、遮挡、低光照等战场环境。

YOLO 450

Android 系统(55)---Android App开发之ANR异常的原因分析及处理总结

Android App开发之ANR异常的原因分析及处理总结Android App开发之ANR异常的原因分析及处理总结ANR的全称是application not responding,根据它的意思我们就能看出来是应用程序未响应,就像是我们在电脑上碰到的程序未响应,一般电脑出现这种情况,可能是由于我们打开了很多应用程序,占用了大量的内存,或者CPU时间片被一个应用程序长时间占用,不够分配,导致部分应...

zhangbijun1230的专栏 507

PCIe 全解析笔记:从协议本质到工程实现

学习 PCIe,最容易陷入的误区是直接跳进协议手册(Base Spec 1300 多页),然后在 TLP 字段、LTSSM 状态、Ordering Rules 中迷失方向。正确的思维路径历史维度:从 PCI 到 PCIe,解决了什么核心矛盾?抽象维度:协议栈分层的真正意图是什么?工程维度:高速串行链路面临哪些物理挑战?协议如何应对?系统维度:作为 CPU 与外设的"动脉",PCIe 如何融入整个计算机体系?带着这四个视角去看每一个细节,知识才能内化为认知。

m0_46644103的博客 262

ANR问题分析指南

引言 每天收到无数的兄弟团队的同事向系统转ANR JIRA,有些一旦遇到App ANR就直接转到系统组,有些简单看一下就转到系统组帮忙看一下。如此浩瀚的JIRA,我们什么事不做也处理不过来,请每个App owner责任各自ANR. APP Team要先有较深入分析,真正确定是系统问题,再转JIRA 请勿看到binder或者message耗时就直接转到系统,几乎系统所有的通信都离不开这两个基本功能,存在这个不能直接说明问题,要能从逻辑上说得通是系统的问题 如果看完本文,分析完一遍之后,还是无法深入分析,可能是

sinat_41892387的博客 2329

Python代码加密与发布方案详解

本文详细介绍了多种Python代码保护方案,从基础加密到高级混淆,以及商业化发布的最佳实践。基础加密方案包括编译为字节码和使用PyArmor基础加密,适合临时保护和小项目。商业级加密方案如Cython编译和Nuitka完整打包,提供更高的保护强度和执行效率。高级混淆方案涉及控制流混淆、字符串加密和完整混淆工具链,进一步增加逆向难度。商业化发布方案则强调许可证系统集成、硬件绑定保护和完整发布流程。此外,文章还探讨了反逆向技术、最佳实践建议和常见问题解决方法。通过组合使用这些技术,可以构建出适合不同安全需求的P

数据知道的博客 1万+

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Google App ANR 优化案例(1),面试书籍推荐

git 修改记录二、开机向导时 Calendar 概率 ANR1.ANR Log 如下:2.ANR 规避方案如下:主要原因是 android.intent.action.LOCALE_CHANGED 广播接收超时导致的ANR。3.修改方案请参考修改一三、 开机向导时,ANR 弹框不show的解决方案刷机或者恢复出厂设置是,开机向导过程中不应该显示ANR。修改AppErrors类中方法,控制在开机向导时ANR弹窗。1. git 解决方案git 修改差别的。

imtokenmax众筹 533

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

应用稳定性优化系列,ANR问题全面解析

应用稳定性优化系列,ANR问题全面解析

似霰的博客 631

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

Android 系统稳定性 - ANR

文章都为原创,转载请注明出处,未经允许而盗用者追究法律责任。 很久之前写的了,留着有点浪费,共享之。 编写者:李文栋          如果你是一个Android应用程序开发人员,你的人生中不可避免的三件事情是:死亡、缴税和ANR。这么说是夸张了,但是由于Android本身的设计,以及应用程序和系统在开发过程中的缺陷,经常会在测试过程中遇到各种各样的ANR问题。在功能性的测试中还

白马笑西风的专栏 1682

ANR stack-dump信息排查

ANR线程信息

等风来的博客 283

安卓之导致ANR的原因分析,问题定位以及解决方案

在Android应用开发中,Application Not Responding(ANR)是一种常见的性能问题,它直接关系到用户体验的质量。当应用在特定时间段内无法及时响应用户的交互或者系统事件时,系统将会抛出ANR错误,提示用户应用已停止响应。为了确保应用的流畅性和用户满意度,理解ANR产生的根源、掌握其精准定位方法以及实施有效的解决方案至关重要。

wlred1980的博客 9318

Android ANR问题原因分析

自己处理ANR问题单的一点经验,希望能对大家有帮助。

红旺永福 6万+

安卓开发-ANR 机制

本文深入解析安卓开发中的ANR(应用无响应)问题。ANR是系统对主线程阻塞的警告机制,当主线程处理用户交互或UI更新超时(Activity5秒、BroadcastReceiver10秒、Service20秒)就会触发。文章通过典型考题分析各类场景,指出子线程执行不会触发ANR,强调应将耗时操作(网络请求、IO读写等)移至子线程。同时给出实战避坑建议:避免主线程耗时操作、广播接收器轻量化处理、合理配置线程池、监控ANR日志等。掌握ANR机制有助于开发流畅稳定的应用,提升用户体验。

m0_74296492的博客 1016

最全面的安卓ANR

最全面的安卓ANR 一、什么是ANR? 1、概念 应用程序无响应(ANR:Application Not Responding):在一定的时间内没有做完响应的处理。 注意: 在Android里,应用程序的响应性是由Activity Manager和WindowManager系统服务监视的 。如响应输入的事件5S,broadcastReceiver是10S,service是20S,如果这...

anwanfei的博客 4698

Android中的anr定位指导与建议

如何快速定位安卓的anr问题

StramChen的博客 4244

Android ANR 总结

解决ANR一直是Android 开发者需要掌握的重要技巧,一般从三个方面着手。开发阶段:通过工具检查各个方法的耗时,卡顿情况,发现一处修改一处。线上阶段:这个阶段主要依靠监控工具发现ANR并上报,比如matrix。分析阶段:如果线上用户发生ANR,并且你获取了一份日志,这就涉及了本文要分享的内容——ANR日志分析技巧。

easonguolong的博客 1594

Android开发中ANR治理方案

ANR治理是Android性能优化的。

JMY_2016的博客 1496
上一篇: JNI遇到error: request for member ‘FindClass‘ in something not a structure or union
下一篇: Class doesn't implement Cloneable之怪象
liranke
博客等级 码龄20年 4939粉丝 594原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

liranke

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值