ANR原理篇 - ANR弹框是如何显示出来的

news2024/11/26 12:22:04

系列文章目录

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


文章目录

  • 系列文章目录
  • 前言
  • 一、ANR弹框是如何显示流程
    • 1.1 找到弹框对应类
    • 1.2 查找AppNotRespondingDialog引用
    • 1.3 小节
  • 总结


前言

这一章比较简单,但对于新手排查系统问题,是一个很好的参考。


一、ANR弹框是如何显示流程

想知道弹框是如何显示的,最简单的方式就是先造一个程序无响应的场景,然后打开uiautomatorviewer工具查看布局,这样我们就可以找到对应的XMl然后在源码中搜索,就能找到我们的目标类了。

1.1 找到弹框对应类

首先我们看到的是下面这样一个场景,先基于android-29的源码全局文字:没有响应,关闭应用,等待,没有搜到,正常,这些文字应该是配置在xml中的。换个思路搜id,关闭应用对应的是aerr_close,全局搜果然搜到了,在AppNotRespondingDialog类中。对应的类名正好也符合:APP无响应。所以说我们的入口找到了。

另外我们看一下AppNotRespondingDialog的包名:com.android.server.am,说明是跑在Serve端的。
在这里插入图片描述

1.2 查找AppNotRespondingDialog引用

发现有是AppErrors的handleShowAnrUi方法调用的。我们先看整个调用流程:

  1. InputManagerService的notifyANR方法
 // Native callback.
    private long notifyANR(IBinder token, String reason) {
        return mWindowManagerCallbacks.notifyANR(
                token, reason);
    }
  1. InputManagerCallback的notifyANR方法
 @Override
    public long notifyANR(IBinder token, String reason) {
        AppWindowToken appWindowToken = null;
        WindowState windowState = null;
        boolean aboveSystem = false;
        synchronized (mService.mGlobalLock) {
           ...
            //存储日志的
            mService.saveANRStateLocked(appWindowToken, windowState, reason);
        }
 
        // All the calls below need to happen without the WM lock held since they call into AM.
        mService.mAtmInternal.saveANRState(reason);
 
        if (appWindowToken != null && appWindowToken.appToken != null) {
            ...
        } else if (windowState != null) {
            //通知弹出ANR的框
            long timeout = mService.mAmInternal.inputDispatchingTimedOut(
                    windowState.mSession.mPid, aboveSystem, reason);
            if (timeout >= 0) {
                // The activity manager declined to abort dispatching.
                // Wait a bit longer and timeout again later.
                return timeout * 1000000L; // nanoseconds
            }
        }
        return 0; // abort dispatching
    }
  1. ActivityManagerService.LocalService的inputDispatchingTimedOut方法
  2. ActivityManagerService的inputDispatchingTimedOut方法
  3. ProcessRecord的appNotResponding方法
if (mService.mUiHandler != null) {
                // Bring up the infamous App Not Responding dialog
                Message msg = Message.obtain();
                msg.what = ActivityManagerService.SHOW_NOT_RESPONDING_UI_MSG;
                msg.obj = new AppNotRespondingDialog.Data(this, aInfo, aboveSystem);
 
                mService.mUiHandler.sendMessage(msg);
            }
  1. ProcessRecord的appNotResponding方法
case SHOW_NOT_RESPONDING_UI_MSG: {
                mAppErrors.handleShowAnrUi(msg);
                ensureBootCompleted();
            } break;
  1. ProcessRecord的appNotResponding方法
void handleShowAnrUi(Message msg) {
        Dialog dialogToShow = null;
        List<VersionedPackage> packageList = null;
        synchronized (mService) {
            AppNotRespondingDialog.Data data = (AppNotRespondingDialog.Data) msg.obj;
            final ProcessRecord proc = data.proc;
            if (proc == null) {
                Slog.e(TAG, "handleShowAnrUi: proc is null");
                return;
            }
            ...
            if (mService.mAtmInternal.canShowErrorDialogs() || showBackground) {
                dialogToShow = new AppNotRespondingDialog(mService, mContext, data);
                proc.anrDialog = dialogToShow;
            } else {
                MetricsLogger.action(mContext, MetricsProto.MetricsEvent.ACTION_APP_ANR,
                        AppNotRespondingDialog.CANT_SHOW);
                // Just kill the app if there is no dialog to be shown.
                mService.killAppAtUsersRequest(proc, null);
            }
        }
        // If we've created a crash dialog, show it without the lock held
        if (dialogToShow != null) {
            dialogToShow.show();//显示程序无响应的框
        }
        ...
    }

