android—性能优化3—网络优化

文章目录

  • 网络优化正确的认识
    • 流量消耗
    • 网络优化维度
    • 其他
    • 网络请求误区
  • 网络优化工具选择
    • Network Proifiler
    • 抓包工具
    • stetho
    • 流量优化
      • 如何判断APP流量消耗偏高
      • 如何测试,测试方案
    • 线上线下流量获取
      • 线上流量获取方案
        • NetworkStatsManager (线上可以使用这个)
        • Android流量统计TrafficStats类,统计API_8以上重启以来的流量数据统计.
    • 前台后台流量获取
      • 后台获取流量方案
    • 数据缓存
    • 数据状态更新
    • 数据压缩
    • 其他网络优化
        • 优化DNS解析
        • 连接池复用,HTTP版本自身的优化
        • 网络质量请求监控
      • okhttp优化
      • 请求失败处理
        • 数据压缩
        • 弱网优化

网络优化正确的认识

  1. 网络优化是多维的

  2. 流量优化, 需要精确. 整体均值掩盖单点问题.

  • 网络相关监控: 需要全面.

举例: 如果用户反馈app流量消耗过多,但是我们不知道用户使用app多长时间,其实我们也不好断定,因为如果app使用时间过长流量消耗多是正常的.

优化维度:

  • 流量消耗
  • 请求速度
  • 链接成功率
  • 安全策略

流量消耗

  • 一段时间流量消耗的精准度量,网络类型流量还是wifi,前后台
  • 监控相关 : 用户流量消耗的均值,异常率(消耗多,次数多)
  • 需要对完整链路进行监控(Request ResPonse),主动上报(超过一定值).捞取(服务端下发指令)

网络优化维度

  • 用户体验: 请求速度,成功率
  • 监控相关: 请求时长,业务成功率,失败率,Top失败接口

其他

  • 如果流量过多,对公司成本有影响: 带宽,服务器数,CDN
  • 网络请求密集,让手机耗电

网络请求误区

  • 只关注流量消耗,忽略其他维度,比如用户时长,操作频率等
  • 只关注均值,整体,忽略个体

网络优化工具选择

Network Proifiler

需要开启高级选项

run->edit configuration -> 把 enable advance profiling for older devices

android—性能优化3—网络优化_第1张图片

拉去看到请求后可以展示网路请求数据,如果是图片则会展示图片.

抓包工具

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 写个类实现这个类可以统计.

  1. 统计dns 解析耗时
  2. responseBodyEnd 网络请求流量消耗预警在这里做 如果超过一定阈值,上报
  3. 统计请求失败

写个实体类保存上面的数据

最后在okhttp创建的时候添加EvenListener 的实现类

图片监控:

同样的监听器.

okhttp优化

源码里面okhttp,任务数量加入线程池没有限制,但是加入任务,执行的时候判断当前正在执行的网络请求需要小于最大任务数64.对于单个host可以同时运行5个网络请求(防止某一个域名请求次数过多导致其他域名的请求没有执行)-不满足的话会放到队列里面去取, 如果APP只有一个HOST,那么这里也可以进行优化.

请求失败处理

客户端请求失败多次 一定时间内 不在请求.

数据压缩

目前比较成熟的方案未 GZIP 压缩,正常情况下压缩率均值能打包 30-50之间,可以极大的提升传输速度和节省流量,必要是可以使用 Protocol Buffer 替换 JSON 。

弱网优化

弱网优化,在弱网时要是制定合适的超时时间,控制网络并发,合并打包请求,调优TCP参数,使用TCP优化算法。
对服务端的TCP协议参数进行调优,以及开启各种优化算法,使得适合业务特性和移动端网络环境,包括RTO初始值,混合慢启动,TLP,F-RTO等。
针对弱网的这些细致优化暂未成为标准,开源网络库 mars 有实现可以借鉴,若有需要可以使用。

你可能感兴趣的:(android开发技巧总结)