Android性能优化

前言

作为一个合格的工程师,不断追求代码和软件的极值是我们Android工程师的,因为手机设备资源有限,相对其他软件更是需要不断的优化,来提高我们的软件的竞争力。

一、图片优化

图片的加载和显示是每个商业的App都无法避免的问题,对于图片重度依赖类App ,例如壁纸应用,图片社交应用,对于图片处理将影响到整个APP用户的体验在了解如何优化图片相关内容之前,我们先要了解Android支持的格式

1.1、 Android 图片的格式

目前Android 平台只支持JPEF、PNG、GIF、BMP、和WebP其中如果使用GIF需要引入第三方的函数库
1.1.1 、JPEG 是一种广泛使用的有损压缩图像标准格式,它不支持透明和多帧动画,一般摄影作品会用
1.1.2、 PNG 是一种无损的压缩图片格式,支持透明通道,由于是无损的所以一般占空间比较大会增大App的体积
1.1.3 、GIF一种古老的图片格式,特点是支持多帧动画
1.1.4 WebP、 是Google在2010年发布它支持有损和无损的压缩,支持透明通道,支持多帧动画,是一种比较理想的图片格式,

2.1、图片的压缩

2.1.1、 无损压缩 ImageOptim是一个无损压缩工具:,它通过有挂PNG压缩参数,移除多的元素数据以及非必须的颜色配置文件等方式,在不牺牲图片的质量的情况下,既减少了PNG图片占用空间又提高了加载速度

2.1.2、有损压缩 ImageAlpha 是 ImageOptim作者开发的 一个有损的PNG压缩工具,相对而言,图片的大小较大的降低,当图片的质量也会受到一定程度的影响,经过这个压缩工具压缩的图片需要经过检查才能上线。

2.1.3、 PNG/JPEG转WebP 如果 你的APP最低支持Android4.0 那么你可以直接使用系统的能力支持WebP 如果你是4.0以下的系统,可以在App中集成第三方类库webp-android-backport 来实现对WebP的支持,根据谷歌的测试,无损压缩后的WenP可以比原来文件少45%的大小

2.1.4、 .9.png 简称.9图是针对Android平台使用的一种特殊的图片格式,可以在指定的位置 拉伸和填充内容,.9图的优点是体积小,拉伸不容易变形,能很好的适配各种机型,

2.2 减少图片内存占用,严格意义上,50KB以上的图片都得注意 简单图标建议用SVG,内存效率都比较高,带来最大的收益,可能比我们花几天时间 去优化代码的效果还好,图片的计算方式为
int momery = higthPixel * widthPixel *config
ARGB_8888:32 bit
RGB_565 :16B
ARGB_4444:16B
ALpha_8:8B

二、 Android 布局优化

2.1 、Include 标签进行布局的共享:
我们在XML文件中编写Android应用的界面的时候,经常遇到不同页面中需要实现相同的布局,这样我们就会写重复的代码,例如每个APP的自定义标题栏,最佳的实践是通过布局抽取出来独立成一XML文件在需要的地方包含进来

2.2、 ViewStub标签实现延迟加载:

ViewStub标签是一个不可视且大小为0的视图,它可以延迟到运行时候才填充,ViewStub标签使用场景在于某个页面需要根据用户交互或者其他条件才显示的视图,例如在网络不可用的情况下要加载一张网络不可用的图片进行显示出来,如果不是用ViewStub,只是把视图隐藏起来,那么它还是会被inflate 且占用一定的资源,如果使用ViewStub的话那么可以在要显示的时候再填充,从而实现延迟加载的目的。

2.3 、merge 标签减少布局层次:
这个标签可以实现减少布局的层次,由于Activity的ContentView的最外层是一个FrameLayout 因此当一个独立的布局最外层是一个FrameLayout的时候,且这个布局不需要设置padding和背景的时候,可以使用后merge来替代FrameLayout 标签,从而减少一层布局,当当前标签被作为另一个布局的子标签的时候,例如标题的布局子标签,我们可以考虑将相对布局替换成Merge来使用

2.4、尽量使用CompoundDrawable :
在LinearLayout中,如果存在相邻的ImageView和TextView的语句,那么一般来说使用Compound drawable合二为一成为一个TextView 或者一个ImageView 可以使用drawableTop 、drawableLefe、drawableRight、 或者 drawableBottom 原来两个View 之间使用的间隔drawablePadding来代替

2.5 强烈推荐ConstraintLayout 因为能减低布局层级,减少View创建数量,提高渲染速度

三、Android网络优化

每个App都要联网对网络的优化可以节省网络的流量,节省电量,还可以提高应用的响应,在Android上可以采取以下的措施来改善应用的网络请求,
3.1 、避免DNS解析: DNS是域名解析系统,将应用所请求的域名URL 和网上的映射表查找对应 Ip地址,这个过程可能会花费数百秒的时间,我们可以用IP直接连接的方式代替域名访问的方式,达到更快的网络请求,使用IP的坏处就是 不够灵活,当一位某些原因Ip地址发生了改变的时候,客户端就访问不了了,因此需要增加动态改变的能力,当Ip方式访问失败的时候切换到域名访问的方式

