Android比较实用的性能优化
1.稳定性(解决内存溢出、崩溃等问题),内存优化
(1)Memory Monitor 工具:
(2)Memory Analyzer 工具:
(a)屏幕多次翻转,出现内存持续增高时。点击 Dump java Heap就会生成运行内存快照hprof文件。
(b)然后将APP完全退出,重新启动,打开Android Monitor 再次点击Dump java Heap 生成一份还没操作(旋转屏幕)前的内存快照hprof文件。现在就已经生成好了2份hprof文件, 一份是没有旋转过屏幕的 ,一份是旋转过屏幕多次的。
(c)然后选中Android Studio 最左边的Captures 进行将hprof文件导出。导出的时候需要选择保存的目录以及文件名。
(d)打开MAT ,导入我们的2个hprof文件 Open File-->选择文件-->Leak Suspects Report-->Finish
可以通过检索包名,查看某个类的实例个数和所在内存数据,还可以查看被引用的内存数据。
Objects:实例个数
Shallow Heap:所占内存大小
Retained Heap:释放后能回收多少内存
(3)LeakCanary工具:
简单,傻瓜式操作。可以在GitHup官网查阅,我们可以在Gradle文件里添加依赖。这个工具是Square公司在Github开源的。行业内不是有一句话嘛,Square出品必属精品,主流的库像okhttp、Picasso、retrofit、Dagger等都出自Square之手。说到这不得不让我联想到一位在Android开发领域神一般存在的人物,他就是大名鼎鼎的Jake Wharton(杰克.沃顿),ButterKnife的创造者,也参与贡献了Retrofit, okhttp等。
(4)Android Lint 工具:
小结
2.流畅性(卡顿优化)
- 界面绘制:主要原因是绘制的层级深、页面复杂、刷新不合理,由于这些原因导致卡顿的场景更多出现在 UI 和启动后的初始界面以及跳转到页面的绘制上。
- 数据处理:导致这种卡顿场景的原因是数据处理量太大,一般分为三种情况,一是数据在处理 UI 线程,二是数据处理占用 CPU 高,导致主线程拿不到,三是内存增加导致 GC 频繁,从而引起卡顿。
分析UI卡顿:
我们知道Android的绘制步骤是:Measure、Layout、Draw,所以布局的层级越深、元素越多、耗时也就越长。还有就是Android操作系统每隔 16ms 发出 信号,触发对 UI 进行渲染,如果每次渲染都成功,这样就能够达到流畅的画面所需的 60FPS。如果某个操作花费的时间是 24ms ,系统在得到 VSYNC 信号时就无法正常进行正常渲染,这样就发生了丢帧现象。那么用户在 32ms 内看到的会是同一帧画面,无法在 16ms 完成渲染,最终引起刷新不及时。
总结以上,两个根本原因:1、绘制任务太重,绘制一帧内容耗时太长;2、主线程太忙,根据系统传递过来的 VSYNC 信号来时,还没准备好数据,导致丢帧。
(1)布局优化
- 布局复用,使用<include>标签重用layout;
- 提高显示速度,使用<>延迟View加载;
- 减少层级,使用<>标签替换父级布局;
-
注意使用wrap_content,会增加measure计算成本;
-
删除控件中无用属性;
(2)绘制优化
-
布局上的优化。移除 XML 中非必须的背景,移除 Window 默认的背景、按需显示占位背景图片
-
自定义View优化。使用 帮助系统识别那些可见的区域,只有在这个区域内才会被绘制。
(3)启动优化
应用一般都有闪屏页SplashActivity,优化闪屏页的 UI 布局,可以通过 检测丢帧情况。
(另外,还可以IDE自带的一款UI绘制检测图形化数据分析工具 Systrace ,4.0版本以上版本可以使用。)
闪屏页的存在可以说就是启动优化,通常在闪屏页延迟2秒跳转到主界面,但是在进入首页的时候,首页复杂的View渲染以及必须在UI线程执行的业务逻辑,必然拖慢了启动速度。启动闪屏页虽然简单执行快,首页却复杂执行慢,应用启动前轻后重。
所以要启动加载逻辑优化。可以采用分布加载、异步加载、延期加载策略来提高应用启动速。例如,把SplashActivity改成SplashFragment,应用程序的入口变成MainActivity,在MainActivity中先展示SplashFragment,显示完毕后再移除SplashFragment。这样,在SplashFragment的2S的友好时间内进行数据准备的同时,首页的View就能够被加载,首页的业务逻辑就能够被执行。在闪屏页窗口加载完毕后,我们加载activity_main的布局,考虑到这个布局有可能比较复杂,耽误View的解析时间,可以采用ViewStub的形式进行懒加载。
(4)刷新优化
- 减少刷新次数;
- 缩小刷新区域;
(5)动画优化
需要实现动画效果时,需要根据不同场景选择合适的来实现。有些情况下,可以用硬件加速方式来提供流畅度降低动画卡顿。
3.耗损(耗电、流量消耗)
3.1耗电优化
在 Android5.0 以前,关于应用电量消耗的测试即麻烦又不准确,而5.0 之后Google专门引入了一个获取设备上电量消耗信息的API—— Battery Historian。Battery Historian 是一款由 Google 提供的 Android 系统电量分析工具,直观地展示出手机的电量消耗过程,通过输入电量分析文件,显示消耗情况。
最后提供一些可供参考耗电优化的方法: