Android性能优化之网络篇
android的网络优化主要从3个方面考虑:访问速度,流量大小和成功率, 权衡的因素包括电量损耗和空间损耗。
主要优化点:
1. 提前唤醒硬件并让其一直处于状态
一个网络访问,不管是wifi还是4G/3G/2G,都需要通过硬件的参与,当一个网络请求发送时,需要让你的手机处于Active状态,这个网络请求才能跑的通,据统计3G下这个硬件的唤醒消耗时间在500 ~ 2500ms之间,4G在50 ~ 100ms之间,wifi的硬件跟4G/3G/2G不一样,延迟是比较低。可提前唤醒手机,并使其一直处于唤醒状态,这样做缺点是比较耗电。
2. 直接使用IP,不使用域名
一般一个域名的首次解析耗时80 ~ 200ms,而且DNS解析失败也是网络异常比较常见的一种,直接使用IP可以避免这些问题,另外如果直接使用IP连接,还可以防止域名劫持。从安全角度考虑,可以维护一个动态更新的 IP 列表,并在 IP 不可用情况下通过域名访问。
3. 连接复用
在解析出IP后,客户端连接服务器需要经过3次TCP握手,这个过程大约耗时80 ~ 200ms,现在大部分都是Https,所以还要经过TLS握手,这个过程又需要耗时80 ~ 400毫秒,所以我们要尽可能使用链路复用,减少握手次数,同时还可以适当减少流量。这个方面OkHttp已经做了优化。
4. 数据压缩
数据压缩主要是为了节省流流量,包括body的压缩,Header信息的压缩等。例如OkHttp默认使用的就是Gzip压缩,Header信息压缩在Http 1.1 不支持,在SPDY 及 Http 2.0 支持。 Http 1.1 可以通过服务端对前一个请求的请求头进行缓存,后面相同请求头用 md5 之类的 id 来表示即可。
5. 请求合并
合理地合并网络请求,减少请求次数,减少了Radio活跃时间,节省流量节省资源还节省电量,还可以减少服务器的压力。
6. 数据缓存
合理的缓存技术可以明显减少网络请求数据,同时可以减少服务器的压力,没有网络的请求是最快的请求。OkHttp和Volley这些都是自带缓存的。
7. 图片的特殊处理
很多App图片的流量占到App整流量的50%,所以图片优先考虑使用WebP,其次考虑jpg,甚至可以考虑针对不同分辨率的设备下载不同分辨率的图片,另外就是图片的缓存,现在市场上常用的图片加载库都会自带缓存。既能省流量省资源,又能加快速度。
8. 大文件处理
使用断点续传,增量更新等技术。核心还是为了节省流量,额外优化用户体验。
9. 选择合适的网络状态
4G比3G耗电,3G比2G耗电,Wifi耗电少速度快,所以在一些业务里可以适当选择合理的网络进行利用,例如:及时性要求不高的日志上报可以选择在Wifi条件下进行,提供给用户人性化的非Wifi下不加载图片的选择开关等。
10. CDN的部署
这个主要是后台服务维护,要考虑不同的运营商、不同IP的服务器优先级别、服务器的 TCP 拥塞窗口大小、重传超时时间(RTO)、最大传输单元(MTU)等。
11. 选择更优秀的IO操作库
我们知道数据不只是网络上的流动,当数据到达客户端时,如果更快速的进行IO操作也是可以对整个网络请求流程优化的,比如OkHttp的Okio。
12. 内核级别的讨论
我们知道android是基于linux的,网络数据从硬件物理层到达应用层这个过程中会从内核空间copy到用户空间,这个过程其实是有优化空间的,当然,这只是个人想法,没有真正的实践。
13. 其他
- 比如传输数据尽量选json而不用xml,有必要的可以选择Protocol Buffer。
- 尽量避免客户端的轮询,而使用服务器推送的方式。
常用的工具:
- Android Studio自带的Profiler的NETWORK,监控网络请求。
- 代理工具很多, 诸如Wireshark, Fiddler, Charles等,可以用来抓包也可以用来模拟弱网环境。
- Stetho 可以在Chrome上看到网络请求是数据流。
- Facebook的开源项目augmented-traffic-control可以模拟不同的网络环境,针对带宽、时延抖动、丢包率、错包率、包重排序率等方面,堪称弱网调试神器