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 对象就不会被回收。
解决办法:app

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

待完善...ide

集合类,使用后没有释放

集合使用完,清空。布局

资源对象使用后未关闭
  • 广播没有注销
  • 文件流未关闭
  • 数据库游标没有关闭
  • 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 绘图(这个学习成本高)。

相关文章
相关标签/搜索