3.2、合并网络请求:一次完整的HTTP请求首先要经过TCP三次握手,建立连接如果是HTTPS请求的话那么还需要TLS握手成功后才能建立连接,因此对于网络请求应该尽量减少请求的接口,能够合并的网络请求就应该尽量去合并请求

3.3、预先获取的数据能够将网络请求集中一次在一次:,这样在其他时间段手机就可以切换到空闲状态,从而避免了经常性的唤醒和空闲,起到节省电量的作用

3.4、避免轮询: 轮询是指客户端每隔一段时间就请求网络, 如果存在数据就拉取,没有的话就等待下一次轮询,一般的情况下不建议用去轮询操作,能使用推送的就用推送的方式这样比较省电,就算要轮询也建议用AlarmManager的方式来实现轮询,AlarmManager可以保证在系统休眠的时候CPU得到休眠,在下一次发起网络请求的时候才唤醒

3.5 、优化重连机制: 尽量减少网络请求失败的时候无限循环尝试重新连接,可以设置一个最大的连接次数,超时或者超过限制就将结束重新连接,等待一个比较长的时间再连接,或者把这个问题抛给用户,让用户决定是否应该重新连接。

离线缓存的问题: 对于图片,文件等数据,可以使用内缓存和外缓存的方式实现二级缓存,当在缓存中命中对应的文件的时候,那么直接从缓存中读取,无须走网络请求,节省了流量,在Android中最典型的就是 使用LruCache实现内缓存,DiskLruCahce实现外缓存,对于图片,已经有很多开源的框架可以选择

3.6 、压缩数据的大小:
从节省网络流量和提高响应度的方面出发我们需要减少网络上的数据传输,对于客户端来说,可以对发送给服务端的数据进行压缩,同时,可以选用更优的数据传输格式

3.7. 不同的网络环境选用不同的超时策略:

应用中应该根据当前的网络类型设置不同的网络超时时间,常见的网络类型有2g ,3g,4g,wifi 为了实现更新当前网络类型,可以提通过服务拿到最新的网络状态类型,根据并调整

3.8 CDN的使用:
CDN 全称是内容分发网络,它的基本思想是尽可能避开网络上可能影响数据传输速度和稳定性的环节,从而实现更快,更稳定的数据传输,CDN加速可以缓解电信核心网络延迟带来的影响。

四、内存优化

4.1.避免频繁创建对象

核心点:

  • 别忽视编辑器的提示! - 避免在循环中创建对象
    在这里插入图片描述

4.2 使用合适的数据结构

简单经验,结合数据特诊和访问方式选择数据结构:
1、字节码操作:数组
2、高查询效率、缓存:Map
3、普通数据集合:List

4.3 注意有生命周期的注销

在这里插入图片描述

4.4 Activity/Fragment泄露

在这里插入图片描述

➢ 一定要牢记Activity的生命周期,记得remove喔
➢ 快乐使用Kotlin+协程
➢ Android Jetpack真香,Lifecycles+LiveData+ViewModel搞起来!

4.5谨慎使用第三方Library

重点关注:

  • library大小问题
  • 是否有移动设备特殊优化的版本

4.6 解决内存泄露问题(必须,可以使用LeakCanary)–比 内存占用大还要严重

在这里插入图片描述

4.7 解决内存抖动问题(必须)

在这里插入图片描述

4.dumpsys meminfo

在这里插入图片描述

建议: 日常开发–做好项目实践和简单的内存分析即可 做到极致–深入的内存分析必不可少

五、卡顿检测

5.1 Android渲染的机制

在这里插入图片描述
Butter Plan : Vsync + TripleBuffer + Choreographer

执行 doFrame 函数。按序执行(取关键)
CALLBACK_INPUT、(输入)
CALLBACK_ANIMATION、(动画)
CALLBACK_TRAVERSAL(绘制)

最终要达到的目的就是:稳定的帧率
帧率波动会让人产生卡顿的感觉

在这里插入图片描述

FrameTime 超出一个垂直同步信号周期,即「掉帧」,结果会引起帧率波动.

所以帧率不是越高越好,那么如何来衡量波动呢?

更直观的维度:掉帧程度

即在设定时间周期内,对不同的掉帧次数进行统计

• 受 Vsync 指挥的 Choreographer 起到重要的承上启下的作用

• 无法单靠 FPS 来衡量流畅度,掉帧程度能描绘更直观可靠的波动

5.2 卡顿检测

只要存在界面刷新,CPU 一定有反应

SysTrace,强大的性能分析工具:
• 基于 Linux Kernel 的 ftrace,性能损耗小
• Framework 定义了 Trace 类,允许自定义 Label,native 层也能支持
• 能捕获到整个系统层面的性能信息,友好展示掉帧提醒

SysTrace 原理:
在系统各个层面的关键链路插入起始的 Label,来确定某个核心过程的执行时间
具体的Systrace使用可以参考

https://zhuanlan.zhihu.com/p/27331842

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值