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

ANR学习

一、ANR 概述

ANR 是 Android 系统用于监控应用是否及时响应的关键机制。形象地说,如同设置定时炸弹场景:系统的中控系统(system_server 进程)启动倒计时,若应用进程在规定时间内未完成特定任务,中控系统将触发 ANR,采取杀进程等措施;反之,若应用按时完成任务并向中控系统报告,炸弹则被拆除。触发 ANR 后,中控系统会封装现场、抓取快照(traces),以便后续排查问题根源。

二、四类超时机制

Service的ANR超时机制


图片流程解释
1.App进程向中控系统(system_server进程)发送启动服务请求
2.中控系统派发出一个通讯员(线程1)接收这个请求,然后转交给(ActivityManager),并安装定时炸弹
3.通讯员(线程1)通知目标阵营(Service进程)中的通讯员(线程3)让目标阵营开始做事
4.通讯员(线程3)将这个消息转达给做事的人(main),但是要排队(MessageQueue)。
5.经过努力,做事的人终于完成了事情(Service的启动的生命周期),然后开始等待SP持久化。
6.做事的人在做完事情后直接通知中控系统的负责接收的通信员(线程2),说明已经做完事情
7.通讯员(线程2)收到消息后,即刻拆除炸弹。如果此前操作超过时间阈值就来不及了。

SP持久化

它会将内存中的数据写入磁盘文件,并且会阻塞当前线程,直到数据成功写入或者写入失败。


与ANR关系
如果这个写入操作耗时过长,就会导致主线程被阻塞,无法及时处理其他消息和事件。当主线程阻塞时间超过系统设定的阈值(如用户输入事件 5 秒无响应、广播接收器 10 秒未处理完广播等),就会触发 ANR。

相关函数

commit() 方法
这是一个同步操作。调用 commit() 后,系统会将数据写入内存中的映射结构,并且会阻塞当前线程,直到数据成功写入磁盘文件或者写入失败。它会返回一个布尔值,表示写入是否成功。

apply() 方法
这是一个异步操作。调用 apply() 后,系统会将数据写入内存中的映射结构,并立即返回,不会阻塞当前线程。
然后,系统会在后台线程中异步地将数据写入磁盘文件。所以当你调用 apply() 后,不会立即完成持久化,可能需要等待一段时间。
通常推荐在主线程使用apply,因为异步执行不阻塞当前线程,但如果在一些特点场景下就不同了,比如下面的Broadcast的静态注册,它要求SP必须全部持久化到磁盘才能做其他的事情。在这种情况下如果过度使用apply会增大应用ANR的概率

Broadcast的ANR超时机制(静态注册)


图片流程解释
1.App进程向中控系统(system_server进程)发送广播请求
2.中控系统派发出一个通讯员(线程1)接收这个请求,然后转交给(ActivityManager)
3.(ActivityManager)来埋下定时炸弹
4.通讯员(线程1)通知目标阵营(Service进程)中的通讯员(线程3)让目标阵营开始做事
5.通讯员(线程3)将这个消息转达给做事的人(main),但是要排队(MessageQueue)。
6.经过努力,做事的人终于完成了事情(完成receiver启动的生命周期),但是SP正在执行文件操作,于是将汇报任务完成的工作交给了接盘侠(queued-work-looper线程)。
7.接盘侠终于完成了SP持久化的工作后,向中控系统汇报。
8.通讯员(线程2)收到消息后,即刻拆除炸弹。如果此前操作超过时间阈值就来不及了。
注意(如果是动态广播,或者静态广播没有正在执行持久化操作的SP任务,则不需要经过“queued-work-looper”线程中转,而是直接向中控系统汇报)


Provider的ANR超时机制


provider的超时是在provider进程首次启动的时候才会检测


图片流程解释
1.App进程向中控系统(system_server进程)发送内容提供者请求
2.中控系统派发出一个通讯员(线程1)接收这个请求,如果检测到内容提供者(provider),则先通过Zygote孵化进程
3.新孵化的provider进程向中控系统注册自己的存在
4.中控系统派发出一个通讯员(线程2)接收这个请求,然后转交给(ActivityManager),并安装定时炸弹
5.通讯员(线程2)通知目标阵营(Service进程)中的通讯员(线程4)让目标阵营开始做事
6.通讯员(线程3)将这个消息转达给做事的人(main),但是要排队(MessageQueue)。
7.经过努力,做事的人终于完成了事情(完成provider的安装工作)后直接向中控系统汇报事情已完成
8.通讯员(线程3)收到消息后,即刻拆除炸弹。如果此前操作超过时间阈值就来不及了。

