卡顿优化:UI 卡顿、ANR 成因分析、主线程耗时排查、帧率优化;
1、什么是 UI 卡顿?根本原因
答案
手机屏幕默认 60 帧 / 秒,一帧理想耗时 16.6ms。
主线程在 16.6ms 内没完成测量、布局、绘制、逻辑处理,就丢帧、掉帧,肉眼看到卡顿、滑动不流畅。
2、UI 卡顿常见原因有哪些?
答案
- 主线程做 网络请求、IO 读写、数据库、复杂计算、循环耗时
- 布局嵌套太深、过度绘制、View 太多、inflate 耗时
- 自定义 View onDraw 里做耗时操作、频繁创建对象
- 主线程锁等待、主线程频繁 GC、内存抖动
- 主线程消息太多,消息队列阻塞
3、ANR 是什么?触发时间阈值
答案ANR:应用无响应。系统监控主线程阻塞超时,弹出弹窗。阈值:
- 按键 / 触摸事件:5s
- 前台广播:10 秒
- 后台广播:60 秒
- 服务:20s
4、ANR 常见成因
答案
- 主线程做耗时操作(网络、IO、数据库、大循环)
- 主线程死锁、等待子线程
- 主线程卡顿、消息处理积压太多
- 广播、Service 里做耗时阻塞
- 内存泄漏、频繁 GC 导致主线程被挂起
5、ANR 日志怎么分析?
答案
- 抓取
/data/anr/traces.txt - 搜索 ANR in 看哪个页面、哪个进程
- 看 主线程堆栈,卡在哪个方法、哪行代码
- 定位主线程耗时、锁等待、死锁位置
在 Android Studio 中查看 ANR 日志分两步:
1)Logcat 过滤 ANR/am_anr,快速确认发生 ANR 的包和原因;
2)用 adb pull /data/anr/traces.txt 拉取完整堆栈,重点看 main 线程调用栈,定位主线程耗时 / 阻塞位置。
6、主线程耗时怎么排查?常用手段
答案
- Android Studio Profiler:看主线程 CPU、卡顿堆栈
- StrictMode 严苛模式:检测主线程网络、磁盘 IO 违规
- 插点埋点:打印各方法执行耗时
- Looper 日志监听:拦截主线程消息,监控超过阈值的耗时任务
- 查看 ANR 日志、系统卡顿日志定位阻塞点
7、怎么避免主线程耗时?
答案
- 所有网络、IO、数据库、复杂计算全部丢子线程 / 协程 / 线程池
- 布局精简、减少嵌套、减少过度绘制
- onDraw 里不 new 对象、不做耗时逻辑
- 避免主线程同步锁、死锁
- 广播、服务内部严禁写耗时代码
8、什么是帧率优化?目标是多少
答案
目标稳定 60 帧,不掉帧、不卡顿。
帧率优化就是保证每帧耗时控制在 16.6ms 以内,减少掉帧、卡顿、滑动滞涩。
9、帧率优化具体怎么做?
答案
- 主线程只做 UI 刷新,剥离所有耗时到子线程
- 布局扁平化、减少层级、减少过度绘制
- 列表复用 ViewHolder,减少 inflate 和创建对象
- 图片预加载、缩略图、避免主线程解码大图
- 减少主线程 GC、避免内存抖动
- 监控帧率、卡顿打点,线上采集卡顿数据做专项优化
10、内存抖动为什么会造成卡顿?
答案
频繁大量创建和销毁临时对象 → 频繁触发 GCGC 会短暂阻塞主线程,导致掉帧、UI 卡顿。
极简总结
UI 卡顿本质是主线程一帧超过 16.6ms,
主线程耗时、布局复杂、过度绘制、频繁 GC 都会造成卡顿;
ANR 是主线程阻塞超时,常见于主线程耗时、死锁、广播 / 服务耗时,通过 traces.txt 分析堆栈定位;
排查用 Profiler、StrictMode、主线程耗时埋点;帧率优化核心:减负主线程、精简布局、减少绘制开销、避免频繁 GC,稳定 60 帧。