ANR概述

news2024/11/29 11:43:22

系列文章目录

提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用


文章目录

  • 系列文章目录
  • 前言
  • 一、ANR是什么?
  • 二、ANR超时阈值
  • 三、前后与台区别
    • 1.前台与后台服务的区别
    • 2.前台与后台广播超时
    • 3.前台与后台ANR
  • 四、ANR流程
  • 总结


前言


一、ANR是什么?

ANR(Application Not responding),是指应用程序未响应,Android系统对于一些事件需要在一定的时间范围内完成,如果超过预定时间能未能得到有效响应或者响应时间过长,都会造成ANR。一般地,这时往往会弹出一个提示框,告知用户当前xxx未响应,用户可选择继续等待或者Force Close。

二、ANR超时阈值

不同组件的超时阈值各有不同,关于service、broadcast、contentprovider以及input的超时阈值如下表:
在这里插入图片描述

三、前后与台区别

1.前台与后台服务的区别

系统对前台服务启动的超时为20s,而后台服务超时为200s,那么系统是如何区别前台还是后台服务呢?来看看ActiveServices的核心逻辑:

ComponentName startServiceLocked(...) {
    final boolean callerFg;
    if (caller != null) {
        final ProcessRecord callerApp = mAm.getRecordForAppLocked(caller);
        callerFg = callerApp.setSchedGroup != ProcessList.SCHED_GROUP_BACKGROUND;
    } else {
        callerFg = true;
    }
    ...
    ComponentName cmp = startServiceInnerLocked(smap, service, r, callerFg, addToStarting);
    return cmp;
}

在startService过程根据发起方进程callerApp所属的进程调度组来决定被启动的服务是属于前台还是后台。当发起方进程不等于ProcessList.SCHED_GROUP_BACKGROUND(后台进程组)则认为是前台服务,否则为后台服务,并标记在ServiceRecord的成员变量createdFromFg。

什么进程属于SCHED_GROUP_BACKGROUND调度组呢?进程调度组大体可分为TOP、前台、后台,进程优先级(Adj)和进程调度组(SCHED_GROUP)算法较为复杂,其对应关系可粗略理解为Adj等于0的进程属于Top进程组,Adj等于100或者200的进程属于前台进程组,Adj大于200的进程属于后台进程组。关于Adj的含义见下表,简单来说就是Adj>200的进程对用户来说基本是无感知,主要是做一些后台工作,故后台服务拥有更长的超时阈值,同时后台服务属于后台进程调度组,相比前台服务属于前台进程调度组,分配更少的CPU时间片。
在这里插入图片描述
关于细节详见解读Android进程优先级ADJ算法,http://gityuan.com/2018/05/19/android-process-adj

前台服务准确来说,是指由处于前台进程调度组的进程发起的服务。这跟常说的fg-service服务有所不同,fg-service是指挂有前台通知的服务。

2.前台与后台广播超时

前台广播超时为10s,后台广播超时为60s,那么如何区分前台和后台广播呢?来看看AMS的核心逻辑:

BroadcastQueue broadcastQueueForIntent(Intent intent) {
    final boolean isFg = (intent.getFlags() & Intent.FLAG_RECEIVER_FOREGROUND) != 0;
    return (isFg) ? mFgBroadcastQueue : mBgBroadcastQueue;
}

mFgBroadcastQueue = new BroadcastQueue(this, mHandler,
        "foreground", BROADCAST_FG_TIMEOUT, false);
mBgBroadcastQueue = new BroadcastQueue(this, mHandler,
        "background", BROADCAST_BG_TIMEOUT, true);

根据发送广播sendBroadcast(Intent intent)中的intent的flags是否包含FLAG_RECEIVER_FOREGROUND来决定把该广播是放入前台广播队列或者后台广播队列,前台广播队列的超时为10s,后台广播队列的超时为60s,默认情况下广播是放入后台广播队列,除非指明加上FLAG_RECEIVER_FOREGROUND标识。

后台广播比前台广播拥有更长的超时阈值,同时在广播分发过程遇到后台service的启动(mDelayBehindServices)会延迟分发广播,等待service的完成,因为等待service而导致的广播ANR会被忽略掉;后台广播属于后台进程调度组,而前台广播属于前台进程调度组。简而言之,后台广播更不容易发生ANR,同时执行的速度也会更慢。

