当前位置: 首页 > news >正文

Android 应用程序 ANR 问题分析总结

ANR (Application Not Responding) 应用程序无响应。如果应用程序在UI线程被阻塞太长时间,就会出现ANR,通常出现ANR,系统会弹出一个提示提示框,让用户知道,该程序正在被阻塞,是否继续等待还是关闭。

1、ANR出现的原因

  • 主线程频繁进行耗时的IO操作:如数据库读写(UI线程等待其它线程释放某个锁,导致UI线程无法处理用户输入);
  • 多线程操作的死锁,主线程被block;
  • 主线程被Binder 对端block;
  • System Server中WatchDog出现ANR;
  • service binder的连接达到上线无法和SystemServer通信
  • 系统资源已耗尽(管道、CPU、IO)

2、ANR类型

出现ANR的一般有以下几种类型:

(1) KeyDispatchTimeout(常见)

input事件在5S内没有处理完成发生了ANR。
logcat日志关键字:Input event dispatching timed out

(2) BroadcastTimeout

前台Broadcast:onReceiver在10S内没有处理完成发生ANR。
后台Broadcast:onReceiver在60s内没有处理完成发生ANR。
logcat日志关键字:Timeout of broadcast BroadcastRecord

(3) ServiceTimeout

前台Service:onCreate,onStart,onBind等生命周期在20s内没有处理完成发生ANR。
后台Service:onCreate,onStart,onBind等生命周期在200s内没有处理完成发生ANR
logcat日志关键字:Timeout executing service

(4) ContentProviderTimeout

ContentProvider 在10S内没有处理完成发生ANR。 logcat日志关键字:timeout publishing content providers

3、分析过程

(1) 直接打印系统log

使用命令 adb logcat 获取系统打印的部分 log,通过搜索关键字:ANR in

就可以找到报告CPU相关的ANR信息位置,例如:

02-16 14:46:22.550   466  2850 E ActivityManager: PID: 2743
02-16 14:46:22.550   466  2850 E ActivityManager: Reason: Input dispatching timed out (f56e537 com.android.documentsui/com.android.documentsui.picker.PickActivity (server) is not responding. Waited 5004ms for MotionEvent(deviceId=5, source=0x00002002, displayId=0, action=UNKNOWN, actionButton=0x00000000, flags=0x00000000, metaState=0x00000000, buttonState=0x00000000, classification=NONE, edgeFlags=0x00000000, xPrecision=1.0, yPrecision=1.0, xCursorPosition=44.8, yCursorPosition=60.4, pointers=[0: (44.8, 60.4)]), policyFlags=0x62000000)
02-16 14:46:22.550   466  2850 E ActivityManager: Parent: com.android.documentsui/.picker.PickActivity
02-16 14:46:22.550   466  2850 E ActivityManager: Load: 6.29 / 1.83 / 0.76
02-16 14:46:22.550   466  2850 E ActivityManager: ----- Output from /proc/pressure/memory -----
02-16 14:46:22.550   466  2850 E ActivityManager: some avg10=0.04 avg60=0.12 avg300=0.06 total=430350
02-16 14:46:22.550   466  2850 E ActivityManager: full avg10=0.01 avg60=0.02 avg300=0.00 total=161798
02-16 14:46:22.550   466  2850 E ActivityManager: ----- End output from /proc/pressure/memory -----
02-16 14:46:22.550   466  2850 E ActivityManager: 
02-16 14:46:22.550   466  2850 E ActivityManager: CPU usage from 0ms to 6470ms later (2023-02-16 14:46:16.047 to 2023-02-16 14:46:22.517):
02-16 14:46:22.550   466  2850 E ActivityManager:   102% 1592/android.process.media: 45% user + 57% kernel / faults: 5321 minor
02-16 14:46:22.550   466  2850 E ActivityManager:   82% 2743/com.android.documentsui: 74% user + 8.5% kernel / faults: 5859 minor 6 major
02-16 14:46:22.550   466  2850 E ActivityManager:   53% 1436/com.android.providers.media.module: 39% user + 14% kernel / faults: 9076 minor 1 major
02-16 14:46:22.550   466  2850 E ActivityManager:   35% 466/system_server: 22% user + 13% kernel / faults: 13088 minor 4 major
02-16 14:46:22.550   466  2850 E ActivityManager:   12% 146/logd: 4.1% user + 8% kernel / faults: 7 minor
02-16 14:46:22.550   466  2850 E ActivityManager:   10% 1260/adbd: 3.3% user + 7.4% kernel
……
02-16 14:46:22.550   466  2850 E ActivityManager: 96% TOTAL: 54% user + 35% kernel + 0.3% iowait + 5.1% irq + 1% softirq
02-16 14:46:22.550   466  2850 E ActivityManager: CPU usage from 44ms to 633ms later (2023-02-16 14:46:16.091 to 2023-02-16 14:46:16.679):
02-16 14:46:22.550   466  2850 E ActivityManager:   100% 1592/android.process.media: 42% user + 
……
02-16 14:46:22.551   466  2850 E ActivityManager:   94% 2743/com.android.documentsui: 86% user + 
……
02-16 14:46:22.551   466  2850 E ActivityManager: 95% TOTAL: 51% user + 37% kernel + 5.1% irq + 0.8% softirq
02-16 14:46:22.568   466  2850 D ActivityManager: Completed ANR of com.android.documentsui in 6521ms, latency 28ms

