Android性能优化大纲(自我总结)

Android性能优化是开发者必须掌握的知识,因为已经有很多文章写Android性能优化的方方面面,因此,本文只做纲领性的阐述,指出Android哪些方面可以优化,限于笔者经验有限,如有不足请留言指出。

一. Android性能优化的目标

说一千,道一万,Android性能优化无非跟下面4个方面有关,而前4个因素或多或少和电量优化联系起来。

  • 提升响应速度
  • 提升UI运行(渲染)速度
  • 减少内存占用
  • 使用更少的网络流量
  • 消耗更少的电量

二. 提升响应速度

对于App开发者来说,系统层面的事我们很难插手,因此只能从APP的编写入手提升性能。

Android系统中规定了,Activity在5S之内没有响应,就会ANR,而在实际工程中,5s已经是一个很长的时间了,以下是相关研究机构调查得出的响应时间标准。正常的响应时间应当在0~2000ms以内。

image

从大多数意义上来说,响应速度慢就是做了耗时操作,因此解决方法有3个:

  • 其一是给出一个“伪” 响应,做一些耗时操作后,立即给出一个响应,比如一个转动的圆圈;或者是假装该操作已经完成,其实在后台慢慢干。这种方法比较多,仁者见仁,智者见智了。

  • 其二,在异步线程中做耗时操作(这个在Android中基本上是必须的)。

  • 其三,通过好的数据结构、算法将耗时操作简化。

常见的有可能发生“ANR”操作有哪些呢?

  • 网络访问

  • 大量数据读写

  • 数据库操作

  • 硬件操作(比如camera,打开摄像头的时间可能会很长,勿在主线程直接打开,否则会有概率出ANR)

  • 调用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。
  • 需要才创建(分配)策略。
  • 在Android组件的OnLowMemory和OnTrimMemory方法中释放无用的内存
  • 防止内存泄漏,比如隐蔽的handler和不当的context持有导致的内存泄漏。
  • 对于图像的内存管理,比如inJustDecodeBounds属性的使用,使用图片缓存池等技巧。 此外,可以使用一些开源框架来进行图片管理,比如Fresco。

四、 减少网络访问

对于很多Android用户来说,流量的消耗是他们颇为在意的一个指标。减少流量消耗的方向有两个:1.减少单次网络访问传递的数据。 2.减少网络访问的次数。

更多详细的的网络优化技巧,请看这一篇 Android 网络优化技巧

五、耗电量优化

首先问一个问题,手机哪些操作会显著消耗电量? 根据相关研究,手机电量主要被消耗在:屏幕、处理器、移动蜂窝网络、WIFI

因此,减少使用上述元器件的操作就可以使APP更省电。

基本上,对电量优化的建议是:

  • 没事不要唤醒手机

  • 尽量不要使用后台Service,当一个安静的美男子

  • 把网络请求合并、或者说是在几种集中性的时段访问网络。

  • 把一些超级耗时的数据处理逻辑,转移到后台开发那去(少用点CPU)。

  • 少搞一些花哨华而不实的动画效果(别喷我)。

以上 就是鄙人对于Android优化了一点自我总结,限于有限的经验,所说的不一定是对的,如有错漏请不吝指出,谢谢。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值