另外,只有串行处理的广播才有超时机制,因为接收者是串行处理的,前一个receiver处理慢,会影响后一个receiver;并行广播通过一个循环一次性向所有的receiver分发广播事件,所以不存在彼此影响的问题,则没有广播超时。

前台广播准确来说,是指位于前台广播队列的广播。

3.前台与后台ANR

除了前台服务,前台广播,还有前台ANR可能会让你云里雾里的,来看看其中核心逻辑:

final void appNotResponding(...) {
    ...
    synchronized (mService) {
        isSilentANR = !showBackground && !isInterestingForBackgroundTraces(app);
        ...
    }
    ...
    File tracesFile = ActivityManagerService.dumpStackTraces(
            true, firstPids,
            (isSilentANR) ? null : processCpuTracker,
            (isSilentANR) ? null : lastPids,
            nativePids);

    synchronized (mService) {
        if (isSilentANR) {
            app.kill("bg anr", true);
            return;
        }
        ...

        //弹出ANR选择的对话框
        Message msg = Message.obtain();
        msg.what = ActivityManagerService.SHOW_NOT_RESPONDING_UI_MSG;
        msg.obj = new AppNotRespondingDialog.Data(app, activity, aboveSystem);
        mService.mUiHandler.sendMessage(msg);
    }
}

决定是前台或者后台ANR取决于该应用发生ANR时对用户是否可感知,比如拥有当前前台可见的activity的进程,或者拥有前台通知的fg-service的进程,这些是用户可感知的场景,发生ANR对用户体验影响比较大,故需要弹框让用户决定是否退出还是等待,如果直接杀掉这类应用会给用户造成莫名其妙的闪退。

后台ANR相比前台ANR,只抓取发生无响应进程的trace,也不会收集CPU信息,并且会在后台直接杀掉该无响应的进程,不会弹框提示用户。

前台ANR准确来说,是指对用户可感知的进程发生的ANR。

四、ANR流程

在这里插入图片描述


总结

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

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

相关文章

核心案例 | 南京理工大学空地协同编队控制系统建设项目

项目名称:空地协同编队控制系统建设项目 场 地:室内/室外 关 键 词:自主导航与SLAM、集群协同决策、集群控制 南京理工大学核心案例(1) 01 项目背景 本项目通过集群四旋翼无人机、天地协同集群控制开发环境、无人机协同集群控制系统…

音频转换成mp3的方法

把音频转换为MP3格式是因为MP3格式可以更好地压缩音频文件,减小文件大小,便于存储和传输。此外,MP3格式已成为流行的音频格式之一,许多设备和软件都支持MP3格式,使得MP3格式成为了一种通用的音频格式。总的来说&#x…

log4Qt史上最详细介绍、编译和使用

文章目录 Log4Qt介绍下载log4qt源码测试例子(源码使用)将log4qt源码添加到工程测试代码日志配置文件:测试结果 总结log4qt更多请参考: 使用Log4Qt动态库一、创建Qt工程,命名为libLog4Qt二、在项目根目录下新建文件夹3r…

Simulink使能(Enable)、触发(Triggered)模块及其子系统的应用

Simulink中的使能(Enable)和触发(Triggered)模块及其子系统可以用于控制模型中的仿真运行时间和采样周期,从而提高模型的仿真效率和精度。 使用使能子系统 创建一个在控制信号为正值时执行的子系统。使用触发子系统 创…

如何系列 如何在Windows和Linux安装Nginx

文章目录 Windows一 下载Nginx二 启动Nginx三 验证 Linux一 安装依赖项二 下载Nginx源码包三 安装四 验证五 常用命令附录 Nginx是一款高性能的开源Web服务器和反向代理服务器,被广泛用于构建现代化的Web应用和提供静态内容。本篇博文将教你如何在Windows和Linux操作…

Vue 前端代码多地部署(打包后配置动态IP)

Vue 前端代码多地部署(打包后配置动态IP) 需求一、使用 config.json二、使用 config.js 需求 vue 代码打包之后,需要在多个地方部署。正常操作是:先改 ip 地址,再打包。这样每换一个地方部署,就需要重新打…

将自己写的nginx.conf运行到阿里云linux服务器上

首先 你要保证自己的nginx.conf没有问题 可以先在本地运行一下 然后来到nginx.conf文件的所在目录 利用 scp -r ./nginx.conf 用户名(如果之前没设置过就是 root)服务器公网地址:/etc/nginx/将文件传到服务器上去 这里需要注意 如果你的服务器之前没有装过nginx 是没有这个目…