通过上述log可知

进程PID:2743

进程名:com.android.documentsui

ANR类型:KeyDispatchTimeout

等等信息。通过搜索 PID 号找到如下log,确定ANR发生的位置:

02-16 14:46:21.265  2743  2743 W oid.documentsu: Long monitor contention with owner AsyncTask #31 (2852) at com.android.documentsui.DirectoryResult com.android.documentsui.MultiRootDocumentsLoader.loadInBackground()(MultiRootDocumentsLoader.java:130) waiters=0 in void com.android.documentsui.MultiRootDocumentsLoader.onReset() for 458ms

(2) 获取详细log

当上述步骤无法找到ANR发生的位置或者原因时,可以使用命令 adb bugreport 获取获取错误、异常等问题的报告文件,然后找到 bugreport_XXX.txt文件查看系统打印的详细log信息。

然后找到关键字:am_anr ,可以得知ANR的时间点、进程PID、ANR类型(最接近ANR触发时间点的就是EventLog中输出的 am_anr 信息)例如:

02-16 14:46:16.078  1000   466  2850 I am_anr  : [0,2743,com.android.documentsui,818527813,Input dispatching timed out (f56e537 com.android.documentsui/com.android.documentsui.picker.PickActivity (server) is not responding. Waited 5004ms for MotionEvent(deviceId=5, source=0x00002002, displayId=0, action=UNKNOWN, actionButton=0x00000000, flags=0x00000000, metaState=0x00000000, buttonState=0x00000000, classification=NONE, edgeFlags=0x00000000, xPrecision=1.0, yPrecision=1.0, xCursorPosition=44.8, yCursorPosition=60.4, pointers=[0: (44.8, 60.4)]), policyFlags=0x62000000)]

应用com.android.documentsui在02-16 14:46:16.078时间,发生了一次KeyDispatchTimeout类型的ANR,它的进程号是2743,即:

ANR时间:02-16 14:46:16.078

进程pid:2743

进程名:com.android.documentsui

ANR类型:KeyDispatchTimeout

通过上面关键信息,我们了解到,发生KeyDispatchTimeout的ANR是因为input事件在5秒内没有处理完成。那么在这个时间02-16 14:46:16.078的前5秒,也就是(14:46:11 ~14:46:12)时间段左右程序到底做了什么事情?我们已经知道pid了,再搜索一下pid = 2743的日志.这些日志表示该进程所运行的轨迹,关键的日志如下:

02-16 14:46:13.274  2743  2847 D MultiRootDocsLoader: Found 0 of 0 queries done


02-16 14:46:13.274  2743  2743 W oid.documentsu: Long monitor contention with owner AsyncTask #30 (2847) at com.android.documentsui.DirectoryResult com.android.documentsui.MultiRootDocumentsLoader.loadInBackground()(MultiRootDocumentsLoader.java:130) waiters=0 in void com.android.documentsui.MultiRootDocumentsLoader.onReset() for 477ms


