网络优化是多维的
流量优化, 需要精确. 整体均值掩盖单点问题.
举例: 如果用户反馈app流量消耗过多,但是我们不知道用户使用app多长时间,其实我们也不好断定,因为如果app使用时间过长流量消耗多是正常的.
优化维度:
需要开启高级选项
run->edit configuration -> 把 enable advance profiling for older devices
拉去看到请求后可以展示网路请求数据,如果是图片则会展示图片.
chirs
https://blog.csdn.net/csdn_aiyang/article/details/79153162
chirs模拟慢网
proxy -> throttle settings 选哪个下拉的选项
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CggGp2Wa-1619923515555)(https://liudao01.github.io/picture/img/企业微信截图_03b33cba-3d44-4021-9787-27916929ccd3.png)]
强大的应用调试桥,链接android和chrome
网络监控,视图查看,数据库查看,命令行扩展
https://blog.csdn.net/qq_26411333/article/details/52084862
不常用
最常用是抓包工具.
精准获取流量获取
在Android 6.0(API23)中新增加的类,提供网络使用历史统计信息,同时特别强调了可查询指定时间间隔内的统计信息。看看部分函数(非静态):
//查询指定网络类型在某时间间隔内的总的流量统计信息
NetworkStats.Bucket querySummaryForDevice(int networkType, String subscriberId, long startTime, long endTime)
//查询某uid在指定网络类型和时间间隔内的流量统计信息
NetworkStats queryDetailsForUid(int networkType, String subscriberId, long startTime, long endTime, int uid)
//查询指定网络类型在某时间间隔内的详细的流量统计信息(包括每个uid)
NetworkStats queryDetails(int networkType, String subscriberId, long startTime, long endTime)
NetworkStatsManager总结 来自: https://blog.csdn.net/w7849516230/article/details/71705835
static long getUidRxBytes(int uid) //获取某个网络UID的接受字节数
static long getTotalTxBytes() //总的发送字节数,包含Mobile和WiFi等
static long getMobileRxBytes() //获取通过Mobile连接收到的字节总数,不包含WiFi
static long getMobileRxPackets() //获取Mobile连接收到的数据包总数
static long getMobileTxBytes() //Mobile发送的总字节数
static long getMobileTxPackets() //Mobile发送的总数据包数
static long getTotalRxBytes() //获取总的接受字节数,包含Mobile和WiFi等
static long getTotalRxPackets() //总的接受数据包数,包含Mobile和WiFi等
static long getTotalTxBytes() //总的发送字节数,包含Mobile和WiFi等
static long getTotalTxPackets() //发送的总数据包数,包含Mobile和WiFi等
static long getUidRxBytes(int uid) //获取某个网络UID的接受字节数
static long getUidTxBytes(int uid) //获取某个网络UID的发送字节数
其他
这些都是从第一次启动程序到最后一次启动的统计量。并不是这篇文章里所说的“从本次开机到本次关机的统计量”!
用法举例,注意这里得到的单位都是"KB"
public long getTotalRxBytes(){ //获取总的接受字节数,包含Mobile和WiFi等
return TrafficStats.getTotalRxBytes()==TrafficStats.UNSUPPORTED?0:(TrafficStats.getTotalRxBytes()/1024);
}
public long getTotalTxBytes(){ //总的发送字节数,包含Mobile和WiFi等
return TrafficStats.getTotalTxBytes()==TrafficStats.UNSUPPORTED?0:(TrafficStats.getTotalTxBytes()/1024);
}
public long getMobileRxBytes(){ //获取通过Mobile连接收到的字节总数,不包含WiFi
return TrafficStats.getMobileRxBytes()==TrafficStats.UNSUPPORTED?0:(TrafficStats.getMobileRxBytes()/1024);
}
可以开启一个定时任务-> 获取间隔内流量 - >记录前后台(通过liftcycle onresume判断前后台) -> 分别计算
-> 上报APM后台 -> 流量治理一句
服务端返回过期时间.
加上版本的概念,只传输有变化的数据
举例: 配置信息,省市区县等更新
图片上传前压缩
DNS解析在网路错误中占比较高,使用IP直连方式替代DNS服务器解析,可以减少域名解析几百毫秒的时间消耗。
可以使用HttpDNS 阿里云提供的http dns解析服务,如果解析为空,再走系统的dns解析
keep-alive HTTP 协议里有个 keep-alive,HTTP1.1默认开启,一定程度上缓解了每次请求都要进行TCP三次握手建立连接的耗时。原理是请求完成后不立即释放连接,而是放入连接池中,若这时有另一个请求要发出,请求的域名和端口是一样的,就直接拿出连接池中的连接进行发送和接收数据,少了建立连接的耗时。 但是数据通信按次序进行
okhttp 里面Okhttp3.EvenListener 写个类实现这个类可以统计.
写个实体类保存上面的数据
最后在okhttp创建的时候添加EvenListener 的实现类
图片监控:
同样的监听器.
源码里面okhttp,任务数量加入线程池没有限制,但是加入任务,执行的时候判断当前正在执行的网络请求需要小于最大任务数64.对于单个host可以同时运行5个网络请求(防止某一个域名请求次数过多导致其他域名的请求没有执行)-不满足的话会放到队列里面去取, 如果APP只有一个HOST,那么这里也可以进行优化.
客户端请求失败多次 一定时间内 不在请求.
目前比较成熟的方案未 GZIP 压缩,正常情况下压缩率均值能打包 30-50之间,可以极大的提升传输速度和节省流量,必要是可以使用 Protocol Buffer 替换 JSON 。
弱网优化,在弱网时要是制定合适的超时时间,控制网络并发,合并打包请求,调优TCP参数,使用TCP优化算法。
对服务端的TCP协议参数进行调优,以及开启各种优化算法,使得适合业务特性和移动端网络环境,包括RTO初始值,混合慢启动,TLP,F-RTO等。
针对弱网的这些细致优化暂未成为标准,开源网络库 mars 有实现可以借鉴,若有需要可以使用。