ANR学习

news2025/2/13 5:20:05

一、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秒

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

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

相关文章

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…

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

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

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

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

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)模型。管理应用程序的核心数据和…

解决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…

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

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

如何从头训练大语言模型: 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优化算法…

【设计模式】【行为型模式】命令模式(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树是平衡二叉树的一种优化,其大部分实现逻辑与平衡二叉树是…

python卷积神经网络人脸识别示例实现详解

目录 一、准备 1)使用pytorch 2)安装pytorch 3)准备训练和测试资源 二、卷积神经网络的基本结构 三、代码实现 1)导入库 2)数据预处理 3)加载数据 4)构建一个卷积神经网络 5&#xff0…

以Unity6.0为例,如何在Unity中开启DLSS功能

DLSS DLSS(NVIDIA 深度学习超级采样):NVIDIA DLSS 是一套由 GeForce RTX™ Tensor Core 提供支持的神经渲染技术,可提高帧率,同时提供可与原生分辨率相媲美的清晰、高质量图像。目前最新突破DLSS 4 带来了新的多帧…

CSDN 大模型 笔记

AI 3大范式:计算 发发 交互 L1 生成代码 复制到IDEA (22年12-23年6,7月份) L2 部分自动编程 定义class 设计interface 让其填充实现 (23年7,8月份) L3 通用任务 CRUD (24年) L4 高度自动编程 通用领域专有任务&#xf…

Stability AI 联合 UIUC 提出单视图 3D 重建方法SPAR3D,可0.7秒完成重建并支持交互式用户编辑。

Stability AI 联合 UIUC 提出一种简单而有效的单视图 3D 重建方法 SPAR3D,这是一款最先进的 3D 重建器,可以从单视图图像重建高质量的 3D 网格。SPAR3D 的重建速度很快,只需 0.7 秒,并支持交互式用户编辑。 相关链接 论文&#xf…

网易易盾接入DeepSeek,数字内容安全“智”理能力全面升级

今年农历新年期间,全球AI领域再度掀起了一波革命性浪潮,国产通用大模型DeepSeek凭借其强大的多场景理解与内容生成能力迅速“出圈”,彻底改写全球人工智能产业的格局。 作为国内领先的数字内容风控服务商,网易易盾一直致力于探索…