ANR问题分析

news2024/11/24 8:39:40

ANR概念

anr是指应用程序无响应,Android系统对于一些事件需要在一定时间范围内完成,如果超过预定时间未能得到有效响应或者响应时间过长,都会造成anr。通常发生anr时,系统会弹出一个提示框,让用户知道,该程序正在被阻塞,是否继续等待还是关闭。
在Android里,应用程序的响应性是由ams哥wms监视的。当它检测到以下场景中的一个时,Android就会针对特定的应用程序显示ANR(一个弹窗):

场景

  • Service Timeout
    对于前台服务,Timeout为20s。
    对于后台服务,Timeout为200s。
    logcat日志关键字:Timeout executing service

  • BroadcastQueue TImeout
    对于前台广播,Timeout为10s。
    对于后台广播,Timeout为60s。
    logcat日志关键字:Timeout of broadcast BroadcastRecord

  • ContentProvider Timeout
    Timeout为10s。
    logcat日志关键字:timeout publishing content providers

  • InputDispatching Timeout(主要anr类型)
    输入事件分发Timeout为5s,包括按键和触摸事件。
    注意事项:Input的超时机制与其他不同,对于input来说即便某次事件执行时间超过Timeout时长,只要用户后续没有再生成输入事件,则不会触发anr。
    logcat日志关键字:Input event dispatching timed out

超时检测机制

  1. service超时检测机制:超过一定时间没有执行完相应操作,则会触发anr;
  2. BroadcastReceiver超时检测机制:有序广播的总执行时间超过2*receiver个数*timeout时长,则会触发anr;有序广播的某一个receiver执行过程超过timeout时长,则会触发anr
  3. 对于service,broadcast,input发生anr之后,最终都会调用AMS.appNotResponding;对于provider,在其进程启动时可能会触发anr,则会直接杀进程以及清理相应信息,不会弹出anr弹窗。

如何避免ANR发生

  1. 主线程尽量只做UI相关的操作,避免耗时操作,比如过度复杂的UI绘制,网络操作,文件IO操作
  2. 避免主线程跟工作线程发生锁的竞争,减少系统耗时binder的调用,谨慎使用sharePreference。
  3. 总之,尽量减少主线程的负载,让其空闲待命,以便随时可以响应用户的操作
  • Android应用程序通常运行在一个单独的线程(例如:main)里。这意味着应用程序所做的事情如果在主线程里占用了太长的时间,就会引发anr弹窗,因为应用程序并没有给自己机会来处理输入事件或者intent广播。
  • 因此,运行在主线程里的任何方法尽可能少做事情。特别是activity应该在它的关键生命周期方法(如onCreate或onResume)里尽可能少的去做创建操作。潜在的耗时操作,例如网络或数据库操作,或者高耗时的计算如改变位图尺寸,应该在子线程里来完成。然而,不是说主线程阻塞在那里等待子线程完成——也不是调用Thread.wait或Thread.sleep。替代的方法是,主线程应该为子线程提供一个Handler,以便完成时能够提交给主线程。以这种方式设计应用程序,将能保证主线程保持对输入的响应性并能避免由于5秒输入事件的超时引发的anr对话框。这种做法应该在其它显示UI的线程里效仿,因为它们都受相同的超时影响。
  • IntentReceiver执行时间的特殊限制意味着它应该做:在后台做小的、琐碎的工作如保存设定或者注册一个Notification。和在主线程调用其他方法一样,应用程序应该避免在BroadcastReceiver里做耗时操作或计算。但不再是在子线程里做这些任务(因为BroadcastReceiver的生命周期短),替代的是,如果响应Intent广播需要执行一个耗时动作,应用程序应该启动一个Service。我们也应该避免在IntentReceiver里启动一个activity,因为它会创建一个新的画面,并从当前用户正在运行的程序上抢夺焦点,如果应用程序在响应intent广播时需要向用户展示什么,应该使用NotificationManager来实现。
  • 一般来说,在应用程序里,100到200ms是用户能够感知阻滞的时间阈值。因此,这里有一些额外的技巧来避免anr,并有助于增强应用程序的响应灵敏性。如果应用程序为响应用户输入正在后台工作,可以显示工作的进度,如果应用程序有一个耗时的初始化过程,考虑可以显示一个splashscreen或者快速显示主画面并异步来填充这些信息。在这两种情况下,都应该显示正在进行的进度,以免用户认为应用程序被冻结了。

前台与后台ANR

  • 前台anr:用户能感知,比如拥有前台可见的activity进程,或者拥有前台通知的fg-service的进程,此时发生anr对用户体验影响比较大,需要弹框让用户决定是否退出或等待。
  • 后台anr:只抓取发生无响应进程的trace,也不会收集cpu信息,并且会在后台直接杀掉该无响应的进程,不会弹框提示用户。

