首页 文章详情

Android的网络通信该如何优化

Carson带你学习Android | 411 2021-01-17 13:07 0 0 0
UniSMS (合一短信)

本文将以OkHttp为例,描述Android网络通信的一般优化手段,主要包括:

  1. DNS优化
  2. 缓存控制
  3. 协议选择优化

方式1:DNS优化

1.1 背景

一个Http请求在建立Tcp连接的过程中,肯定会产生一次DNS

1.2 优化思路

通过内存缓存的方式,通过一个HashMap持有该Host的IP列表;当下次发起Tcp连接时,可直接用内存中的这个Ip,而不需要再去走一遍Dns服务。

1.3 具体实践

若你的网络层用的是OkHttp,其内部提供了Dns的接口,可以让外部在构造Client的时候传入。

class HttpDns : Dns {

    private val cacheHost = hashMapOf<String, InetAddress>()

    override fun lookup(hostname: String): MutableList<InetAddress> {
        if (cacheHost.containsKey(hostname)) {
            cacheHost[hostname]?.apply {
                return mutableListOf(this)
            }
        }
        return try {
            InetAddress.getAllByName(hostname)?.first()?.apply {
                cacheHost[hostname] = this
            }
            mutableListOf(*InetAddress.getAllByName(hostname))
        } catch (e: NullPointerException) {
            val unknownHostException =
                UnknownHostException("Broken system behaviour for dns lookup of $hostname")
            unknownHostException.initCause(e)
            throw unknownHostException
        }
    }
}

特别注意:针对iOS开发,一定要注意SNI(Server Name Indication):即一个IP对应多个多个Https证书的问题,具体请看文章:https://blog.csdn.net/firefile/article/details/80532161


方式2:缓存控制(CacheControl)

2.1 优化思路

通过CacheControl可以让后端直接控制请求内容的缓存策略。在http中,控制缓存开关的字段有两个:Pragma 和 Cache-Control。下面介绍一些缓存参数:

2.2 具体实例

以使用OkHttp为例,通过添加OkHttp拦截器的方式给网络请求添加一个统一的CacheControl。如果有定制化的缓存策略,是需要自己作为额外开发,具体可以参考:https://github.com/yale8848/RetrofitCache


方式3:协议选择优化

3.1 升级接口协议版本

客户端跟后台协商升级接口协议版本:Http 1.0 - 1.1 - 1.X - 2.0,可以明显提升你的网络请求响应性能,具体优化如下:

  • 长连接,HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理,在一个TCP连接上可以传送多个HTTP请求和响应,减少了建立和关闭连接的消耗和延迟,在HTTP1.1中默认开启Connection:keep-alive,一定程度上弥补了HTTP1.0每次请求都要创建连接的缺点。

  • header压缩,如上文中所言,对前面提到过HTTP1.x的header带有大量信息,而且每次都要重复发送,HTTP2.0使用encoder来减少需要传输的header大小,通讯双方各自cache一份header fields表,既避免了重复header的传输,又减小了需要传输的大小。

  • 新的二进制格式(Binary Format),HTTP1.x的解析是基于文本。基于文本协议的格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然很多,二进制则不同,只认0和1的组合。基于这种考虑HTTP2.0的协议解析决定采用二进制格式,实现方便且健壮。

  • 多路复用(MultiPlexing),即连接共享,即每一个request都是是用作连接共享机制的。一个request对应一个id,这样一个连接上可以有多个request,每个连接的request可以随机的混杂在一起,接收方可以根据request的 id将request再归属到各自不同的服务端请求里面。

3.2 使用GPRC协议

GPRC协议的传输内容直接使用的protobuf格式,该格式的优点是:

  • 体积小:序列化后,数据大小可缩小约3倍;
  • 序列化速度快:比xml、json快20-100倍;
  • 传输速度快:因为体积小,所以传输起来带宽和速度会有所优化。
  • 使用范围广:跨平台、跨语言、拓展性好。

总结:protobuf格式 更小、更快、使用更广泛。

至此,关于Android网络通信的一般优化手段讲解完毕。



「Carson每天带你学习一个Android知识点」,长按扫描关注公众号,我们明天见哦!


最后福利:学习资料赠送

  • 福利:由本人亲自撰写 & 整理的「Android学习方法资料」
  • 数量:10名
  • 参与方式:「点击文章右下角”在看“ -> 回复截图到公众号 即可,我将从中随机抽取」

    点击“在看”就能升职 & 加薪水哦!



good-icon 0
favorite-icon 0
收藏
回复数量: 0
    暂无评论~~
    Ctrl+Enter