1.3 小节

总结一下,流程图如下:
在这里插入图片描述


总结

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

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

相关文章

Python程序员职业现状分析,想提高竞争力,就要做到这六点

现今程序员群体数量已经高达几百万&#xff0c;学历和收入双高&#xff0c;月薪普遍过万。今天&#xff0c;我们就围绕90后程序员人群分析、职业现状、Python程序员分析等&#xff0c;进行较为全面的报告分析和观点论述。 一、程序员人群分析 人数规模上&#xff1a;截当前程…

javaweb系列-JSON对象、BOM对象、DOM对象

1.5.1.3 JSON对象 在 JavaScript 中自定义对象特别简单&#xff0c;其语法格式如下&#xff1a; <body><script>//自定义对象var user {name: "tom",age: 20,gendar: "male",eat: function () { //函数alert("吃饭啦");}};aler…

Xcode多个子工程结合联编开发SDK

Xcode版本&#xff1a;Version 14.3 (14E222b) 这是啥&#xff1f; chat&#xff1a; Xcode 多个子工程结合联编可以用于开发 SDK&#xff0c;这种开发方法是在一个主工程中包含多个子工程&#xff0c;每个子工程代表 SDK 中不同的模块&#xff0c;每个子工程都可以独立编译。…

AutoDL平台租借GPU详解

AutoDL平台租借GPU详解&#xff08;2023年&#xff09; 一、AutoDL租用GPU 1.1 创建实例 首先进入AutoDL官网&#xff1a;AutoDL-品质GPU租用平台-租GPU就上AutoDL进行学生注册登录&#xff08;学生有优惠&#xff09;点击右上角的控制台&#xff0c;进入AutoDL的主页&#…

人工智能应用--深度学习原理与实战--神经网络的工作原理

机器学习是将输入(比如图像)映射到目标(比如标签“猫”)&#xff0c;并建立映射规则(即模型)。在深度学习中&#xff0c;神经网络通过一系列数据变换层来实现这种输入到目标的映射&#xff0c;本章节我们具体来看这种学习过程是如何实现的。 学习内容 1、理解层(Layer)及权重(…

Java调用C#

由于项目采用Hybrid热更&#xff0c;走纯C#开发&#xff0c;目前战斗由客户端到服务端&#xff08;客户端提供dll&#xff09;&#xff0c;服务端负责调用&#xff0c;故需要走Java 调C# dll逻辑。 1、JNI&#xff1a;不支持泛型&#xff08;pb&#xff09;没法转C成功 2、JN…

MatebookE2022款i7集显 华为智能磁吸键盘(DRC-W76)原装出厂Win11系统恢复原厂OEM系统

HUAWEI华为笔记本电脑&#xff0c;Matebook E 2022款 i7 集显 华为智能磁吸键盘 16GB512GB (DRC-W76)原装出厂Windows11系统恢复原厂OEM系统 系统自带所有驱动、办公软件、华为电脑管家等预装软件 链接&#xff1a;https://pan.baidu.com/s/1t7bczFO_RvD31g1uIZoGgw?pwdq2g0 …

前端面试题整理2

目录 1.讲解es6新增map和set&#xff1f; 2.Ts的枚举和元组是什么&#xff1f; 3.vue3中的beforeEnter钩子函数怎么用&#xff1f; 4.获取数据时&#xff0c;加载loading动画&#xff0c;在哪取消比较好Diff算法的优化在哪&#xff1f; 5.Jq中的$(this)和this的区别&#x…

单片机--STM32

【1】课程回顾 【2】课程介绍 1.单片机简介 单片机是单片微型计算机的简称&#xff0c;Mcu是Microcontroller的简称&#xff0c;也就是嵌入式微控制器。采用集成电路技术将具有数据处理能力的中央处理器CPU、随机存储器RAM、只读存储器ROM、定时器/计时器、多种I/O口和中断系统…

P1772 [ZJOI2006] 物流运输

题目提供者 洛谷 难度 提高/省选- 题目描述 物流公司要把一批货物从码头 A 运到码头 B。由于货物量比较大&#xff0c;需要 n 天才能运完。货物运输过程中一般要转停好几个码头。 物流公司通常会设计一条固定的运输路线&#xff0c;以便对整个运输过程实施严格的管理和跟…

