Android 性能优化专题
性能优化全攻略
1. 渲染性能
过度绘制(Overdraw)
- 开启:开发者选项 → 调试 GPU 过度绘制
- 蓝色=1x,绿色=2x,粉色=3x,红色=4x+(红色区域需优化)
- 方案:移除不必要的背景色,减少布局层级,使用
clipRect限制绘制区域
布局优化
- 使用
ConstraintLayout替代嵌套 LinearLayout,减少层级 include/merge/ViewStub复用和延迟加载布局- 使用
Hierarchy Viewer/Layout Inspector分析布局层级
列表优化
- RecyclerView:合理设置
ViewHolder复用 DiffUtil.Callback精准局部刷新,避免notifyDataSetChangedsetHasFixedSize(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 按比例采样