9、卡顿优化:UI 卡顿、ANR 成因分析、主线程耗时排查、帧率优化;

31 阅读3分钟

卡顿优化:UI 卡顿、ANR 成因分析、主线程耗时排查、帧率优化;

1、什么是 UI 卡顿?根本原因

答案

手机屏幕默认 60 帧 / 秒,一帧理想耗时 16.6ms

主线程在 16.6ms 内没完成测量、布局、绘制、逻辑处理,就丢帧、掉帧,肉眼看到卡顿、滑动不流畅。

2、UI 卡顿常见原因有哪些?

答案

  1. 主线程做 网络请求、IO 读写、数据库、复杂计算、循环耗时
  2. 布局嵌套太深、过度绘制、View 太多、inflate 耗时
  3. 自定义 View onDraw 里做耗时操作、频繁创建对象
  4. 主线程锁等待、主线程频繁 GC、内存抖动
  5. 主线程消息太多,消息队列阻塞

3、ANR 是什么?触发时间阈值

答案ANR:应用无响应。系统监控主线程阻塞超时,弹出弹窗。阈值:

  • 按键 / 触摸事件:5s
  • 前台广播:10 秒
  • 后台广播:60 秒
  • 服务:20s

4、ANR 常见成因

答案

  1. 主线程做耗时操作(网络、IO、数据库、大循环)
  2. 主线程死锁、等待子线程
  3. 主线程卡顿、消息处理积压太多
  4. 广播、Service 里做耗时阻塞
  5. 内存泄漏、频繁 GC 导致主线程被挂起

5、ANR 日志怎么分析?

答案

  1. 抓取 /data/anr/traces.txt
  2. 搜索 ANR in 看哪个页面、哪个进程
  3. 主线程堆栈,卡在哪个方法、哪行代码
  4. 定位主线程耗时、锁等待、死锁位置

在 Android Studio 中查看 ANR 日志分两步:

1)Logcat 过滤 ANR/am_anr,快速确认发生 ANR 的包和原因;

2)用 adb pull /data/anr/traces.txt 拉取完整堆栈,重点看 main 线程调用栈,定位主线程耗时 / 阻塞位置。

6、主线程耗时怎么排查?常用手段

答案

  1. Android Studio Profiler:看主线程 CPU、卡顿堆栈
  2. StrictMode 严苛模式:检测主线程网络、磁盘 IO 违规
  3. 插点埋点:打印各方法执行耗时
  4. Looper 日志监听:拦截主线程消息,监控超过阈值的耗时任务
  5. 查看 ANR 日志、系统卡顿日志定位阻塞点

7、怎么避免主线程耗时?

答案

  1. 所有网络、IO、数据库、复杂计算全部丢子线程 / 协程 / 线程池
  2. 布局精简、减少嵌套、减少过度绘制
  3. onDraw 里不 new 对象、不做耗时逻辑
  4. 避免主线程同步锁、死锁
  5. 广播、服务内部严禁写耗时代码

8、什么是帧率优化?目标是多少

答案

目标稳定 60 帧,不掉帧、不卡顿。

帧率优化就是保证每帧耗时控制在 16.6ms 以内,减少掉帧、卡顿、滑动滞涩。

9、帧率优化具体怎么做?

答案

  1. 主线程只做 UI 刷新,剥离所有耗时到子线程
  2. 布局扁平化、减少层级、减少过度绘制
  3. 列表复用 ViewHolder,减少 inflate 和创建对象
  4. 图片预加载、缩略图、避免主线程解码大图
  5. 减少主线程 GC、避免内存抖动
  6. 监控帧率、卡顿打点,线上采集卡顿数据做专项优化

10、内存抖动为什么会造成卡顿?

答案

频繁大量创建和销毁临时对象 → 频繁触发 GCGC 会短暂阻塞主线程,导致掉帧、UI 卡顿。

极简总结

UI 卡顿本质是主线程一帧超过 16.6ms,

主线程耗时、布局复杂、过度绘制、频繁 GC 都会造成卡顿;

ANR 是主线程阻塞超时,常见于主线程耗时、死锁、广播 / 服务耗时,通过 traces.txt 分析堆栈定位;

排查用 Profiler、StrictMode、主线程耗时埋点;帧率优化核心:减负主线程、精简布局、减少绘制开销、避免频繁 GC,稳定 60 帧。