Input的ANR超时机制


input变扫雷了


图片流程解释
1.Inputreader通过EventHub监听底层上报的输入事件,一旦收到输入事件就将其放到输入队列中,并唤醒InputDispatcher
2.InputReader会先检查是否有正在处理的事件,如果没有就从输入队列取出事件,并赋值给mPendingEvent,并且重置ANR的定时;否则不会取出事件,也不会重新定时。
然后检查窗口是否就绪,如果就绪条件满足其一就会进入扫雷(检查前一个正在处理的事件是否超时)
按键事件:输出队列和等待队列不为空
非按键:等待队列不为空,且等待队头超时500ms

如果满足就是终止,不满足就安全了进入3
3.将mPendingEvent转移到输出队列
4.当输出队列不为空,并且与应用通信管道连接正常,则从输出队列取出事件放到等待队列
5.inputdispatcher通过socket告知目标应用进程可以开始干活
6.App的做事的人(main)收到事件后,会转发到对应目标窗口
7.做事的人完成工作后,向中控系统汇报完成,中控系统会将事件从等待队列移除。

三、时间阈值

  • Input:用户输入操作时,应用 5 秒内未处理输入事件;输入法弹出或隐藏等操作超过 5 秒未完成。
  • Service:前台 Service 20 秒内未完成启动;后台 Service 200 秒内未完成启动;Service 的 onStartCommand 等方法执行耗时操作超相应时间限制。
  • Broadcast:静态注册的广播接收器 10 秒内未完成广播处理;动态注册的广播接收器执行 onReceive 方法耗时超 10 秒;有序广播中前一接收器处理时间过长阻塞广播传递。
  • Content Provider:query 操作因复杂查询、通信问题等超一定时间未返回结果;插入、更新、删除等操作因死锁、资源竞争等超系统设定时间阈值。10秒

相关文章:

ANR学习

一、ANR 概述 ANR 是 Android 系统用于监控应用是否及时响应的关键机制。形象地说,如同设置定时炸弹场景:系统的中控系统(system_server 进程)启动倒计时,若应用进程在规定时间内未完成特定任务,中控系统将…...

前端知识速记--JS篇:instanceof

前端知识速记–JS篇:instanceof 在JavaScript中,instanceof运算符用于检测一个对象是否是另一个对象的实例。它的基本语法为:obj instanceof Constructor。如果obj是Constructor的实例,它将返回true,否则返回false。这…...

Tcp_socket

Tcp不保证报文完整性(面向字节流) 所以我们需要在应用层指定协议,确保报文完整性 // {json} -> len\r\n{json}\r\n bool Encode(std::string &message) {if(message.size() 0) return false;std::string package std::to_string(m…...

idea插件开发,如何获取idea设置的系统语言

手打不易,如果转摘,请注明出处! 注明原文:https://zhangxiaofan.blog.csdn.net/article/details/145578160 版本要求 大于 2024.3 错误用法 网上有的说使用:UIUtil com.intellij.util.ui.UIUtil 代码示例&#xf…...

< 自用文儿 > 在 Ubuntu 24 卸载 Docker 应用软件与运行的容器

环境: Host: usw OS: Ubuntu 24.04 TLS 目标: 卸载在运行的 Docker APP。 (上运行了一个 container: 可以在线看 WSJ RSS 新闻,都 docker 预装两个网口,今天发现路由表有些看不懂,决定卸载) 卸载 Dock…...

基于 SpringBoot 和 Vue 的智能腰带健康监测数据可视化平台开发(文末联系,整套资料提供)

基于 SpringBoot 和 Vue 的智能腰带健康监测数据可视化平台开发 一、系统介绍 随着人们生活水平的提高和健康意识的增强,智能健康监测设备越来越受到关注。智能腰带作为一种新型的健康监测设备,能够实时采集用户的腰部健康数据,如姿势、运动…...

MySQL InnoDB引擎 MVCC

