跳到主要内容

Android 性能优化专题

性能优化全攻略

1. 渲染性能

过度绘制(Overdraw)

  • 开启:开发者选项 → 调试 GPU 过度绘制
  • 蓝色=1x,绿色=2x,粉色=3x,红色=4x+(红色区域需优化)
  • 方案:移除不必要的背景色,减少布局层级,使用 clipRect 限制绘制区域

布局优化

  • 使用 ConstraintLayout 替代嵌套 LinearLayout,减少层级
  • include / merge / ViewStub 复用和延迟加载布局
  • 使用 Hierarchy Viewer / Layout Inspector 分析布局层级

列表优化

  • RecyclerView:合理设置 ViewHolder 复用
  • DiffUtil.Callback 精准局部刷新,避免 notifyDataSetChanged
  • setHasFixedSize(true):item 大小固定时跳过 requestLayout
  • 预取:RecyclerView.setItemViewCacheSize + RecycledViewPool

2. 启动优化

启动类型

  • 冷启动:进程从零开始(最慢,重点优化)
  • 温启动:进程存在,Activity 需重建
  • 热启动:Activity 在后台,直接前台

冷启动优化

  • Application onCreate 中异步初始化三方库(WorkManager / 协程)
  • 减少主线程耗时操作(SP 改 MMKV,IO 操作移至子线程)
  • 使用 SplashScreen API(Android 12+)
  • 启动页 windowBackground 设为占位图,消除白屏

测量工具

adb shell am start -W com.example/.MainActivity
# ThisTime: 此次 Activity 启动时间
# TotalTime: 整个启动过程时间

3. 内存优化

  • Bitmap 优化inSampleSize 压缩,RGB_565 替代 ARGB_8888(省一半内存)
  • 内存泄漏检测:LeakCanary 自动检测,adb shell dumpsys meminfo 分析
  • 内存抖动:避免在 onDraw/循环中创建对象,使用对象池
  • LruCache:内存缓存图片,基于最近最少使用淘汰

4. 电量与网络优化

  • Doze 模式:系统限制后台网络/CPU,使用 WorkManager 适配
  • 批量网络请求:合并请求减少无线电激活次数
  • 图片格式:WebP 替代 PNG/JPEG,体积减少约 30%
  • HTTP/2:多路复用减少连接建立开销
  • OkHttp 缓存:离线可用 + 减少重复请求

5. ANR 排查

# 查看 ANR 日志
adb pull /data/anr/traces.txt

# 常见原因
# 1. 主线程 IO(网络/磁盘)
# 2. 主线程等待锁
# 3. Binder 调用耗时(跨进程)
# 4. 主线程处理大量 Message
  • StrictMode 开发期检测主线程 IO
  • Systrace / Perfetto 分析线程状态和方法耗时

6. 高频面试题

  • 如何检测内存泄漏? LeakCanary + MAT(Memory Analyzer Tool)分析 heap dump
  • 卡顿原理是什么? 主线程一帧(16.6ms)内未完成 measure/layout/draw
  • 为什么不能在子线程更新 UI? ViewRootImpl 检查线程,invalidate 触发检查
  • Bitmap 如何高效加载大图? BitmapFactory.Options.inSampleSize 按比例采样