如何使新浪微博下拉刷新动作的反应时长由原来的两秒钟变成一秒钟?如果仅仅通过代码优化这一方法无法使下拉刷新动作的反应时长减少一半,那该如何实现这一目标呢?新浪微博客户端架构开发和优化高级开发工程师高一航将带你了解新浪微博是如何实现这一目标的。
作为安卓系统开发人员,面临新浪微博客户端下拉刷新动作反应时长缩短的问题首先要对代码进行优化,使得系统内存减少,性能增加。当代码优化使得下拉刷新动作反应时长无法缩短一半时,就需要对网络数据库进行优化。
普通Http请求是如何实现的
首先带着域名查找IP地址,定位访问电脑的位置,通过TCP建立socket连接,然后SSL认证,认证结果如果是http2.0,发布上行数据,上行数据包括服务端的接口(userinfo接口、login接口)、支持的解压格式等,数据发送完成后,客户端等待服务端相应;客户端读取第一帧内容后,就已开始读取请求头,请求头里包括状态码(比如200、206或者403),状态码为200、206后,通过list集合获得json串,将jason串解析为程序需要的Java bean对象,对bean对象进行处理绘制在界面上,这一过程在安卓以及IOS系统中具有相似性。
现行系统网络库有哪些特点
1、链路大部分模块没有数据样本,无法得知里面过程耗费的时间,因而优化方向不明确;
2、系统网络库带面都在系统底层,无法控制;
3、Android和IOS两个语言两套代码,维护成本高且没有对比性可言;
安卓网络数据库:
OKHttp、Retrofit、Volley、AsyncHttp;
IOS网络数据库:
AFNetworking、YTKNetwork、SwiftMoya、SwiftAlamofire;
以上网络数据库解决了系统网络库链路大部分模块没有数据样本、优化方向不明确、无法控制系统网络库带面等缺点,安卓与IOS两个语言两套代码,维护成本高且没有对比性的问题暂时没有解决。
Chromium 网络库是谷歌2006开发的,以简单、高效、稳定等特点而出名,专注于做网络环境的优化。
Chromium网络库特点
跨多平台 :C++语言编写, IOS和Android 公用⼀个代码仓库,实现90%以上的代码重用, 大幅加快开发效率, 降低⼈力成本。
容易上手 :Chromium网络库接口简单,并且提供了IOS 和 android两端中间层代码接口, 易于接入。
协议全面 :Chromium网络库支持HTTP,HTTPS,SPDY,QUIC 等协议, 便于上层业务按需调用。
便于开发 :Chromium网络库中各自模块独立, 互相之间耦合度极低, 可干预全链路的网络过程, 根据自己项目定制开发。
社区活跃 :Chromium开源社区活跃, 技术资料丰富, 解决问题效率高, 也进一步保证了项目的稳定性。
使用方式:
先写一个Callback onFile onSuccess方法,直接用一个Builder、Start结束;
Chromium网络库还为用户提供无缝切换URL Connection的方法,需要把URLConnection换成url.openConnection();
底层URLConnectionconnection换成(HttpURLConnection)engine.openConnection{url}就可以了;
以上要实现的目标就是统计URLrequest的耗时情况,通过以上步骤可以统计DNS时间、TCP建连实践、SSL认证时间、发送上行时间、等待Server时间。在时长进行统计的同时又增加了对错误码、远端IP、连接复用率、成功率的统计。
以上后台,包括时间、错误码与远端IP等,新浪微博上版本的平均响应时间为1.2s,成功率达到99%以上。
安卓大部分耗时间还是集中在网络传输这块,包括进入网络库以及离开网络库等,时间要比IOS长很多。
新浪微博基于Chromium网络库源码进行了二次开发,其中包括减少包的体积、Http DNS、Quic协议支持。
减少包的体积 是因为Chromium网络库是20多个G,打包下来是3.5M,3.5M对于目前微博的体量来说还是比较大,目前已减少八个暂时未用的功能已将包的体积减少到2.3M。
HTTPDNS 也被复制到这个网络数据库里面,DNS就是拿一个IP地址,去请求这个地址,运营商有时会在域名缓存、解析转发以及LocalDNS 递归出口NAT方面出现错误,新浪针对以上错误,在Http发起请求之前先发起了一个域名查询的请求,然后通过IP地址来请求接口,而不是用DNS去访问请求。
QUIC协议支持 ,QUIC是基于UDP多路传输的,能够实现极低的等待延迟以及快速迭代,而且是首个开源于Chromium网络库项目中的支持。具有多路复用、拥堵控制、加密技术、向前纠错、保持连接等功能。多路复用就是一个TCP连接以后,可以请求多个的接口,实现高效请求。对QUIC的二次开发 ,真正实现了0个RTT,实现了idea时延从30毫秒修改为60毫秒,大大提升了连接复用率。QUIC逻辑每次发起之前都会通过一个Http协议判断正在使用的服务器支不支持,新浪自己的服务器和客户端互相都支持,大大的提高效率,缩减了耗时。
未来,新浪微博网络库将会对SO采用下载的方式,可以动态更新,继续减少体积;还有就是对chromium网络库中的线程机制进行优化;同时对chromium网络库中的连接池策略进行优化。
安卓绿色联盟后续会根据每期技术沙龙议题输出精彩技术干货文章,为未能现场参加技术沙龙的您提供另一个干货学习机会。
微信搜索“安卓绿色联盟”或“AndroidGA”或扫描文末二维码即可关注安卓绿色联盟微信公众号,最新技术沙龙招募、精彩技术干货分享、与专家讲师更多互动等你参与!!!