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