Android性能调优 - 网络优化

Android性能调优 - 网络优化

1.前言

  • 在移动互联网的快速发展环境下,手机用户日益对网络的使用或体验有着更深度的诉求,因此应用中的网络体验已经显得由此重要,而背后对开发者在网络性能有更高的要求。
  • 网络影响:
    1.最直观的就是用户交互体验
    2.流量的流失;
    3.电量的消耗;
  • 本文从连接、传输、监控 三个维度提出相关的优化。
  • 文章中实例 linhaojian的Github

2.HTTP请求过程

Android性能调优 - 网络优化

  • 通过上图可以很清楚的理解HTTP协议的请求过程:
    1.客户端输入域名,通过浏览器请求发送
    2.通过DNS解析域名,得到真正需要请求的服务器IP地址
    3.服务端接收到请求内容之后,做出响应
    (HTTP使用Socket构建基于TCP/IP协议的通讯)
  • 因此我们就可以针对上述流程总结可优化2个方向:连接、传输

3.连接

3.1 网络状态

  • 可以根据不同的网络状态(2G、3G、4G、Wifi)针对性的提供处理策略。

3.2 弱网处理

  • 弱网的影响:存在较多的丢包、误码、超时、连接中断以及难以接入网络等情况;
  • 针对弱网情况,可做一下优化:
    1.失败重试: 可在Retrofit等网络框架添加拦截器,实现失败重试;

3.3 IP直连

  • 优点:能减少DNS的域名解析过程,从而提升连接或请求的速度。
  • 缺点:IP暴露,不安全。

3.4 HttpDns

  • 出自:是阿里研发的产品HttpDns
  • 作用:使用HTTP协议进行域名解析,代替现有基于UDP的DNS协议,域名解析请求直接发送到阿里云的HTTPDNS服务器,从而绕过运营商的Local DNS,能够避免Local DNS造成的域名劫持问题和调度不精准问题;

3.5 Http1.0、Http1.1、Http2.0

  • 影响HTTP网络请求主要是 带宽延迟
  • Http1.0每个TCP连接只能发送一个请求。发送数据完毕,连接就关闭,如果还要请求其他资源,就必须再新建一个连接,每次请求连接都需要3次握手,连接成本较高,性能较差。
  • Http1.1
    * 持久连接: 即TCP连接默认不关闭,可以被多个请求复用(对于同一个域名,大多数浏览器允许同时建立6个持久连接);
    * 管道机制: 即在同一个TCP连接里面,客户端可以同时发送多个请求,举例:需要发送2个请求,以前HTTP1.0的做法是请求一次需要等等响应,再请求第二次类似于一问一答,而HTTP1.1就支持同时请求,之后按序响应;
    * 缺点:队头阻塞,上述已说明HTTP1.1的TCP连接复用响应按序的,那么在多个请求使用同一个TCP连接的时候,一个响应的特别慢的时候,会影响后续的响应速度。
  • Http2.0
    * 降低延迟: 路复用通过多个请求stream共享一个tcp连接的方式,解决了HOL blocking的问题,降低了延迟同时提高了带宽的利用率。
    * 请求优先级: 多路复用带来一个新的问题是,在连接共享的基础之上有可能会导致关键请求被阻塞。SPDY允许给每个request设置优先级,这样重要的请求就会优先得到响应。
    * header压缩: 前面提到HTTP1.x的header很多时候都是重复多余的。选择合适的压缩算法可以减小包的大小和数量。
    * 数据传输: HTTP/2采用二进制格式而非文本格式。

3.6 连接复用

  • 根据相同的HOST请求,可以设计连接的缓存,实现连接池进行复用。例如:OkHttp中的Dispatcher

4.传输

4.1 Protocol Buffers

  • 定义:Protocol Buffers 和 XML、JSON一样都是结构数据序列化的工具。
  • 作用:通过将结构化的数据(拥有多种属性)进行序列化,从而实现**数据存储和交换的功能 **。
  • 优点:在传输数据量较大的需求场景下,Protocol Buffer 比 XML、JSON 更小(3到10倍)、更快(20到100倍)、使用 & 维护更简单;而且 Protocol Buffer 可以跨平台、跨语音使用。

4.2 Gzip

  • 定义:在 http/1.0 协议中关于服务端发送的数据可以配置一个 Content-Encoding 字段,这个字段用于说明数据的压缩方法。(Content-Encoding:gizp、Accept-Encoding: gzip)

4.3 网络缓存

  • 网络缓存:提供一种将数据存储到本地的思想,实现减少服务器的请求负荷、加快请求速度、无网也能显示内容。例如:OkHttp的缓存机制(强制缓存对比缓存)。

强制缓存:在缓存数据未失效的情况下,可以直接使用缓存数据,由两个字段Expires和Cache-Control用于标明失效规则。
对比缓存:表示需要和服务端进行相关信息的对比,由服务器决定是使用缓存还是最新内容,如果服务器判定使用缓存,返回响应吗304,判定使用最新内容,则返回响应码200和最新数据(ETag和If-None-Match)。

4.4 图片传输

1.可通过Webp的图片格式传输。
2.可实现图片缓存机制(`二级缓存:Lrucache;DisLrucache等`)。

4.5 预加载

  • 在设计业务请求时,可合理的设计 数据提前加载 的方式,提升用户的体验。

5.监控

5.1 Android Profiler

Android性能调优 - 网络优化

  • Receiving:表示下行流量, 即下载接收;
  • Sending:表示上行流量, 即上传发送;

5.2 Stetho

  • Stetho 是Facebook开源的Andorid调试工具。当你的应用集成Stetho时,开发者可以访问Chrome,在Chrome Developer Tools中查看应用布局,网络请求,sqlite,preference等等,可视化一切应用操作(更重要的是不用root)。Android性能调优 - 网络优化
    Android性能调优 - 网络优化

5.总结

  • 到此,网络优化 介绍完毕。
  • 如果喜欢我的分享,可以点击 关注 或者 ,你们支持是我分享的最大动力 。
  • linhaojian的Github

欢迎关注linhaojian_****博客或者linhaojian_简书

不定期分享关于安卓开发的干货。


写技术文章初心

  • 技术知识积累
  • 技术知识巩固
  • 技术知识分享
  • 技术知识交流