必看9

卡顿优化: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
  • 广播:10s
  • 服务:20s

4、ANR 常见成因

答案

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

5、ANR 日志怎么分析?

答案

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

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

答案

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

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

答案

  1. 所有网络、IO、数据库、复杂计算全部丢子线程 / 协程 / 线程池
  2. 布局精简、减少嵌套、减少过度绘制
  3. onDraw 里不 new 对象、不做耗时逻辑
  4. 避免主线程同步锁、死锁
  5. 利用 IdleHandler 把非紧急任务放到空闲时机执行

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

答案

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

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

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

答案

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

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

答案

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

相关推荐
恋猫de小郭30 分钟前
Android 限制侧载新进展,谷歌联合国内厂商推验证计划
android·前端·flutter
恋猫de小郭38 分钟前
解读 Android 17 全新内存限制,有没有“豁免”后门?
android·前端·flutter
贾艺驰3 小时前
实战Android Framework: 新增一个系统权限
android
alexhilton8 小时前
使用Android Archive进行打包
android·kotlin·android jetpack
badhope10 小时前
做了几年安卓开发,这些坑我帮你踩过了
android·android studio
逐光老顽童2 天前
Java 与 Kotlin 混合开发避坑指南:30 个真实案例实录
android·kotlin
爱勇宝3 天前
鸿蒙生态的下半场:开发者不只要能开发,还要能赚钱
android·前端·程序员
Yeyu3 天前
刷新一帧的艺术:invalidate / postInvalidate / postInvalidateOnAnimation全解析
android
潘潘潘3 天前
Android OTA 升级原理和流程介绍
android
plainGeekDev3 天前
null 判断 → Kotlin 可空类型
android·java·kotlin