ANR分析

  1. 前台anr发生后,系统会马上抓取现场的信息,用于调试分析,收集的信息如下:
  • 将am_anr信息输出到eventlog,也就是说anr触发的时间点最接近的就是eventlog中输出的am_anr信息

  • 收集以下重要进程的各个线程调用栈trace信息,保存在data/anr/traces.txt文件
    在这里插入图片描述

  • 将发生anr的reason以及cpu使用情况信息输出到main log

  • 将traces文件和cpu使用情况信息保存到dropbox,即data/system/dropbox目录

  • 对用户可感知的进程则弹出anr弹窗告知用户,不可感知的进程发生anr直接杀掉

2.分析步骤

  1. 定位发生anr时间点
  2. 查看trace信息
  3. 分析是否有耗时的message,binder调用,锁竞争,cpu资源的抢占
  4. 结合具体的业务场景的上下文来分析

trace.txt参数解读

在这里插入图片描述

**main**:main标识是主线程,如果是线程,那么命名成“Thread-X”的格式,x表示线程id,逐步递增。
**prio**:线程优先级,默认是5
**tid**:tid不是线程的id,是线程唯一标识ID
**group**:是线程组名称
**sCount**:该线程被挂起的次数
**dsCount**:是线程被调试器挂起的次数
**obj**:对象地址
**self**:该线程Native的地址
**sysTid**:是线程号(主线程的线程号和进程号相同)
**nice**:是线程的调度优先级,值越小优先级越高
**sched**:分别标志了线程的调度策略和优先级
**cgrp**:调度归属组
**handle**:线程处理函数的地址。
**state**:是调度状态
**schedstat**:从 `/proc/[pid]/task/[tid]/schedstat`读出,三个值分别表示线程在cpu上执行的时间、线程的等待时间和线程执行的时间片长度,不支持这项信息的三个值都是0**utm**:是线程用户态下使用的时间值(单位是jiffies,默认等于10ms)
**stm**:是内核态下的调度时间值(单位是jiffies,默认等于10ms)
**core**:是最后执行这个线程的cpu核的序号。
**utm+stm==schedstat**

参考资料

https://blog.csdn.net/denglusha737/article/details/86706909
https://blog.csdn.net/abc6368765/article/details/127220609

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/168314.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AppScan介绍和安装

第一节-AppScan介绍和安装 1.简介 Appscan 10中文版是是全新网络安全漏洞扫描软件,软件可以直接可以对OS命令、SSRF和XXE攻击等漏洞进行检测,使得漏洞检测更加容易,提高漏洞的扫描效率。软件同时支持动态、静态、互动分析三种不同的测试功能…

OVN实验----NAT

概述 在L2互通、L3互通实验基础上通过NAT实现访问公网。 架构图如下, 这里两台逻辑路由器LR1和GLR是通过一台逻辑交换机LSjoin互连的, GLR和物理网络设备通过LSlocal相连。 物理拓扑 如上一个实验OVN实验----L2互通 逻辑拓扑 配置 开始实验前先检查…

设计模式之装饰者模式

装饰者模式 定义 先上定义:指在不改变现有对象结构的情况下,动态地给该对象增加一些职责(即增加其额外功能)的模式。 优缺点 优点: 1,装饰器是继承的有力补充,比继承灵活,在不改…

【进阶C语言】文件操作

文章目录一.文件1.文件的功能2.文件的分类3.文件路径绝对路径相对路径4.文件信息区5.文件缓冲区6.流的概念7.输入输出二.文件函数1.打开与关闭文件打开文件——fopen返回类型参数关闭文件——fclose返回类型参数2. 顺序读写1.输入输出字符输入字符函数——fgetc返回类型函数参数…

新享科技UniPro将敏捷理念数字化 助力企业迎接2023

2023年新年伊始,“复苏”和“希望”成了越来越多国内企业和消费者的直接感受,与此同时,国际经济也从疫情中缓慢“恢复”过来,特斯拉在中国区掀起了新一轮降价风潮,而行业“销冠”比亚迪却高调发布了百万级新车。如同晴…

websocket显示实时消息

websocket实现实时消息展示 前面介绍过websocket聊天功能的实现,不清楚的可以先看下 websocket实现在线聊天 https://blog.csdn.net/qq_51076413/article/details/124644500 之前发过websocket的相关使用和一对一聊天的demo代码,这里是针对上几篇文章的补充&#x…

Nacos服务注册与发现源码剖析

文章目录前提介绍Nacos源码下载Nacos客户端源码Spring Cloud Starter Nacos 源码Nacos服务端源码前提介绍 服务注册与发现作用主要是为了更好的管理众多的服务,不论Nacos还是Zookeeper、Eureka,作为注册中心都是为了解决以下两个问题: 屏蔽…

【论文写作】英文写作工具推荐及使用教程:DeepL(翻译) + EasyEssay(扩写) + QuillBot(改写润色)