C语言实现随机点名器

目录 1、程序描述 2、程序功能 3、功能详细实现过程 学生结构体声明和定义 菜单(menu)函数 文件读取和保存函数 查询函数 点名函数 rand函数 点名函数实现 点名次数归零函数 字体颜色变化函数 4、运行效果 5、源码分享 1、程序描述 只使用…

ANR实战案例 2 - 不同线程状态ANR示例

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 文章目录 系列文章目录前言一、Blocked状态示例1.启动初始化阻塞案例trace1.tx 2.ConcurrentHashMap分段锁优…

互联网营销之何谓真需求-想知道如何挖掘真需求看这篇就对了

互联网营销思维是以爆品为核心的迭代思维,本文结合“生日蛋糕”、“方便面”、“蜜雪冰城”几个小例子,以及我们具体的工作,展开聊聊什么是“真需求”。 1. 互联网营销和传统营销的区别 1.1 传统的营销思维: “定位4P&#xff0…

亚马逊云科技:使用Inf2实例运行大语言模型GPT-J-6B基础设施

在2019年的亚马逊云科技re:Invent上,亚马逊云科技发布了Inferentia芯片和Inf1实例这两个基础设施。Inferentia是一种高性能机器学习推理芯片,由亚马逊云科技定制设计,其目的是提供具有成本效益的大规模低延迟预测。时隔四年,2023年…

金融行业软件测试面试必备:答案详解与干货技巧

大家好,今天我要和大家分享的是我多年从事金融行业软件测试的心得体会。由于金融行业涉及到的数据量非常大,系统功能也十分复杂,因此在招聘软件测试人员时,往往会提出一些具有挑战性的问题。 作为一个资深面试官,我也…

Android aidl及binder基础知识巩固

作者:义华 1、什么是binder binder是android framework提供的,用于跨进程方法调用的机制,具有安全高效等特点。 我们知道,在 Android 系统中,每个应用程序都运行在一个独立的进程中,各个进程之间需要进行…

Logstash-grok表达式常用模式与正则使用与测试

Logstash 常用字符解释常用模式使用方式 使用正则表达式使用方式 测试用例 常用字符解释 \ 表示匹配 \s* 匹配空格(可多个) \w 匹配字符(可多个)常用模式 %{HOSTNAME},匹配请求的主机名 %{TIMESTAMP_ISO8601:time…

探索智能化:TOOM解析未来稿件校验系统的技术进展与应用展望

在信息时代,随着大数据、人工智能和自然语言处理等技术的快速发展,稿件校验系统正朝着智能化的方向迈进。智能化的稿件校验系统能够更准确、高效地检测虚假信息、抄袭行为以及提升文章质量。本文将探讨智能化稿件校验系统的技术进展与应用展望&#xff0…

NC与单一窗口数据对接丨外贸软件

在国际贸易通关过程中,所涉及相关部门的信息管理,主要是以数字化流程系统为主,让每个部门业务的申请、办理、回复采用电子化和互联网化。由于每个环节部分的数据壁垒未打通,数据无法协同共享,导致在口岸通关的过程中&a…

Swoole定时器实现毫秒级任务调度

简介 Timer 毫秒精度的定时器,底层基于 epoll_wait 和 setitimer 实现,数据结构使用最小堆,可支持添加大量定时器,使用最小堆数据结构实现的定时器,类似 JavaScript 的 setInterval,Swoole 定时器的添加和…

I2C通信协议原理和MPU6050

一、串口通讯 只能在两个设备之间进行 若要三台设备两两通信,则每个设备得需要两组窗口,为3组相互独立的窗口通讯 为解决这个问题:设计了总线通讯,有多种,I2C为其中一种 二、I2C通信 (1&#…

(java)异常 (详解)

目录 1. 异常的概念 1. 算术异常 2.空指针异常 3.数组越界异常 4.在编译时就发现了异常 2.异常的体系结构 总结: 3.异常的分类 4.异常的处理 1 .防御式编程 2.异常的抛出 3 .异常的捕获 3.1 .异常声明throws throw和throws的区别? …

【笔试强训选择题】Day13.习题(错题)解析

作者简介:大家好,我是未央; 博客首页:未央.303 系列专栏:笔试强训选择题 每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!! 文章目录…