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

安卓ANR检测、分析、优化面面谈

前言

一个引发讨论的楔子,以下三种现象有什么区别:

  • App停止运行
  • App暂无响应
  • App闪退
    答案:
    产生原因不同:
  • 停止运行是UNCheckException+Error
  • 暂无响应是ANRDialog
  • 闪退是CheckException+Error
    本文讨论的主题是ANR的定义、分类、复现、分析、优化。

ANR定义

Application Not Responding

ANR类型

Input dispatching timed out

按键或触摸事件在特定时间内无响应(origin:5s)
KEY_DISPATCHING_TIMEOUT = 8*1000

12-08 10:51:08.136 763-787/system_process E/ANRManager: ANR in com.xx(com.xx/com.xxactivity.ScreenSaverPicSelectActivity), time=26867631Reason: Input dispatching timed out (Waiting to send non-key event because the touched window has not finished processing certain input events that were delivered to it over 500.0ms ago.  Wait queue length: 36.  Wait queue head age: 8510.1ms.)

Broadcast Timeout

BroadcastReceiver在特定时间内无法处理完成
BROADCAST_FG_TIMEOUT: 10s
BROADCAST_BG_TIMEOUT: 60s
按键和广播事件时间内未响应,时间限定定义在ActivityManagerService.java类中

Service Timeout

Service在特定的时间内无法处理完成,属于小概率类型
service时间内未响应时间限定在ActiveServices.java类中
SERVICE_TIMEOUT = 20*1000;

Activity Timeout

名称 时间
Activity#onPause 500ms
Activity#onStop 10s

Activity#onDestory	10s12-08 17:22:11.296 719-743/system_process W/ActivityManager: 
Activity stop timeout for ActivityRecord{2fd135ba u0 com.xx./com.unilife.fridge.home.banner.OpenFullScreenActivity t206}

ANR原因

  1. 应用进程有一个主线程(main thread)和一个信息队列(main message queue) main thead == activity thread
  2. 主线程负责处理像Draw、Listen、receive等UI事件
  3. 主线程负责从消息队列中取出信息并分发它
  4. 主线程在完成当前信息处理之前,不会再取信息队列中的信息
  5. 如果主线程在处理当前信息时卡住,没有及时分发,ANR就会出现

ANR检测

ANR检测工具

相关文章:

  • Sealos CLI快速部署部署K8s集群
  • 七大获取免费https的方式
  • Amazon云计算AWS(三)
  • Java 基础面试300题 (201-230)
  • 2010-2015 年阿拉斯加北坡苔原植物功能类型连续覆盖图
  • Linux 字体管理
  • 07.与jenkins集成实现cicd
  • 数据中台设计方案(原版word获取)
  • Mongodb安装和简单操作
  • ChatGPT-4o 有何特别之处?
  • 计算机网络工程师需要掌握的知识点
  • 2023 N1CTF Junior pwn 顶级签到
  • 如何从0到设计一个CRM系统
  • Docker - Kafka
  • WEB攻防-JAVAWEB项目常见漏洞
  • 自己简单写的 事件订阅机制
  • @angular/forms 源码解析之双向绑定
  • 【腾讯Bugly干货分享】从0到1打造直播 App
  • chrome扩展demo1-小时钟
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • ES6系列(二)变量的解构赋值
  • Javascript基础之Array数组API
  • java第三方包学习之lombok
  • 和 || 运算
  • 经典排序算法及其 Java 实现
  • 你真的知道 == 和 equals 的区别吗?
  • 容器服务kubernetes弹性伸缩高级用法
  • 如何设计一个比特币钱包服务
  • 什么软件可以剪辑音乐?
  • ​经​纬​恒​润​二​面​​三​七​互​娱​一​面​​元​象​二​面​
  • # Redis 入门到精通(一)数据类型(4)
  • # 服务治理中间件详解:Spring Cloud与Dubbo
  • #etcd#安装时出错
  • #LLM入门|Prompt#3.3_存储_Memory
  • (2)空速传感器
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (javaweb)Http协议
  • (附源码)ssm基于微信小程序的疫苗管理系统 毕业设计 092354
  • (一)使用IDEA创建Maven项目和Maven使用入门(配图详解)
  • .NET CF命令行调试器MDbg入门(四) Attaching to Processes
  • .NET Core实战项目之CMS 第十二章 开发篇-Dapper封装CURD及仓储代码生成器实现
  • .NET Core引入性能分析引导优化
  • .net framework 4.8 开发windows系统服务
  • .net 流——流的类型体系简单介绍
  • .NET 使用 JustAssembly 比较两个不同版本程序集的 API 变化
  • .Net(C#)常用转换byte转uint32、byte转float等
  • .NET+WPF 桌面快速启动工具 GeekDesk
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • @AutoConfigurationPackage的使用
  • @Controller和@RestController的区别?
  • [2021]Zookeeper getAcl命令未授权访问漏洞概述与解决
  • [2024最新教程]地表最强AGI:Claude 3注册账号/登录账号/访问方法,小白教程包教包会
  • [24年新算法]NRBO-XGBoost回归+交叉验证基于牛顿拉夫逊优化算法-XGBoost多变量回归预测
  • [AutoSAR系列] 1.3 AutoSar 架构
  • [BUUCTF NewStarCTF 2023 公开赛道] week4 crypto/pwn