02-16 14:46:13.275  2743  2743 D AbstractActionHandler: Creating new loader recents.

(3) 获取ANR报告

通过命令 adb pull data/anr/* 获取ANR报告文件(一般是anr_XXX),通过所搜进程pid或发生anr的应用包名找到anr发生的代码位置,例如:

"main" prio=5 tid=1 Blocked| group="main" sCount=1 dsCount=0 flags=1 obj=0x7185f448 self=0xb400007c571d4be0| sysTid=2743 nice=-10 cgrp=default sched=0/0 handle=0x7d7db7c4f8| state=S schedstat=( 2582277546 378772611 1438 ) utm=225 stm=32 core=3 HZ=100| stack=0x7fff273000-0x7fff275000 stackSize=8192KB| held mutexes=at com.android.documentsui.MultiRootDocumentsLoader.onReset(MultiRootDocumentsLoader.java:332)- waiting to lock <0x0e9de0a8> (a java.util.HashMap) held by thread 52at androidx.loader.content.Loader.reset(Loader.java:447)at androidx.loader.app.LoaderManagerImpl$LoaderInfo.destroy(LoaderManagerImpl.java:167)at androidx.loader.app.LoaderManagerImpl.restartLoader(LoaderManagerImpl.java:457)at com.android.documentsui.AbstractActionHandler.loadDocumentsForCurrentStack(AbstractActionHandler.java:775)at com.android.documentsui.-$$Lambda$L5LNv5NSfnK-xtifNcLLKR6iIWM.run(lambda:-1)at com.android.documentsui.ContentLock.runWhenUnlocked(ContentLock.java:78)- locked <0x0d9c07c1> (a com.android.documentsui.ContentLock)at com.android.documentsui.LockingContentObserver.onChange(LockingContentObserver.java:51)at android.database.ContentObserver.onChange(ContentObserver.java:153)at android.database.ContentObserver.onChange(ContentObserver.java:169)at android.database.ContentObserver.onChange(ContentObserver.java:187)at android.database.ContentObserver.onChange(ContentObserver.java:202)at android.database.ContentObserver.lambda$dispatchChange$0$ContentObserver(ContentObserver.java:282)at android.database.-$$Lambda$ContentObserver$MgqiYb2qvgLhoXTioYXq9MvvpNk.run(lambda:-1)at android.os.Handler.handleCallback(Handler.java:938)at android.os.Handler.dispatchMessage(Handler.java:99)at android.os.Looper.loop(Looper.java:223)at android.app.ActivityThread.main(ActivityThread.java:7664)at java.lang.reflect.Method.invoke(Native method)at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947)

相关文章:

Android 应用程序 ANR 问题分析总结

ANR (Application Not Responding) 应用程序无响应。如果应用程序在UI线程被阻塞太长时间&#xff0c;就会出现ANR&#xff0c;通常出现ANR&#xff0c;系统会弹出一个提示提示框&#xff0c;让用户知道&#xff0c;该程序正在被阻塞&#xff0c;是否继续等待还是关闭。 1、AN…...

爬虫案例:建设库JS逆向

爬虫流程 1. 确定目标网址和所需内容 https://www.jiansheku.com/search/enterprise/ 只是个学习案例&#xff0c;所以目标就有我自己来选择&#xff0c;企业名称&#xff0c;法定代表人&#xff0c;注册资本&#xff0c;成立日期 2. 对目标网站&#xff0c;进行分析 动态…...

基于springboot的酒店管理系统源码数据库

时代的发展带来了巨大的生活改变&#xff0c;很多事务从传统手工管理转变为自动管理。自动管理是利用科技的发展开发的新型管理系统&#xff0c;这类管理系统可以帮助人完成基本的繁琐的反复工作。酒店是出门的必需品&#xff0c;无论出差还是旅游都需要酒店的服务。由于在旺季…...

Web前端开发 - 5 - JavaScript基础

JavaScript 一、JavaScript基础1. JavaScript入门2. 语句3. 数据类型4. 函数5. 对象6. 数组 一、JavaScript基础 1. JavaScript入门 <script> </script> <script type"text/javascript" src"xxx.js"> </script>//单行注释 /* 多…...

程序员之路:塑造卓越职业素养的探索与实践

序章 在这个数字时代&#xff0c;程序员作为技术进步的推动者&#xff0c;不仅需要掌握扎实的技术技能&#xff0c;更需具备高尚的职业素养&#xff0c;以应对日益复杂的行业挑战。职业素养&#xff0c;犹如编程中的“算法”&#xff0c;虽无形却决定着个人发展的效率与质量。本…...

C# Winform 在低DPI创建窗体后,在高DPI运行时,窗体会自动拉伸,导致窗体显示不全

C# Winform 在低DPI创建窗体后&#xff0c;在高DPI运行时&#xff0c;窗体会自动拉伸&#xff0c;导致窗体显示不全&#xff0c; 比如在分辨率为100% 的电脑创建C#项目&#xff0c;当运动到分辨率为125%的电脑运行时&#xff0c;后者运行的窗体会自动拉伸&#xff0c;窗体显示…...

JWT攻击手册(非常详细)零基础入门到精通,收藏这一篇就够了

JSON Web Token&#xff08;JWT&#xff09;对于渗透测试人员而言可能是一种非常吸引人的攻击途径&#xff0c;因为它们不仅是让你获得无限访问权限的关键&#xff0c;而且还被视为隐藏了通往以下特权的途径&#xff1a;特权升级&#xff0c;信息泄露&#xff0c;SQLi&#xff…...

5.所有权

标题 一、概念二、规则三、示例3.1 变量作用域3.2 所有权的移交&#xff08;深拷贝与浅拷贝&#xff09;3.3 函数与所有权3.4 返回值与作用域3.5 引用的使用 四、切片(&str) 一、概念 所有权是Rust的核心特性。所有程序在运行时都必须管理它们使用计算机内存的方式。Rust的…...

RabbitMQ-工作模式(Publish模式Routing模式)

文章目录 发布/订阅&#xff08;Publish/Subscribe&#xff09;交换机临时队列绑定总体代码示例 路由&#xff08;Routing&#xff09;绑定直连交换机多重绑定发送日志订阅总体代码示例 更多相关内容可查看 发布/订阅&#xff08;Publish/Subscribe&#xff09; 构建一个简单的…...

【机器学习算法】期望最大化(EM)算法概述

期望最大化&#xff08;EM&#xff09;算法是一种迭代算法&#xff0c;用于在有未观测变量的情况下&#xff0c;求解概率模型参数的最大似然估计或最大后验估计。以下是对EM算法的原理与应用进行详细地剖析&#xff1a; EM算法原理 E步 - 期望计算&#xff1a;根据当前估计的模…...

【深度学习】数竹签演示软件系统

往期文章列表&#xff1a; 【YOLO深度学习系列】图像分类、物体检测、实例分割、物体追踪、姿态估计、定向边框检测演示系统【含源码】 【深度学习】物体检测/实例分割/物体追踪/姿态估计/定向边框/图像分类检测演示系统【含源码】 【深度学习】YOLOV8数据标注及模型训练方法整…...

Halcon 多相机统一坐标系

小杨说事-基于Halcon的多相机坐标系统一原理个人理解_多相机标定统一坐标系-CSDN博客 一、概述 最近在搞多相机标定等的相关问题&#xff0c;对于很大的场景&#xff0c;单个相机的视野是不够的&#xff0c;就必须要统一到一个坐标系下&#xff0c;因此我也用了4个相机&#…...

Apache Kylin:大数据分析从入门到精通

一、Kylin简介 Apache Kylin是一个分布式数据分析引擎,专为处理海量数据设计,能够在极短时间内对超大规模数据集进行OLAP(Online Analytical Processing)分析。Kylin通过预计算和高效的查询机制,为用户提供秒级的查询响应时间,支持与Hadoop、Hive、HBase等大数据平台无缝…...

SQL Server 2016导入.bak文件到数据库里面步骤

1、打开SSMS管理器 选择数据库 右键 然后点击还原数据库。 2、选择设备 然后点击三个点 找到本地bak文件&#xff0c;然后点击确定 3、点击确定&#xff0c;会自动弹出来一个成功的提示。...

WPF Frame 简单页面切换示例

原理比较简单&#xff0c;但是有个坑&#xff0c;为了使界面能够正确更新&#xff0c;记得使用 INotifyPropertyChanged 接口来实现属性更改通知。 <Window x:Class"PageTest.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation&…...

kafka-生产者监听器(SpringBoot整合Kafka)

文章目录 1、生产者监听器1.1、创建生产者监听器1.2、创建生产者拦截器1.3、发送消息测试1.4、使用Java代码创建主题分区副本1.5、application.yml配置----v1版1.6、屏蔽 kafka debug 日志 logback.xml1.7、引入spring-kafka依赖1.8、控制台日志 1、生产者监听器 1.1、创建生产…...

3D感知视觉表示与模型分析:深入探究视觉基础模型的三维意识

在深度学习与大规模预训练的推动下&#xff0c;视觉基础模型展现出了令人印象深刻的泛化能力。这些模型不仅能够对任意图像进行分类、分割和生成&#xff0c;而且它们的中间表示对于其他视觉任务&#xff0c;如检测和分割&#xff0c;同样具有强大的零样本能力。然而&#xff0…...

VS2019+QT5.15调用动态库dll带有命名空间

VS2019QT5.15调用动态库dll带有命名空间 vs创建动态库 参考&#xff1a; QT调用vs2019生成的c动态库-CSDN博客 demo的dll头文件&#xff1a; // 下列 ifdef 块是创建使从 DLL 导出更简单的 // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 DLL3_EXPORTS // 符号…...

助力草莓智能自动化采摘,基于YOLOv5全系列【n/s/m/l/x】参数模型开发构建果园种植采摘场景下草莓成熟度智能检测识别系统

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;技术已经渗透到我们生活的方方面面&#xff0c;从智能家居到自动驾驶&#xff0c;再到医疗健康&#xff0c;其影响力无处不在。然而&#xff0c;当我们把目光转向中国的农业领域时&#xff0c;一个令人惊讶的…...

C++中的生成器模式

目录 生成器模式&#xff08;Builder Pattern&#xff09; 实际应用 构建一辆汽车 构建一台计算机 构建一个房子 总结 生成器模式&#xff08;Builder Pattern&#xff09; 生成器模式是一种创建型设计模式&#xff0c;它允许你分步骤创建复杂对象。与其他创建型模式不同…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

云启出海,智联未来|阿里云网络「企业出海」系列客户沙龙上海站圆满落地

借阿里云中企出海大会的东风&#xff0c;以**「云启出海&#xff0c;智联未来&#xff5c;打造安全可靠的出海云网络引擎」为主题的阿里云企业出海客户沙龙云网络&安全专场于5.28日下午在上海顺利举办&#xff0c;现场吸引了来自携程、小红书、米哈游、哔哩哔哩、波克城市、…...

vscode(仍待补充)

写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh&#xff1f; debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

Spring Boot面试题精选汇总

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...

Axios请求超时重发机制

Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式&#xff1a; 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

Rapidio门铃消息FIFO溢出机制

关于RapidIO门铃消息FIFO的溢出机制及其与中断抖动的关系&#xff0c;以下是深入解析&#xff1a; 门铃FIFO溢出的本质 在RapidIO系统中&#xff0c;门铃消息FIFO是硬件控制器内部的缓冲区&#xff0c;用于临时存储接收到的门铃消息&#xff08;Doorbell Message&#xff09;。…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

【笔记】WSL 中 Rust 安装与测试完整记录

#工作记录 WSL 中 Rust 安装与测试完整记录 1. 运行环境 系统&#xff1a;Ubuntu 24.04 LTS (WSL2)架构&#xff1a;x86_64 (GNU/Linux)Rust 版本&#xff1a;rustc 1.87.0 (2025-05-09)Cargo 版本&#xff1a;cargo 1.87.0 (2025-05-06) 2. 安装 Rust 2.1 使用 Rust 官方安…...