android—性能优化3—网络优化
Posted 六道对穿肠
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android—性能优化3—网络优化相关的知识,希望对你有一定的参考价值。
文章目录
网络优化正确的认识
-
网络优化是多维的
-
流量优化, 需要精确. 整体均值掩盖单点问题.
- 网络相关监控: 需要全面.
举例: 如果用户反馈app流量消耗过多,但是我们不知道用户使用app多长时间,其实我们也不好断定,因为如果app使用时间过长流量消耗多是正常的.
优化维度:
- 流量消耗
- 请求速度
- 链接成功率
- 安全策略
流量消耗
- 一段时间流量消耗的精准度量,网络类型流量还是wifi,前后台
- 监控相关 : 用户流量消耗的均值,异常率(消耗多,次数多)
- 需要对完整链路进行监控(Request ResPonse),主动上报(超过一定值).捞取(服务端下发指令)
网络优化维度
- 用户体验: 请求速度,成功率
- 监控相关: 请求时长,业务成功率,失败率,Top失败接口
其他
- 如果流量过多,对公司成本有影响: 带宽,服务器数,CDN
- 网络请求密集,让手机耗电
网络请求误区
- 只关注流量消耗,忽略其他维度,比如用户时长,操作频率等
- 只关注均值,整体,忽略个体
网络优化工具选择
Network Proifiler
需要开启高级选项
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)]
stetho
强大的应用调试桥,链接android和chrome
网络监控,视图查看,数据库查看,命令行扩展
https://blog.csdn.net/qq_26411333/article/details/52084862
不常用
最常用是抓包工具.
流量优化
精准获取流量获取
如何判断APP流量消耗偏高
- 流量的绝对值看不出来高低
- 对比竞品,相同Case对比流量消耗.
- 异常监控超过正常值
如何测试,测试方案
- 设置-流量管理
- 抓包工具: 只允许本App联网
线上线下流量获取
线上流量获取方案
NetworkStatsManager (线上可以使用这个)
- api23之后流量统计
- 可获取指定时间间隔内的流量信息
- 可获取不同网络类型下的消耗
在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
Android流量统计TrafficStats类,统计API_8以上重启以来的流量数据统计.
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"
- trafficStats
- 无法获得某个时间段内的流量消耗- 无大作用
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解析
DNS解析在网路错误中占比较高,使用IP直连方式替代DNS服务器解析,可以减少域名解析几百毫秒的时间消耗。
可以使用HttpDNS 阿里云提供的http dns解析服务,如果解析为空,再走系统的dns解析
连接池复用,HTTP版本自身的优化
keep-alive HTTP 协议里有个 keep-alive,HTTP1.1默认开启,一定程度上缓解了每次请求都要进行TCP三次握手建立连接的耗时。原理是请求完成后不立即释放连接,而是放入连接池中,若这时有另一个请求要发出,请求的域名和端口是一样的,就直接拿出连接池中的连接进行发送和接收数据,少了建立连接的耗时。 但是数据通信按次序进行
- http2.0 : 多工,客户端,服务器双向实行监控
网络质量请求监控
- 接口请求成功耗时,成功率,错误码
- 图片加载的每一步耗时
okhttp 里面Okhttp3.EvenListener 写个类实现这个类可以统计.
- 统计dns 解析耗时
- responseBodyEnd 网络请求流量消耗预警在这里做 如果超过一定阈值,上报
- 统计请求失败
写个实体类保存上面的数据
最后在okhttp创建的时候添加EvenListener 的实现类
图片监控:
同样的监听器.
okhttp优化
源码里面okhttp,任务数量加入线程池没有限制,但是加入任务,执行的时候判断当前正在执行的网络请求需要小于最大任务数64.对于单个host可以同时运行5个网络请求(防止某一个域名请求次数过多导致其他域名的请求没有执行)-不满足的话会放到队列里面去取, 如果APP只有一个HOST,那么这里也可以进行优化.
请求失败处理
客户端请求失败多次 一定时间内 不在请求.
数据压缩
目前比较成熟的方案未 GZIP 压缩,正常情况下压缩率均值能打包 30-50之间,可以极大的提升传输速度和节省流量,必要是可以使用 Protocol Buffer 替换 JSON 。
弱网优化
弱网优化,在弱网时要是制定合适的超时时间,控制网络并发,合并打包请求,调优TCP参数,使用TCP优化算法。
对服务端的TCP协议参数进行调优,以及开启各种优化算法,使得适合业务特性和移动端网络环境,包括RTO初始值,混合慢启动,TLP,F-RTO等。
针对弱网的这些细致优化暂未成为标准,开源网络库 mars 有实现可以借鉴,若有需要可以使用。
以上是关于android—性能优化3—网络优化的主要内容,如果未能解决你的问题,请参考以下文章