MVCC(Multi-Version Concurrency Control)即多版本并发控制,是 MySQL 的 InnoDB 存储引擎实现并发控制的一种重要技术。它在很多情况下避免了加锁操作,从而提高了数据库的并发性能。 一、原理 MVCC 的核心思想是通过保存数据在某…...

深入解析 STM32 GPIO:结构、配置与应用实践

理解 GPIO 的工作原理和配置方法是掌握 STM32 开发的基础,后续的外设(如定时器、ADC、通信接口)都依赖于 GPIO 的正确配置。 目录 一、GPIO 的基本概念 二、GPIO 的主要功能 三、GPIO 的内部结构 四、GPIO 的工作模式 1. 输入模式 2. 输…...

【Elasticsearch】管道聚合

管道聚合就是在已有聚合结果之上在进行聚合,管道聚合是针对于聚合的聚合 在 Elasticsearch 中,管道聚合(Pipeline Aggregations)是一种特殊的聚合类型,用于对其他聚合的结果进行进一步的计算和处理,而不是直…...

Python的那些事第十八篇:框架与算法应用研究,人工智能与机器学习

人工智能与机器学习:框架与算法应用研究 摘要 本文深入探讨了人工智能与机器学习领域的核心框架和技术,包括TensorFlow、PyTorch和Scikit-learn库。文章首先介绍了TensorFlow和PyTorch的安装与配置方法,详细阐述了它们的基础概念&#xff0c…...

【大数据安全分析】为什么要用大数据技术进行安全分析?

在当今数字化浪潮的推动下,安全运营领域犹如一片广袤且复杂的战场。由于其涵盖范围极为宽泛,为了能更深入、精准地探讨相关内容,将目光聚焦于大数据安全分析方向显得尤为必要。一方面,大数据安全分析在安全运营领域占据着举足轻重的地位;另一方面,倘若自身对该领域较为熟…...

java微服务常用技术

Spring Cloud Alibaba 1 系统架构演进 随着互联网行业的发展,对服务的要求也越来越高,服务架构也从单体架构逐渐演变为现在流行的微服务架构。 1.1 单体架构 早期的软件系统通常是基于单体应用架构设计的,也就是将整个系统作为一个单一的、可执行的应用程序来构建和维护…...

【Qt 常用控件】多元素控件(QListWidget、QTabelWidgt、QTreeWidget)

**View和**Widget的区别? **View的实现更底层,**Widget是基于**View封装实现的更易用的类型。 **View使用MVC结构 MVC是软件开发中 经典的 软件结构 组织形式,软件设计模式。 M(model)模型。管理应用程序的核心数据和…...

ubuntu文件同步

1. 使用 rsync 同步文件 rsync 是一个常用的文件同步工具,可以在本地或远程系统之间同步文件和目录。 基本用法: rsync -avz /源目录/ 目标目录/-a:归档模式,保留文件属性。-v:显示详细输出。-z:压缩传输…...

解决VsCode的 Vetur 插件has no default export Vetur问题

文章目录 前言1.问题2. 原因3. 解决其他 前言 提示: 1.问题 Cannot find module ‘ant-design-vue’. Did you mean to set the ‘moduleResolution’ option to ‘node’, or to add aliases to the ‘paths’ option? Module ‘“/xxx/xxx/xxx/xxx/xxx/src/vie…...

DeepSeek本地部署详细指南

DeepSeek本地部署详细指南 随着人工智能技术的飞速发展,本地部署大模型的需求也日益增加。DeepSeek作为一款开源且性能强大的大语言模型,提供了灵活的本地部署方案,让用户能够在本地环境中高效运行模型,同时保护数据隐私。以下是…...

DNS污染:网络世界的“隐形劫持”与防御

在互联网的底层架构中,DNS(域名系统)如同数字世界的“导航员”,将用户输入的域名翻译成机器可读的IP地址。然而,DNS污染(DNS Poisoning)正像一场无声的“地址篡改”危机,威胁着全球网…...

AF3 superimpose函数解读

AlphaFold3 superimpose函数通过使用SVD最小化RMSD,将坐标叠加到参考上,在蛋白质结构预测中用于比较预测结构与真实结构的相似性。 源代码: from src.utils.geometry.alignment import weighted_rigid_align from src.utils.geometry.vect…...

