Android ANR 日志分析定位

ANR 是 Android 应用程序中的 "Application Not Responding" 的缩写,中文意思是 "应用程序无响应"。这是当应用程序在 Android 系统上运行时,由于某种原因不能及时响应用户输入事件或执行一个操作,导致界面无法更新,系统弹出对话框通知用户应用程序未响应,给用户提供了等待它响应或是直接关闭的选项。

当应用程序发生ANR 时,Android 系统会在设备的日志文件中记录相关信息,这个文件包含了在 ANR 发生时的各个线程的调用堆栈(路径:/data/anr/traces.txt)

但是 /data/anr/ 路径只有 root 权限才能够进行访问,在非 root 权限的情况下需要 adb 命令导出相关的日志文件后筛选查看 ANR 的日志信息


举个例子,故意写个 ANR:

class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)findViewById<Button>(R.id.btn).setOnClickListener {Thread.sleep(100000)}}
}

连续点击按钮,等待系统 ANR 的弹框,点击确认。


 将设备的诊断信息日志导出到电脑上(路径默认是adb的路径):

adb bugreport

想到电脑上的指定路径也可以配置:

adb bugreport D:\log.zip

 把导出的 zip 包解压缩后打开:

 日志文件比较多,ANR 所在的文件目录在:\FS\data\anr

这里面就包含了每一次发生 ANR 时的日志信息,日期时间都能看到

找到对应时间点的 ANR 日志用 txt 打开

里面的信息非常多,使用 Ctrl + F 搜索主线程相关的信息: "main" prio=5 tid=1

这样子就能够快速定位到主线程相关的信息了


首先跟在主线程后面的是状态,常见的有这几种状态:

Native:正在执行 JNI 本地函数(主线程空闲时执行的 nativePollOnce 也属于此)

Runnable:线程正在 Java 虚拟机中执行(可能正在进行耗时操作)

Sleeping:线程正在睡眠(通常是调用了 Thread.sleep() )

Blocked:线程被阻塞(等待监视器锁的释放)


在我举的例子中,主线程就是处于 Sleeping 状态,我们就可以往下看日志信息找到调用的堆栈,从而定位到代码进行具体的优化


应用在线上的数据中里,ANR 并不完全由应用产生,也有可能由系统原因导致(比如内存不足、其他应用CPU抢占等),即便如此,我们还是需要尽量避免在应用层产生 ANR

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

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

相关文章

Kubernetes(k8s第二部分)

资源清单相当于剧本 什么是资源&#xff1a; k8s中所有的内容都抽象为资源&#xff0c;资源实例化后&#xff0c;叫做对象。 1.K8S中的资源 集群资源分类 名称空间级别&#xff1a; kubeadm k8s kube-system kubectl get pod -n default 工作负载型资源&#xff0c;&a…

指针篇章-(1)

指针&#xff08;1&#xff09;学习流程 —————————————————————————————————————————————————————————————————————————————————————————————————————————————…

Linux:使用nslookup和dig查询DNS记录信息

nslookup nslookup&#xff08;Name Server Lookup&#xff09;用于从 DNS 服务器查询域名、IP 或其他 DNS 记录信息 示例 查询域名信息 $ nslookup baidu.comServer: 114.114.114.114 Address: 114.114.114.114#53Non-authoritative answer: Name: baidu.com Add…

springcloud项目,无法在Sentinel Dashboard查看到服务的访问监控信息【解决方法】

1.问题场景 因为warehouse子项目的前端未开发&#xff0c;所以只能通过postman测试接口访问&#xff1b; 2.解决方法 package org.sharetek.common.security.config;import cn.dev33.satoken.SaManager; import cn.dev33.satoken.filter.SaServletFilter; import cn.dev33.sat…

【Django】执行查询—检索对象(二)

主键 (pk) 查询快捷方式 pk查询等同于通过模型的 primary key 进行过滤&#xff0c;直接上例子&#xff0c;下面三个语句是等效的。 >>> Blog.objects.get(id__exact14) # Explicit form >>> Blog.objects.get(id14) # __exact is implied >>> …

构筑未来商业智能——数据中台的战略视角_光点科技

随着数字化时代的加速到来&#xff0c;企业对于数据的依赖程度日益增强。数据中台&#xff0c;作为连接数据与商业决策的关键枢纽&#xff0c;已成为企业打造持久竞争优势的战略选择。本文将从战略的高度&#xff0c;解析数据中台如何帮助企业捕捉数据红利&#xff0c;推进业务…

NXP实战笔记(十一):32K3xx基于RTD-SDK在S32DS上配置LPSPI(同步、异步、DMA、主机、从机、中断、轮询)

目录 1、概述 2、RTD-SDK配置 2.1、配置目标 2.2、主、从机引脚配置 2.3、时钟配置 2.4、LPSPI配置 2.5、中断配置 2.6、DMA配置(使用DMA才会配置) 2、dma Logic Instance 2.7、RM配置(使用DMA的情况下必须配置此选项) 3、代码实现 1、概述 S32K3_低功耗LPSPI轮询…

第七十六周周报

