Android开发下的网络优化初学
工具
profile查看网络请求
debug log看报文
charles看报文、mock
url
httpdns
直接使用url
网络协议
可以考虑摒弃http,仅使用tcp,原因有3点
1.http无法优化弱网
2.http需要dns解析
3.网络连接,发送请求,接受响应在http上的定制性优化不方便
连接维护
有两个概念:
1.piping同时发送多请求
2.mutiplexing二进制分帧可以乱序接受
可以考虑摒弃这两点,用最简单的fifo。
维护若干连接,还可以同时处理一个大请求,如果连接全部在使用中,才开启一个临时连接。
弱网、网络抖动
维护连接数降到1
动态调整connection、write、read超时时间
网络类型切换,连接会失效(ip port ip port是对应的),关闭所有连接,开启新的连接,同时对任务进行重试
数据格式
protobuf
重试机制
如果失败,不再用原有连接,而是开启临时连接,对于建立连接、序列化报文、发送请求3个阶段进行重试(不会产生幂等问题,只要监控好确保请求没有发出去)
应用层4大策略
1.打包请求
2.预加载
3.任务分优先级
(低优先级:比如点赞,因为用户可能不断点赞、取消赞,所以先ui展示,等退出页面后再发请求;
高优先级:请求数据更新ui)
4.错峰(打包是对的,但是100个请求一起发就不好了,因为大部分的网络请求是缓存线程池,只有非核心线程,如果100个加进来,会短时间创建100个线程,其后果可以想象)
压缩报文
http可以压缩header
body可以用gzip压缩
图片传输
webp
做好缓存工作
http1.0强制 服务器给服务器上的到期时间
对比 给资源的最后修改时间
http2.0强制 服务器给到期时间段
对比 给资源的唯一标识
监听wifi、充电
用jobschedule监听wifi、充电,做一些费电、费网的操作,这个时候可以下载大量数据啊,也可以post用户埋点信息啊。。。