20230516使用python3确认三门问题

最烧脑的悖论&#xff0c;意识为什么会影响未来&#xff1f;颠覆你认知的三门问题播报文章 小红虾实验室 2023-04-09 06:08 四川 好看视频优创联盟,优质科学领域创作者 关注 对于懂概率的人来说&#xff0c;他中大奖的概率将成倍增加&#xff0c;甚至获奖率能够达到100%。 今…

【量化交易笔记】6.布林带的实现

上一讲介绍A股移动平均值&#xff08;MA&#xff09;指标&#xff0c;本讲我们来讲解布林布的实现。 布林线&#xff08;BOLL&#xff09;技术指标简介 布林线&#xff08;Bollinger Bands&#xff0c;BOLL&#xff09;又称布林带&#xff0c;是约翰布林&#xff08;John Bol…

dbForge Studio for SQL Server Crack

dbForge Studio for SQL Server Crack 增加了对源代码管理中的数据操作语言(DML)触发器排序的支持。 添加了对不使用EXEC/EXECUTE关键字调用过程/函数的语法支持。 在语法检查中添加了对EXEC命令的支持。 dbForge Studio for SQL Server是一个IDE&#xff0c;用于SQL Server中的…

抖音本地生活服务商贴牌小程序

作为社交电商平台的一部分&#xff0c;抖音本地生活服务的市场前景非常广阔。以下是抖音本地生活服务商市场前景的几个方面&#xff1a; 巨大的用户群体&#xff1a;抖音拥有数亿的用户&#xff0c;这些用户中有很多人需要本地生活服务&#xff0c;如美食、酒店、旅游等&am…

对话三维家创始人蔡志森:AIGC让家装从“填空题”变成了“选择题”

&#xff08;图片来源&#xff1a;Pixels&#xff09; 三维家讲透了一个道理&#xff1a;数字化企业如何利用已有优势构建AGI能力。 数科星球原创 作者丨苑晶 编辑丨大兔 AIGC火热半年有余&#xff0c;人们已对ChatGPT不再陌生。 从互联网巨头再到上一代AI企业&#xff0c;…

TiKV 新架构:Partitioned Raft KV 原理解析

作者&#xff1a;徐奇 TiKV 推出了名为“partitioned-raft-kv”的新实验性功能&#xff0c;该功能采用一种新的架构&#xff0c;不仅可以显著提高 TiDB 的可扩展性&#xff0c;还能提升 TiDB 的写吞吐量和性能稳定性。 在上一篇文章中&#xff0c;我们介绍了 Partitioned Raf…

就业内推 | 中国移动招网工,有云计算认证的看过来

01 中移集成 &#x1f537;招聘岗位&#xff1a;云网络工程师 &#x1f537;职责描述&#xff1a; 1、具有云网项目售前工作经验&#xff0c;精通云网络架构和技术原理&#xff1b;熟悉国内主流云厂商阿里云、腾讯云等整体架构和产品体系。 2、具备一定的云网项目交付能力&…

【追梦之旅】——栈居然还能这样玩?!+ 力扣 - 有效括号

【追梦之旅】——栈居然还能这样玩&#xff1f;&#xff01; 力扣 - 有效括号 ~&#x1f60e; 前言&#x1f64c;什么是栈&#xff1f;栈的C语言实现头文件编写源码&#xff1a;功能文件编写源码&#xff1a;测试文件编写源码&#xff1a; 力扣题解——有效的括号 总结撒花&…

从C出发 33 --- 自定义数据类型(中)

struct 结构体类型的本质是 数据类型 &#xff0c;既然是数据类型&#xff0c;就是用来创建变量&#xff0c;而创建的这个变量其实是 变量的集合&#xff0c;是结构体里面成员变量的集合 struct Test {int a,b;}; struct Test tt.a 1; t.b 2;//意味着&#xff0c;结构体变…

数据结构学习记录——图的遍历(深度优先搜索、广度优先搜索、为什么需要两种遍历、图不连通怎么办)

目录 深度优先搜索 概念 图解过程 伪代码 时间复杂度 具体代码&#xff08;C语言&#xff09; 广度优先搜索 概念 图解过程 伪代码 时间复杂度 具体代码&#xff08;C语言&#xff09; 为什么需要两种遍历 图不连通怎么办 连通 路径 回路 连通图 连通…