学习目标&#xff1a; 论文 实验 学习时间&#xff1a; 2024.2.24-2024.3.1 学习产出&#xff1a; 论文 仔细看了论文"All are Worth Words: A ViT Backbone for Diffusion Models"&#xff0c;”DiffiT: Diffusion Vision Transformers for Image Generation…

备战蓝桥杯Day19 - 堆排序基础知识

一、每日一题 - 填充 详细题解 s input() # 输入字符串 n len(s) # 定义字符的长度 judge ["00", "11", "0?", "1?", "?0", "?1", "??"] # 把所有的情况一一列举出来 count 0 # 设置计数…

性能优化篇(四) GPU Instancing

使用GPU Instancing可以在一个Draw Call中同时渲染多个相同或类似的物体&#xff0c;从而减少CPU和GPU的开销。 官方文档&#xff1a;https://docs.unity3d.com/Manual/GPUInstancing.html 启用GPU Instancing&#xff0c;我们可以选中一个材质&#xff0c;然后在Inspector窗口…

PostgreSQL教程(二十一):服务器管理(三)之服务器设置和操作

本章讨论如何设置和运行数据库服务器&#xff0c;以及它与操作系统的交互。 一、PostgreSQL用户账户 和对外部世界可访问的任何服务器守护进程一样&#xff0c;我们也建议在一个独立的用户账户下运行PostgreSQL。这个用户账户应该只拥有被该服务器管理的数据&#xff0c;并且…

埃隆·马斯克对OpenAI提起诉讼

埃隆马斯克对OpenAI提起诉讼&#xff0c;理由是AI安全威胁 马斯克指责&#xff0c;自从公司将其开发的人工通用智能技术&#xff08;AGI&#xff09;以闭源形式交给微软后&#xff0c;OpenAI已经失去了其“开放”的本质。 埃隆马斯克在周四提交的一项诉讼中声称&#xff0c;萨姆…

Ubuntu22.04下安装Spark2.4.0(Local模式)

一、版本信息 虚拟机产品&#xff1a;VMware Workstation 17 Pro 虚拟机版本&#xff1a;17.0.0 build-20800274 ISO映像文件&#xff1a;ubuntukylin-22.04-pro-amd64.iso Hadoop版本&#xff1a;Hadoop 3.1.3 JDK版本&#xff1a;Java JDK 1.8 Spark版本&#xff1a;S…

[SUCTF 2019]EasyWeb --不会编程的崽

个人认为&#xff0c;这题还算有些东西。先来看源码 <?php function get_the_flag(){// webadmin will remove your upload file every 20 min!!!! $userdir "upload/tmp_".md5($_SERVER[REMOTE_ADDR]);if(!file_exists($userdir)){mkdir($userdir);}if(!empty…

Slurm作业系统

1、什么是计算机集群 计算机集群是由多台独立的计算机&#xff08;节点&#xff09;通过网络连接在一起&#xff0c;以共同完成任务的一种计算机系统结构。集群系统旨在提高性能、可用性和可扩展性。以下是计算机集群的一般结构和组成要素&#xff1a; 节点&#xff08;Nodes&…

android Service 与 activity 通信 并不断传数据

注&#xff1a;这只是个Demo 以下载为案例&#xff0c;实现开启下载&#xff0c;暂停下载&#xff0c;下载进度不断发送给activity class DownloadService : Service() {override fun onBind(intent: Intent?): IBinder? {return MyBinder()}inner class MyBinder : Binder…

分布式任务调度平台XXL-JOB安装及使用

简介 XXL-JOB是一个分布式任务调度平台&#xff0c;其核心设计目标是开发迅速、学习简单、轻量级、易扩展。现已开放源代码并接入多家公司线上产品线&#xff0c;开箱即用。 源码github地址 源码gitee地址 中文文档地址 中央仓库地址 <!-- http://repo1.maven.org/ma…

云原生团队如何实现加量不加价

随着云原生技术的快速发展&#xff0c;越来越多的业务实现了上云&#xff0c;云原生团队在工作量增大的同时也随之变成了所有问题对接的入口&#xff0c;如何承担这个保姆的角色成为了一道难题&#xff0c;故障的定界和问题证据的交接更是让人头疼的问题。在这种情况下需要有工…

Python Web开发记录 Day5:jQuery(JavaScript库)

名人说&#xff1a;莫道桑榆晚&#xff0c;为霞尚满天。——刘禹锡&#xff08;刘梦得&#xff0c;诗豪&#xff09; 创作者&#xff1a;Code_流苏(CSDN)&#xff08;一个喜欢古诗词和编程的Coder&#x1f60a;&#xff09; 目录 五、jQuery1、jQuery-选择器和菜单案例①快速上…

水经微图Web版1.6.0发布

让每一个人都有自己的地图&#xff01; 水经微图&#xff08;简称“微图”&#xff09;新版已上线&#xff0c;在该版本中主要新增了点线面图层分组样式设置、图层排序并按序绘制、KML支持矢量符号的存储、KML支持态势标绘要素存储和新增历史地图文本样式等。 现在&#xff0…