笔记ANR原理

好,这里我给你一版 "面试官听了会点头的 ANR 原理回答"

这版回答有 结构、有原理、有细节、有工程认知 ,不啰嗦,也不浮夸,适合 中高级 Android 面试


一、先给一句话版本(开场用)

ANR 本质上是系统在监控主线程响应能力,当主线程在规定时间内没有完成系统要求的关键事件处理,AMS 就会判定应用无响应并触发 ANR。

这句话先说出来,面试官基本就知道你不是小白。


二、展开说:ANR 是怎么被"判定"的(核心原理)

1️⃣ 谁在监控?

ActivityManagerService(AMS)在监控应用进程的主线程响应情况

它并不是看代码,而是看 "事件有没有被及时处理"


2️⃣ 监控的是什么事件?

主要是这几类 必须及时完成的事件

  • 输入事件(点击、按键)

  • Activity 生命周期回调

  • BroadcastReceiver.onReceive

  • Service 启动 / 绑定

  • ContentProvider 初始化


3️⃣ 判定机制是怎样的?

流程是:

  1. 系统把事件通过 Binder 投递给应用主线程

  2. AMS 开始计时

  3. 主线程必须在 规定时间内完成处理并返回

  4. 如果超时 → 判定 ANR

👉 是否超时才是关键,和你"在跑哪行代码"无关


三、不同场景的超时时间(体现你熟)

你可以挑 2~3 个说,不用全背:

  • 前台输入事件:5 秒

  • 前台 Broadcast:10 秒

  • 后台 Broadcast:60 秒

  • Service 启动:20 秒

  • ContentProvider onCreate:10 秒

面试官听到具体数字,基本就满意了。


四、为什么会 ANR(真正的技术本质)

因为 Android 是单线程 UI 模型,主线程一旦被阻塞,就无法处理系统事件

常见原因包括:

  • 主线程执行耗时操作(I/O、网络、复杂计算)

  • 主线程被锁阻塞(synchronized / Binder 调用)

  • Fragment / View 层级复杂导致 UI 渲染超时

  • 生命周期里做了太多工作


五、ANR 和 Crash 的区别(加分点)

对比项 ANR Crash
是否异常抛出
是否一定退出 否(用户可选)
本质 响应超时 未捕获异常
定位方式 traces + 时间线 堆栈

六、trace 为什么有时"不准"(高级理解)

traces.txt 只是 ANR 发生那一刻的线程快照,而 ANR 是一个"时间窗口问题"

所以:

  • 真正阻塞主线程的代码可能已经执行完了

  • trace 更应该用来看 线程状态和锁关系

  • 实际排查要结合日志、埋点、主线程耗时监控

这一段说出来,面试官会觉得你"真排过线上 ANR"。


七、最后用一句总结收尾(非常重要)

ANR 的根因只有一个:主线程在规定时间内无法响应系统事件。
所有表现形式,本质上都是主线程被占用或阻塞。


八、如果面试官追问「那你怎么排查 ANR?」

你只要接一句:

线上主要靠 traces 定位方向,再结合主线程耗时监控、关键路径埋点和多次 ANR 的共性分析来最终定位根因。

到这里,这一题基本就是 "满意甚至加分"

定位anr 先看trace文件确定是哪类

看log 给出了时间

过滤进程看看干了一些事情 能抓到一些蛛丝马迹

看下cpu usage和momery useage

看看是不是其他的app占用cpu或者内存很高

相关推荐
-SOLO-4 小时前
开发笔记-摸鱼输入法
笔记
疯狂打码的少年7 小时前
【计算机网络】TCP/IP协议族(四层体系结构,与OSI对比)
网络·笔记·tcp/ip·计算机网络
xqqxqxxq7 小时前
AI Agent学习:Agent协作工具技术笔记(李博杰《深入理解 AI Agent》4.6观后总结)
笔记·学习
彧azz9 小时前
数据结构:关于图的学习
c语言·数据结构·笔记·学习·算法
自小吃多9 小时前
高云 FPGA 添加时序约束笔记
笔记·fpga开发
彧azz10 小时前
二叉搜索树学习记录
c语言·数据结构·笔记·算法
蒸蒸yyyyzwd10 小时前
机试和Redis学习笔记
c++·笔记·面试
果壳science11 小时前
《自然本源》如何实现狭义相对论的代数化
笔记·算法·几何学
1314lay_100711 小时前
C#调用Sql Server存储过程,并且使用传入表结构
数据库·经验分享·笔记·sqlserver·c#
志尊宝12 小时前
Vue3 零基础每日笔记(015):条件渲染 v-if 与 v-show——控制 DOM 生死还是控制显隐
前端·vue.js·笔记