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

相关推荐
企业数字化笔记4 小时前
固定资产财务账与实物账怎么对账?折旧快照、差异检测与SQL核对
android·数据库·sql
千里马-horse5 小时前
第 66 章:在 Android 上运行 Windows 游戏
android·aosp
云边有个稻草人9 小时前
飞牛 NAS 远程访问实战:星空组网连接 Mac 与安卓,从 Compose 部署到 5G 验证
android·5g·macos
聚美智数9 小时前
手机号归属地-手机号归属地查询-手机归属地-运营商归属地
android·智能手机
恋猫de小郭9 小时前
Shopify 从 React Native 回到 Swift/Kotlin,但是你以为有手就行??
android·前端·ios
菠萝加点糖10 小时前
Android ChipGroup 使用说明
android
我命由我1234510 小时前
Android Compose 开发,使用 ConstraintLayout,但是引入的是旧的 ConstraintLayout
android·java·java-ee·android studio·android jetpack·android-studio·android runtime
小鱼干..11 小时前
http://101.43.154.45:60083/start/index.php?page=hello
android
hai_android11 小时前
Android WorkManager 笔记
android·java
Android打工仔11 小时前
不要再把 Flow 当作一个容器
android·kotlin