目前针对公司Android端的SDK进行实际测试,反映出存在网络加载资源缓慢的问题,在知晓目前CDN的可能存在不稳定的情况下,针对sdk本身的网络模块进行了相应的分析,整理出相关的测试记录,帮助后期可以做出的优化。
###典型的HTTP请求流程说明:
###发起一次完整的视频广告请求包括:
- 根据广告位请求Ad内容
- 下载广告视频截图
- 下载Logo角标请求
- 下载插屏页模板Temp资源
- 下载广告视频的video文件
- 下载插屏页html的source资源
如下图所示,根据广告请求AD返回成功后,才会执行下载资广告资源的任务,这里是同步。而当服务器返回AD数据以后,发起多线程异步下载广告资源的任务。只有当一次视频广告所需的全部资源全部下载成功时,才会进入广告的播放显示流程。
简单的理解就是,多个下载任务是并发的,对内容的获取是异步的。
###数据获取和内容解析 一般来说,客户端从服务端请求获取数据,缓存数据内容,最终按不同形式呈现出来。所以对资源的加载简单地分为下面两个环节:
- 数据获取:也就是发送请求给服务器返回相应的数据。
- 内容解析:对服务器返回的不同数据类型,在设备上缓存的文件形式,对应其不同的解析方式。
###网络任务分析 通过手机端设置代理方式,借助Fiddler对手机端的网络数据进行抓包分析。下面是针对SDK项目的demo程序来进行数据抓包分析:
#####网络任务耗时分析:(公司网络环境下根据广告位请求AD) 通过分析请求AD任务的整体耗时分布,发现耗时主要是在进行DNS解析和TCP握手连接两个方面。
将域名和从DNS服务器解析得到的IP地址保存在DNS缓存中。当下一次再使用这个域名时,就直接从DNS缓存里获得所需的信息,而无需再访问DNS服务器。
3.建立TCP/IP可靠连接,是需要三次握手协议,每次请求都重复这个建立连接的过程,无疑是非常耗时的,考虑下面的方式:
请求合并,对数据量小而零散请求都一次集中执行完毕,类似的请求做合并; 分优先级、延迟部分请求,将不重要的请求延迟,削峰减少并发; 连接复用,不需要每次都通过“三次握手:建立一个新连接,再通过“四次挥手”来关闭连接;
整个请求的TimeLine
Http 1.1 可以通过服务端对前一个请求的请求头进行缓存,后面相同请求头用 md5 之类的 id 来表示即可。
减小返回数据大小 通常一般对网络数据优化的措施是: (1) 对返回的内容数据使用 Gzip 压缩 (2) 精简数据格式如 JSON 代替 XML,WebP 代替其他图片格式 (3) 对于不同的设备不同网络返回不同的内容,如不同分辨率图片 (4) 增量更新需要数据更新时,可考虑数据增量更新。如常见的服务端进行 bsdiff,客户端进行 bspatch。 (5) 大文件下载支持断点续传和多线程下载,并缓存 Http Resonse 的 ETag 标识,下次请求时带上,从而确定是否数据改变过,未改变则直接返回 304。
下图是对比Json数据使用 Gzip 压缩前后对比图 返回内容开启 Gzip压缩前
#####网络任务优化措施
- 考虑预取包括预连接、预加载数据。
- 使用HttpUrlConnection替换目前的HttpClient,可以具有默认的Gzip压缩和连接复用实现
- DNS优化,确定IP直连和DNS缓存两者结合的方式
- 多连接下载,对于较大文件,如大图片、文件下载可考虑多连接下载
需要控制请求的最大并发量,毕竟移动端网络受限
- 增加网络性能的监控,毕竟优化需要通过数据对比才能看出效果,所以监控系统必不可少,通过前后端的数据监控确定调优效果。