文章目录一、DeepL二、EasyEssay2.1 润写2.2 扩写2.3 生成文章2.4 英文查重三、QuillBot一、DeepL DeepL官网 DeepL的主要作用是翻译,一开始我也是在B站上看到有人推荐用这款翻译工具的,抱着试一试的心态去用了一下,感觉翻译效果真的很不错&a…

【贪心】AcWing 803. 区间选点

905. 区间选点 文章目录题目描述输入格式:输出格式:数据范围输入样例输出样例方法:贪心解题思路代码复杂度分析:题目描述 给定 N 个闭区间 [ai,bi][a_i,b_i][ai​,bi​],请你在数轴上选择尽量少的点,使得每…

利用时间序列预测电量,冷量和压缩空气量

利用时间序列预测电量,冷量和压缩空气量背景分析与思路代码结果一,电量预测二,冷量预测三,压缩空气预测调优一,电量预测(m6)二,冷量预测三,压缩空气预测背景 根据提供的数据,详见附…

企业开发项目【1】— — 流程、开发环境搭建模板

企业开发项目【1】— — 流程、开发环境搭建模板 以黑马的学成在线为例 1 项目背景 2 项目介绍 3 开发环境搭建 3.1 开发工具配置(后端) 3.1.1 Idea配置 环境编码 编译级别配置 project structure - 设置JDK版本和编译级别3. 自动导包设置 IDEA可以…

远距离车载高速网络通讯方案

一 车载网络的发展 随着电子、半导体和通讯等行业的快速发展,汽车智能化的诉求也愈发强烈。越来越多的传感器和处理器的应用推动了汽车的智能化和电气化,与此同时,也使得ECU(电子控制单元)的数量快速增加。随着自动驾…

基于“python+”潮汐、风驱动循环、风暴潮等海洋水动力模拟

ADCIRC是新一代海洋水动力计算模型,它采用了非结构三角形网格广义波动连续方程的设计,在提高计算精确度的同时还减小了计算时间。被广泛应用于:模拟潮汐和风驱动的循环、预测风暴潮和洪水和近岸海上作业等。 除此之外,ADCIRC也是我…

目前市场上比较好的oa办公系统企业管理软件有哪些?

行政小李拿着《疫情期间春节返乡填报单》在工位之间来回穿梭…… 财务小王把年终奖金和福利方法拿给老板签字…… 行政小李的和人事小赵回回都因为入职新人培训的事情扯皮…… 后勤小郑每次办公物资的整理都要做半天…… OA系统本就是为企业内部的员工沟通、工作效率提高、协作…

WebDAV之葫芦儿·派盘+BookxNote

BookxNote 支持WebDAV方式连接葫芦儿派盘。 BookxNote是全新设计的电子书阅读学习笔记软件,以不同的思维方式重塑我们的学习过程。一边阅读一边划重点,提供多种划重点笔记工具,包括直线、矩形、圆形、高亮文本,图片摘录。高亮的文本自动编辑为重点的批注内容,还可以对重点…

查看网站历史记录的2种办法,怎样查看网站历史记录?

有个想购买二手域名的朋友问小黑:如何查看网站历史记录?于是今天就分享查看网站历史记录的 2种办法:网站历史记录和快照。 如果你在下单之前想查一查域名以前做过些什么,有没有违禁记录,被惩罚过,被K过等等…

LeetCode082_82. 删除排序链表中的重复元素 II

LeetCode082_82. 删除排序链表中的重复元素 II 一、描述 给定一个已排序的链表的头 head , 删除原始链表中所有重复数字的节点,只留下不同的数字 。返回 已排序的链表 。 示例 1: 输入:head [1,2,3,3,4,4,5] 输出:…

CODESYS开发教程8-定时、触发和计数

今天继续我们的小白教程,老鸟就不要在这浪费时间了😊。 前面一期我们介绍了CODESYS的字符串及其操作。这一期主要介绍CODESYS的定时器及触发的相关功能块特性及用法,注意本文介绍的定时器、触发器和计数器均包含在CODESYS的Standard库中。 一…

c-note:字符串常量初始化存放位置

两行代码,分别以数组形式和指针形式,先说结论。 对于字面量"he"的存放位置: 1、数组形式,字面量直接存放进栈给temp处开辟的空间 2、指针形式,字面量"he"是一个常量,在编译之初便存在于…

如何在mac上使用idea做大数据开发

1 软件包下载jdk1.8 (jdk1.8.0_231)idea(包括2018,2019) (ideaIC-2019.3.3/ideaIC-2018.3.5)汉化包:汉化包.rarmaven3.6.3 (apache-maven-3.6)2 jdk的安装第一:把包直接放到自定义目录下第二:配置环境变量a) 打开终端 输入 sudo vi /etc/profile 或者 sudo vi .bash_profile解释…