Android设备作为一种移动设备,无论是内存还是CPU的性能都受到了很大的限制,这导致Android程序的性能问题异常突出,对于性能优化提出了更高的要求.
Android性能优化的方面主要包含以下几方面:
- 布局优化
- 绘制优化
- 内存泄漏优化
- 响应速度优化
- ListView/RecycleView及Bitmap优化
- 线程优化
- 其他性能优化及建议
1.布局优化
尽量减少布局文件的层级.
-
如何进行布局优化?
删除布局中无用的控件和层次,有选择地使用性能比较低的ViewGroup.
关于有选择地使用性能比较低的ViewGroup,这就需要我们开发就实际灵活选择了。
例如:如果布局中既可以使用LinearLayout也可以使用RelativeLayout,那么就采用LinearLayout,这是因为RelativeLayout的功能比较复杂,它的布局过程需要花费更多的CPU时间。FrameLayout和LinearLayout一样都是一种简单高效的ViewGroup,因此可以考虑使用它们,但是很多时候单纯通过一个LinearLayout或者FrameLayout无法实现产品效果,需要通过嵌套的方式来完成。这种情况下还是建议采用RelativeLayout,因为ViewGroup的嵌套就相当于增加了布局的层级,同样会降低程序的性能。
-
采用
<include>
标签,<merge>
标签,ViewStub.<include>标签主要用于布局重用。
<merge>
标签一般和<include>
配合使用,可以降低减少布局的层级。ViewStub提供了按需加载的功能,当需要时才会将ViewStub中的布局加载到内存,提高了程序初始化效率。
关于它们的使用方法,参考:Android布局优化之include、merge、ViewStub的使用https://link.jianshu.com/?t=http://www.sunnyang.com/418.html
-
避免过度绘制
过度绘制(Overdraw)描述的是屏幕上的某个像素在同一帧的时间内被绘制了多次。在多层次重叠的 UI 结构里面,如果不可见的 UI 也在做绘制的操作,会导致某些像素区域被绘制了多次,同时也会浪费大量的 CPU 以及 GPU 资源。
如下所示,有些部分在布局时,会被重复绘制。
关于过度绘制产生的一般场景及解决方案,参考:Android 过度绘制优化
2.绘制优化
绘制优化是指View的onDraw方法要避免执行大量的操作,这主要体现在两个方面:
-
onDraw中不要创建新的局部对象。
因为onDraw方法可能会被频繁调用,这样就会在一瞬间产生大量的临时对象,这不仅占用了过多的内存而且还会导致系统更加频繁gc,降低了程序的执行效率。
-
onDraw方法中不要做耗时的任务,也不能执行成千上万次的循环操作,尽管每次循环都很轻量级,但是大量的循环仍然十分抢占CPU的时间片,这会造成View的绘制过程不流畅。
按照Google官方给出的性能优化典范中的标准,View的绘制频率保证60fps是最佳的,这就要求每帧绘制时间不超过16ms(16ms = 1000/60),虽然程序很难保证16ms这个时间,但是尽量降低onDraw方法中的复杂度总是切实有效的。
2.内存泄漏优化
内存泄漏是开发过程中的一个需要重视的问题,但是由于内存泄露问题对开发人员的经验和开发意识有较高的要求,因此也是开发人员最容易犯的错误之一。
内存泄露的优化分为两个方面:
- 在开发过程中避免写出有内存泄漏的代码
- 通过一些分析工具比如MAT来找出潜在的内存泄露,然后解决。
对应于两种不同情况,一个是了解内存泄漏的可能场景以及如何规避,二是怎么查找内存泄漏。
- 那么我们就先了解什么是内存泄漏?这样我们才能知道如何避免。
- 那么我们就先了解什么是内存泄漏?这样我们才能知道如何避免。
网友评论