Android性能优化大纲
Android性能优化是开发者必须掌握的知识,因为已经有很多文章写Android性能优化的方方面面,因此,本文只做纲领性的阐述,指出Android哪些方面可以优化,限于笔者经验有限,如有不足请留言指出。
一. Android性能优化的目标
说一千,道一万,Android性能优化无非跟下面4个方面有关,而前4个因素或多或少和电量优化联系起来。
- 提升响应速度
- 提升UI运行(渲染)速度
- 减少内存占用
- 使用更少的网络流量
- 消耗更少的电量
二. 提升响应速度
对于App开发者来说,系统层面的事我们很难插手,因此只能从APP的编写入手提升性能。
Android系统中规定了,Activity在5S之内没有响应,就会ANR,而在实际工程中,5s已经是一个很长的时间了,以下是相关研究机构调查得出的响应时间标准。正常的响应时间应当在0~2000ms以内。
从大多数意义上来说,响应速度慢就是做了耗时操作,因此解决方法有3个:
其一是给出一个“伪” 响应,做一些耗时操作后,立即给出一个响应,比如一个转动的圆圈;或者是假装该操作已经完成,其实在后台慢慢干。这种方法比较多,仁者见仁,智者见智了。
其二,在异步线程中做耗时操作(这个在Android中基本上是必须的)。
其三,通过好的数据结构、算法将耗时操作简化。
常见的有可能发生“ANR”操作有哪些呢?
网络访问
大量数据读写
数据库操作
硬件操作(比如camera)
加载大图片
调用thread的join()方法、sleep()方法、wait()方法或者等待线程锁,导致主线程等待超时,总之,多线程之间的操作要小心。
二、提升UI渲染速度
人眼对于屏幕的渲染速度是有要求的,Android中把达到这种流畅的帧率规定为60fps。这个速度换算一下约等于 16.67ms/每帧,意味着,绘制一帧图像最多耗费 16ms,如果超过这个数,则会掉帧,从而用户感到程序不流畅。
那么,哪些原因会导致UI不流畅呢?
人为在UI线程中做轻微耗时操作(没有ANR),导致UI线程卡顿;
布局Layout过于复杂,无法在16ms内完成渲染;
同一时间动画执行的次数过多,导致CPU或GPU负载过重;
View反复绘制,导致某些像素在同一帧时间内被绘制多次,从而使CPU或GPU负载过重;
View频繁的触发measure、layout,导致measure、layout累计耗时过多及整个View频繁的重新渲染;
内存频繁触发GC过多(同一帧中频繁创建内存,GC会暂停其他线程),导致暂时阻塞渲染操作;
开发者可以做的从两方面入手,其一还是不要做耗时操作,其二是做布局优化,布局优化从以下几点着手:
减少布局的嵌套层数,通过Android Studio的layot Inspector工具随便检查任意一个界面,可以发现Android 默认在你的布局之外包了好几层。因此,不要轻易在布局中嵌套很多层次。布局嵌套层数过多,在某些机型上甚至会造成StackOverflowError。
合理使用merge
合理使用ViewStub
尽量用自定义Drawble代替图片做背景,比如一些纯色、圆角效果就不要用图片了。
去掉不必要的背景色定义。
ListView的优化,主要有View的复用和局部更新技巧。
对于自定义View,不要在它的onDraw()方法中做耗时操作。
使用Android SDK自带的工具hierarchyviewer检查UI渲染性能,它位于SDK目录的这个路径/tools/hierarchyviewer.bat 。通过它可以检测到当前界面中哪些性能较低。
-
还可以通过开发者选项中的GPU过度绘制工具来进行分析。在设置->开发者选项->调试GPU过度绘制,开启后在我们想要调试的应用界面中可以看到各种颜色的区域,具体含义如下:
颜色| 含义 ---|--- 无色| WebView等的渲染区域 蓝色| 1x过度绘制 绿色| 2x过度绘制 淡红色| 3x过度绘制 红色| 4x(+)过度绘制
对于UI布局优化,可以参看这一篇博客 Android UI性能调优
三、 减少内存占用
这个方面,概括来说只有两点:==1. 减少内存的分配 2. 防止内存泄漏==。
一些常见的优化技巧有:
- 如可能,类的成员变量,尤其是静态成员变量,尽量转化为局部变量。
- 选用更好的数据结构,比如使用SparseArray代替HashMap。
- 需要才创建(分配)策略。
- 合理利用Java的软引用、弱引用。
- 在Android组件的OnLowMemory和OnTrimMemory方法中释放无用的内存
- 防止内存泄漏,比如隐蔽的handler、AsyncTask和不当的context持有导致的内存泄漏,以及屏幕旋转导致的内存泄漏。
- 对于图像的内存管理,比如inJustDecodeBounds属性的使用,使用图片缓存池等技巧。 此外,可以使用一些开源框架来进行图片管理,比如Fresco。
四、 减少网络访问
对于很多Android用户来说,流量的消耗是他们颇为在意的一个指标。减少流量消耗的方向有两个:1.减少单次网络访问传递的数据。 2.减少网络访问的次数。
更多详细的的网络优化技巧,请看这一篇 Android 网络优化技巧
五、耗电量优化
首先问一个问题,手机哪些操作会显著消耗电量?
根据相关研究,手机电量主要被消耗在:屏幕、处理器、移动蜂窝网络、WIFI
因此,减少使用上述元器件的操作就可以使APP更省电。
基本上,对电量优化的建议是:
没事不要唤醒手机
尽量不要使用后台Service,当一个安静的美男子
把网络请求合并、或者说是在集中性的时段访问网络。
把一些超级耗时的数据处理逻辑,转移到后台开发那去(少用点CPU)。
少搞一些花哨华而不实的动画效果(别喷我)。