Andorid性能优化(八) 之 网络请求优化

1 前言

移动互联网蓬勃发展的今天,我们手机上的几乎所有App都是需要联网的。而手机硬件的增强和价格低兼以及运营商流量费用降低和提速,使得用户对网络请求的等待和流量消耗的敏感度也在下降。虽然如此,但对于一个App本身开发上的网络问题也是不能忽视的,例如总有流量不足的情况下、在网络状态不好的场景下、手机电量不足的时候,一款优秀的App就能明显地看出优势了,所以网络方面的优化, 也是我们的App优化中不可缺少的一个优化项。

2 一次网络请求的过程

研究表明,任何超过一秒钟的延迟都将打断用户的思维顺流状态,带来较差的体验。谷歌开发文档中曾有提到,如何在一秒钟内去渲染一个页面,如下图,这里就很好地解析了一个网络请求中页面的渲染要经过哪些步骤。

第一是 DNS的解析IP,200毫秒

第二是 TCP三次握手的连接,200毫秒

第三是 客户端HTTP的请求服务端并且服务端作出响应,200毫秒

第四是 服务器本身响应也有一定的耗时,200毫秒

第五是 客户端接收到内容进行解析html、css、js等和渲染,200毫秒

以上是一个HTTP的请求,如果是HTTPS请求的话,还会在TCP三次握手连接后增加一次TLS的握手,这样握手的时间就会更长。

3 网络请求优化技巧

3.1 DNS解析优化

DNS预解析

我们如果在做Web页面开发的话,可以考虑进行DNS预解析,预解析其实就是解析当前Web页面中存在不一样的域名,在用户点击行为还没发生之前进行该DNS的预先解析成IP。

直接使用IP地址替换域名

根据具体的业务需求,可以使用IP直连的方式来代替域名的访问方式,或得优先使用IP尝试进行访问,如果访问失败再切换回域名,从而达到更快的网络请求。不过这种行为一般不为建议使用,因为它是不灵活的,而且维护成本也极高。

3.2减少数据传输量

考虑使用Protocol Buffers

Protocol Buffers是Google公司开发的一种数据描述语言,类似于Json / XML能够将结构化数据序列化,可用于数据存储、通信协议等方面。它相较目前常用的Json数据量更小,但是要想使用它的话,客户端需要引用一个几百K的解析库。

考虑使用FlatBuffers

FlatBuffers也是Google公司开发的跨平台序列化工具,它提供了C++/Java/Go/C#接口支持,这是一个注重性能和资源使用的序列化类库。相较于Protocol Buffers,其更适用于移动设备,FlatBuffers提供更高的性能以及更低的资源需求。FlatBuffers的功能和Protocol Buffers很像,他们的最大不同点是在使用具体的数据之前,FlatBuffers不需要解析/解包的过程。同时,在工程中使用时,FlatBuffers的引用比Protocol Buffers方便很多,只需要包含两三个头文件即可。

使用zip进行数据压缩

当我们决定了使用哪一种数据描述语言后,例如目前最常用的Json,我们将其空格移除后,还可以使用zip将其进行一个打包压缩,这样的压缩处理可以大大减小数据体原来的大小从而达到访问速度的提升。例如笔者曾经尝试将一个格式化后的一百多K的Json,通过移除空格后变为只有50K左右,再对其进行zip的打包压缩后就会变成了只有5K的大小。

使用Gzip压缩

http协议上支持Gzip编码,它是一种用来改进WEB应用程序性能的技术,用来减少传输数据量大小,减少传输数据量大小。gzip是高压,可以把文件压缩得更小。但是并不是所有的浏览器都支持gzip,如果客户端支持gzip压缩,响应时对请求的资源进行压缩并返回给客户端,浏览器按照自己的方式解析,在http响应头,我们可以看到content-encoding:gzip,这是指服务端使用了gzip的压缩方式。

图片压缩

使用origin或者guetzli或者tinypng工具都可以很好的对图片进行还原度很高的压缩。

使用WebP格式

同样的照片,采用WebP格式可大幅减少小图片大小和节省流量,可以考虑使用WebP图片格式来代替JPEG或者PNG图片格式。最重要的是使用WebP之后图片质量也没有改变。

3.3减少网络请求或预请求

合并定制网络请求的接口,尽可能地减少请求的次数,能够合并的请求尽量将其合并。

如一些上报逻辑,可以将多次需要上报的数据先存在本地,选择一个合适的时间让其一次性上传。

在手机空闲状态下提前进行一些重要数据的请求,以加强用户体验。

3.4 合理请求,减少重试,避免轮询

1 处于后台时根据具体业务需求,严格限制App处于后台时是否需要继续真的需要数据传输,尽量能够避免无效的数据传输。

2 一定要避免在网络请求失败时,进行无限制的循环重试连接,可以设定一个最大的重连次数,超过次数限制后结束重连,或者等待一段较长时间后再尝试连接。而且在重连前要确保网络正常情况,否则除了没有重试成功,还增加了额外的开消。在一些页面上的请求失败时,可以把请求结果抛给用户让用户根据自身情况确定是否需要重新请求。

3 正常业务功能上也应该避免轮询向服务端发起网络请求。要确定好数据传输的频率,避免冗余重复的数据传输。或者使用推送来替换的尽量使用推送。

3.5 使用缓存

对于类似图片、文件等数据,可以使用内存缓存加磁盘缓存策略机制。在Android中,典型的是使用LruCache实现内存缓存和使用DiskLruCache实现磁盘缓存。或者使用比较成熟的开源框架进行有效的网络请求和缓存处理。

3.6 针对不同网络类型处理

在图片请求前,可以先获取当前网络类型,如果是Wifi的话,就尽情享受高清图片带来的高级体验,如果是4G网络情况下就选择标准清晰的图片下发,如果是2/3G网络情况下,可以考虑下发清晰度较差的图片以达到正常使用优先。

4 使用工具监听网络

4.1 Charles

Charles是一款功能强大的网络监听工具,只要将手机和电脑连接到同一网络下,对其进行一些相应的代理设置,便可以通过电脑中来对手机请求数据进行抓包处理。操作步骤如下:

第一步,打开Proxy Settings窗口。

第二步,勾上Enable transparent HTTP proxying选项,并设置端口号,这里默认是8888。

第三步,在手机Wifi选择中输入电脑上的IP地址以及刚才设置的端口号,然后确定。

第四步,手机操作完毕后,此时电脑中便会弹出如下对话框,选择“Allow”充许即可。

4.2 Network Profiler

Android Stuido 3.0后自带的Network Profiler 能够在时间线上显示实时网络 Activity,包括发送和接收的数据以及当前的连接数。 这便于你查看应用传输数据的方式和时间,并据此对底层代码进行适当优化。如官网上图:

https://developer.android.google.cn/studio/images/profile/networkprofiler_2x.png

4.3 设置虚拟机网络参数来拟机弱网络

用户的环境是无法预知的复杂,所以除了正常的网络优化, 我们还需考虑到弱网情况下App的表现。通过虚拟机“Cellular”项可以对网络参数进行一个设置,来达到模拟出一个弱网络来进行相应的测试。如下图:

其中,Network type是网络的类型;Signal strength是信号强度;Voice status是语音状态;Data status是数据状态。根据需要对它们进行相应的选项即可。

 

 

 

发布了106 篇原创文章 · 获赞 37 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/lyz_zyx/article/details/88324777