本篇从多个局部剖析性能优化(更新中。。。):
- 解体优化
- 存储优化
- 内存优化
- 卡顿优化
- 启动优化
- IO 优化
- 网络优化
- 耗电优化
- UI 优化
- 包体积优化
内存优化
常见的内存问题:内存透露 + OOM(内存溢出)。
内存透露:对象应用完没有开释,也就是内存不再应用了然而 GC 却不回收。
OOM:内存占用超过了 Android 零碎给 app 调配的最大内存。
其中,内存透露如果始终增大也会造成 OOM。
内存透露
会造成:卡顿
起因有:
- 代码中呈现了 GC Root。GC 不会回收被 GC Root 间接或者间接援用的对象。
- 汇合类,应用后没有开释。
- 资源对象应用后未敞开
常见的 GC Root:
- 运行中的线程
- 动态对象
- native 对象指向的援用
运行中的线程
如线程、AsyncTask、Handler 持有了 Activity 援用,当 Activity 销毁时,线程工作没有解决完,持续运行。那么 Activity 对象就不会被回收。
解决办法:
- 给线程设置终止条件,当持有的 Activity 销毁时,进行线程。
- 将线程申明为 static。
- Activity 销毁时,handler 清空音讯队列,不再解决未解决的音讯了。
动态对象
待欠缺 …
汇合类,应用后没有开释
汇合应用完,清空。
资源对象应用后未敞开
- 播送没有登记
- 文件流未敞开
- 数据库游标没有敞开
- Bitmap 没有回收
- 无线循环动画没有进行
OOM
除了内存透露会造成 OOM,局部低端设施内存小,Bitmap 也是一个常见起因。尽可能减少 Bitmap 的内存占用。
解决办法
- 设施分级
- Bitmap 优化
设施分级
对于低端设施,能够敞开简单的动画、应用 565 格局图片、应用更小的缓存。
设施分级策略:device-year-class 会依据手机的内存、CPU 外围数和频率等信息决定设施属于哪一个年份。
Bitmap 优化
- 应用完开释
- 依据分辨率,缩放图片
- 按需抉择适合的解码形式
- 对图片进行缓存
对图片进行缓存
三级缓存机制:内存缓存、本地缓存、网络缓存。
应用 Glide 库加载图片,Glide 对解决图片做了很多方面优化(LruCahce、DiskLruCache、生命周期集成、Bitmap 复用和被动回收等);
UI 优化
- 升高 view.onDraw() 的复杂度
- 防止适度绘制
- 其余优化计划
升高 view.onDraw() 的复杂度
- 不要创立新的局部变量,因为 onDraw() 可能会被频繁调用,导致频繁 GC,升高程序执行效率
- onDraw() 防止执行大量耗时操作,Google 官网性能规范 View 的最佳绘制频率 = 60fps,每帧绘制 < 16ms
防止适度绘制
屏幕上某个像素,在同一帧的工夫内,被绘制屡次。
- 升高嵌套层级,应用束缚布局。
- 移除控件中不必要的背景
其余优化计划
应用 OpenGL 绘图(这个学习老本高)。