python制作自己的一款Markdowm格式消除工具

01 引言 在日常使用 Markdown 编写文档时,我们有时会需要将 Markdown 格式的文本转换为纯文本,去除其中的各种标记符号,如标题符号、列表符号、代码块标记等。手动去除这些标记不仅效率低下,还容易出错。本文将介绍如何使用 Pyt…...

【C#零基础从入门到精通】(三)——C#变量和数据类型详解

【C#零基础从入门到精通】(三)——C#变量和数据类型详解 数据类型 在 C# 中,数据类型是对数据进行分类的方式,它定义了变量可以存储的数据的种类、范围以及可以对这些数据执行的操作。C# 的数据类型主要分为值类型、引用类型和指针类型(指针类型通常在不安全代码中使用),…...

如何从头训练大语言模型: A simple technical report

今天来快速捋一下路线,写个简短的technical report,更多是原理介绍性的。按我个人理解,从最简单的部分开始,逐步过渡到最繁复的环节: 模型架构-> Pretrain -> Post-Train -> Infra -> 数据侧。再掺杂一些杂项&#xf…...

gitlab无法登录问题

在我第一次安装gitlab的时候发现登录页面是 正常的页面应该是 这种情况的主要原因是不是第一次登录,所以我们要找到原先的密码 解决方式: [rootgitlab ~]# vim /etc/gitlab/initial_root_password# WARNING: This value is valid only in the followin…...

食品饮料生产瓶颈?富唯智能协作机器人来 “破壁”

在食品和饮料行业的发展进程中,诸多生产瓶颈如重复性劳动负担、复杂环境作业难题、季节性产能波动等,长期制约着企业的高效运营与进一步发展。如今,富唯智能协作机器人的出现,为这些难题提供了完美的解决方案,正逐步改…...

Python 实现 macOS 系统代理的设置

设置 SOCKS 代理 在 macOS 系统中,可以通过 networksetup 工具来设置 SOCKS 代理。以下是 Python 实现的方法: 使用 networksetup 设置 SOCKS 代理 import subprocessdef set_socks_proxy(server, port):"""设置 macOS 系统的 SOCKS 代理…...

深度学习之神经网络框架搭建及模型优化

神经网络框架搭建及模型优化 目录 神经网络框架搭建及模型优化1 数据及配置1.1 配置1.2 数据1.3 函数导入1.4 数据函数1.5 数据打包 2 神经网络框架搭建2.1 框架确认2.2 函数搭建2.3 框架上传 3 模型优化3.1 函数理解3.2 训练模型和测试模型代码 4 最终代码测试4.1 SGD优化算法…...

excel 日期转换

需求如下: 在excel 里面输入一个4515,4表示年份,2024年,51表示该年的51周,5表示日,周日用1表示,周一用2表示,以此类推,需要转换为年份/月份/日期 若想用公式来实现这一转换&#x…...

Awtk 如何添加开机画面

场景 我们知道在工程中,Ui是一个线程,并且需要一直存在,当我们使用的开机画面在这个线程开启就直接展示的时候,因为awtk的界面是window_open入栈的,即首次打开的窗口会记录在top,往后的窗口会依次往后存放&…...

【设计模式】【行为型模式】命令模式(Command)

👋hi,我不是一名外包公司的员工,也不会偷吃茶水间的零食,我的梦想是能写高端CRUD 🔥 2025本人正在沉淀中… 博客更新速度 📫 欢迎V: flzjcsg2,我们共同讨论Java深渊的奥秘 &#x1f…...

C++模拟实现AVL树

目录 1.文章概括 2.AVL树概念 3.AVL树的性质 4.AVL树的插入 5.旋转控制 1.左单旋 2. 右单旋 3.左右双旋 4.右左双旋 6.全部代码 1.文章概括 本文适合理解平衡二叉树的读者阅读,因为AVL树是平衡二叉树的一种优化,其大部分实现逻辑与平衡二叉树是…...

推荐算法实践:movielens数据集

MovieLens 数据集介绍 MovieLens 数据集是由明尼苏达大学的GroupLens研究小组维护的一个广泛使用的电影评分数据集,主要用于推荐系统的研究。该数据集包含用户对电影的评分、标签以及其他相关信息,是电影推荐系统开发与研究的常用数据源。 数据集版本 …...