乐趣区

关于android: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 绘图(这个学习老本高)。

退出移动版