Android 性能优化篇

本篇从多个部分分析性能优化(更新中。。。):

  • 崩溃优化
  • 存储优化
  • 内存优化
  • 卡顿优化
  • 启动优化
  • IO 优化
  • 网络优化
  • 耗电优化
  • UI 优化
  • 包体积优化

内存优化

常见的内存问题:内存泄漏 + OOM(内存溢出)
内存泄漏:对象使用完没有释放,也就是内存不再使用了但是 GC 却不回收。
OOM:内存占用超过了 Android 系统给 app 分配的最大内存。

其中,内存泄漏如果一直增大也会造成 OOM。

内存泄漏

会造成:卡顿
原因有:

  1. 代码中出现了 GC Root。GC 不会回收被 GC Root 直接或者间接引用的对象。
  2. 集合类,使用后没有释放。
  3. 资源对象使用后未关闭
常见的 GC Root:
  • 运行中的线程
  • 静态对象
  • native 对象指向的引用
运行中的线程

如线程、AsyncTask、Handler 持有了 Activity 引用,当 Activity 销毁时,线程任务没有处理完,继续运行。那么 Activity 对象就不会被回收。
解决办法:

  1. 给线程设置终止条件,当持有的 Activity 销毁时,停止线程。
  2. 将线程声明为 static。
  3. Activity 销毁时,handler 清空消息队列,不再处理未处理的消息了。
静态对象

待完善...

集合类,使用后没有释放

集合使用完,清空。

资源对象使用后未关闭
  • 广播没有注销
  • 文件流未关闭
  • 数据库游标没有关闭
  • Bitmap 没有回收
  • 无线循环动画没有停止

OOM

除了内存泄漏会造成 OOM,部分低端设备内存小,Bitmap 也是一个常见原因。尽可能减少 Bitmap 的内存占用。

解决办法
  • 设备分级
  • Bitmap 优化
设备分级

对于低端设备,可以关闭复杂的动画、使用 565 格式图片、使用更小的缓存。
设备分级策略:device-year-class 会根据手机的内存、CPU 核心数和频率等信息决定设备属于哪一个年份。

Bitmap 优化
  • 使用完释放
  • 根据分辨率,缩放图片
  • 按需选择合适的解码方式
  • 对图片进行缓存

对图片进行缓存

三级缓存机制:内存缓存、本地缓存、网络缓存。

使用 Glide 库加载图片,Glide 对处理图片做了很多方面优化(LruCahce、DiskLruCache、生命周期集成、Bitmap 复用和主动回收等);


UI 优化

  • 降低 view.onDraw() 的复杂度
  • 避免过度绘制
  • 其他优化方案

降低 view.onDraw() 的复杂度

  1. 不要创建新的局部变量,因为 onDraw() 可能会被频繁调用,导致频繁 GC,降低程序执行效率
  2. onDraw() 避免执行大量耗时操作,Google 官方性能标准 View 的最佳绘制频率 = 60fps,每帧绘制 < 16ms

避免过度绘制

屏幕上某个像素,在同一帧的时间内,被绘制多次。

  1. 降低嵌套层级,使用约束布局。
  2. 移除控件中不必要的背景

其他优化方案

使用 OpenGL 绘图(这个学习成本高)。

你可能感兴趣的:(android性能优化)