必看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 卡顿。

相关推荐
Zha0Zhun44 分钟前
Jetpack Compose 实现 iOS 风格 3D WheelPicker
android
深念Y1 小时前
RIO-UL00(EMUI 4.1 / Android 6.0.1 / arm64)开机自启动 sshd
android·linux·华为·安卓·chroot·sshd·emui
爱和冰阔落2 小时前
【MySQL 慢查询排查实战】列表接口逐渐变慢时,怎样从请求链路定位原因
android·数据库·mysql
hunterandroid18 小时前
Android WebView JSBridge 治理实战:从线上白屏崩溃到协议化通信
android·前端
一个用户名i18 小时前
【Compose 系列】第 1 篇:认识 Compose,为什么要学它
android·android jetpack
极客猴子19 小时前
iPhone实时转写软件推荐:会议录音功能真实体验
android·人工智能·飞书
达令哥20 小时前
告别 ARouter!基于 Google 官方 Navigation 3 + KSP 打造 Compose 时代的双轨制路由框架
android·前端
YF021120 小时前
Android App启动与权限管控
android
嘟哩DuliDuli20 小时前
AI 短剧生成为什么要有角色库、场景库和镜头卡
android·人工智能·安全·ai·软件工程