笔记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或者内存很高

相关推荐
CYTElena2 小时前
JAVA关于集合的笔记
java·开发语言·笔记
wdfk_prog2 小时前
[Linux]学习笔记系列 -- [fs]mnt_idmapping
linux·笔记·学习
CYTElena3 小时前
关于JAVA异常的笔记
java·开发语言·笔记·语言基础
代码游侠3 小时前
学习笔记——HTML网页开发基础
运维·服务器·开发语言·笔记·学习·html
代码游侠3 小时前
应用——基于C语言实现的简易Web服务器开发
运维·服务器·c语言·开发语言·笔记·测试工具
week_泽4 小时前
OCR学习笔记,调用免费百度api
笔记·学习·ocr
week_泽4 小时前
离线OCR笔记及代码
笔记·ocr
Aliex_git4 小时前
内存堆栈分析笔记
开发语言·javascript·笔记
航Hang*5 小时前
第三章:网络系统建设与运维(中级)——交换技术
运维·笔记·计算机网络·华为·ensp·交换机