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

2023-05-16

文章目录

  • 网络优化正确的认识
    • 流量消耗
    • 网络优化维度
    • 其他
    • 网络请求误区
  • 网络优化工具选择
    • 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

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

抓包工具

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 有实现可以借鉴,若有需要可以使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

android—性能优化3—网络优化 的相关文章

  • 【STM32+cubemx】0029 HAL库开发:HMC5883L磁力计的应用(电子指南针)

    今天我们来学习电子磁力计HMC5883L的使用 先介绍磁力计的基础知识 xff0c 再给一个获取磁力计数据的例子 xff0c 最后讲解HMC5883L磁力计的校准 xff0c 以及一些使用中的经验 1 xff09 HMC5883L磁力计的基
  • stm32F103R6之BKP(备份寄存器)

    目录 概述 侵入检测 RTC校准 概述 Stm32F103有42个16位的备份寄存器 他们处在备份域里 xff0c 当VDD电源被切断 xff0c 他们仍然由VBAT维持供电 当系统在待机模式下被唤醒 xff0c 或系统复位或电源复位时 x
  • Stm32F103R6之控制器局域网

    目录 概述 双CAN bxCAN工作模式 CAN协议特点 xff1a ISO11898标准CAN物理特性 CAN协议帧 概述 bxCAN是基本扩展CAN Basic Extended CAN 的缩写 xff0c 它支持CAN协议2 0A和2
  • 如何输出一个数的二进制数

    实现思想 xff1a 二进制数是以bit为操作数 xff0c 所以要想将一个数转换为二进制数 xff0c 我们需要先要将输入的数字转化为二进制数 xff0c 然后从高位到低位判断每一位是 1 还是 0 xff0c 最后把对应的 1 和 0
  • 使用libcurl库编写HTTP客户端(包括GET/POST/HTTPS)

    最近在写一个应用程序 需要与HTTP服务器进行数据交互 于是乎自己写了一个类似wget的功能的客户端 实现很简单 但是功能不给力 只可基本功能 于是又在网上找了找 发现使用libcurl库很方便 很强大 比起wget之类的 强大不是一点点
  • 修改系统默认shell为bash

    xfeff xfeff 从 ubuntu 6 10 开始 xff0c ubuntu 就将先前默认的bash shell 更换成了dash shell xff1b 其表现为 bin sh 链接倒了 bin dash而不是传统的 bin bas
  • 如何解决Reporting Services目录数据库文件存在的问题

    出处 xff1a http blog sina com cn s blog 6bace3cc0101jlxv html 错误提示 xff1a 自检时提示 Reporting Services目录数据库文件存在 失败 xff0c Report
  • 无线射频专题《射频合规,2.4GHz WIFI测试指标详解》

    目录 引言 Transmitter Power 发送功率 Transmit Spectrum Mask 发送信号频谱模版 Frequency Error 频率误差 EVM 矢量误差幅度 Band Edges and harmonics 频带
  • 获取当前访问的路径

    String returl 61 request getRequestURL 43 request getQueryString 61 61 null 34 34 34 34 43 request getQueryString
  • 抓取百度关键词排名

    最近在做百度关键词排名的功能 xff0c 发现网上资源比较少 xff0c 于是自己琢磨了一下 xff0c 写一下笔记 xff1b 本文重点在于提供思路 xff0c 请不要过分依赖 xff0c 本文主要靠抓取页面标签来完成 xff0c 如果百
  • 抓取百度关键词排名、标题、连接、描述

    抓取百度关键词排名 标题 连接 描述 转载请标明出处 最近在做百度关键词排名的功能 xff0c 发现网上资源比较这里写代码片少 xff0c 于是自己琢磨了一下 xff0c 写一下笔记 xff1b 本文重点在于提供思路 xff0c 请不要过分
  • Windows Server 2008远程桌面端口的修改

    Windows Server 2008远程桌面端口系统默认的是3389端口 xff0c 但出于安全考虑 xff08 谁都不希望任何都可以远程连接到自己的服务器吧 xff0c 哈哈 xff09 xff0c 经常我们把系统默认的3389端口更改
  • jsp 登陆成功后,显示登录的用户名

    首先在登陆界面将用户名保存起来 xff0c 我这里是将用户名提交到Servlet然后再进行保存 xff0c 从登录界面取用户参数 String uname 61 request getParameter 34 userName 34 req
  • 背景图片随网页的变化而变化(指大小)

    lt DOCTYPE HTML PUBLIC 34 W3C DTD HTML 4 01 Transitional EN 34 gt lt html xmlns 61 34 http www w3 org 1999 xhtml 34 gt l
  • 为什么vscode用久了电脑速度变慢?

    1 vscode 插件占用的内存 1 已经安装的插件 2 插件占用内存 我可以看到 xff0c vs code 这个程序下面有多个进程在跑 xff0c 插件占用的内存比我电脑剩下所有占用的内存还要高 xff0c 但是vs code 性能还是
  • ROS基础学习(一)---创建工作空间

    工作空间 xff08 workspace xff1a 是一个存放工程开发相关文件的文件夹 src xff1a 代码空间 xff08 Source Space build 编译空间 xff08 Build Space devel 开发空间 x
  • 一个简单的爬虫程序,爬取网站的图片

    最简单的爬虫是分析网页 xff0c 如果要爬取图片 xff0c 就要将图片在网页中的格式进行分析 xff0c 取到图片的连接 xff0c 接着下载图片 xff1b 由于网页中还会链接到其他的网页 xff0c 所以需要将其中的所有网页取出 x
  • python文件操作及引申的代码行数统计

    文件操作一般包括文件的读写 xff0c 文件夹的创建 xff0c 文件夹的删除等 第一部分 xff1a python文件读写的基本操作 python打开文件一般使用 open函数 xff1a open file mode 61 39 r 3
  • 超声波测距仪

    基本原理 超声波是利用反射的原理测量距离的 xff0c 被测距离一端为超声波传感器 xff0c 另一端必须有能反射超声波的物体 测量距离时 xff0c 将超声波传感器对准反射物发射超声波 xff0c 并开始计时 xff0c 超声波在空气中传
  • Authorization 值中Bearer空格加token值在python接口请求中如何实现

    在项目中每个接口请求都需要Authorization 值 xff0c 而Authorization他的值必须 Bearer 加token值 xff0c 刚开始自己忘记添加Bearer 接口请求一直拒绝访问 xff0c 后来用fiddler抓

随机推荐

  • printf格式化字符串漏洞原理解析

    读任意地址 printf 34 x 34 只给格式化字符串 xff0c 而不给参数 xff0c 会导致内存泄漏从而读到内存中其他地址的数据 N x参数可以以16进制方式打印第N个参数的内容 xff0c 通过修改N xff0c 我们可以遍历栈
  • 教程丨利用微软官方工具制作U盘安装Win10系统

    一 制作Win10安装U盘 1 登录网站 https www microsoft com zh cn software download windows10 下载 MediaCreationTool 工具 xff0c 这里我们直接点击 立即
  • Linux常用命令大全

    发布jar包 nohup java jar xxxx jar gt dev null 2 gt amp 1 amp 修改nginx conf 后刷新配置 usr local nginx sbin nginx t 测试配置文件修改是否正常 u
  • Zab协议详解

    什么是Zab协议 xff1f Zab协议 的全称是 Zookeeper Atomic Broadcast xff08 Zookeeper原子广播 xff09 Zookeeper 是通过 Zab 协议来保证分布式事务的最终一致性 Zab协议是
  • 谷歌浏览器安装json格式化插件

    实际开发工作中经常用到json数据 xff0c 那么就会有这样一个需求 xff1a 在谷歌浏览器中访问URL地址返回的json数据能否按照json格式展现出来 比如 xff0c 在谷歌浏览器中访问 xff1a http jsonview c
  • Seata详解(一)

    分布式事务 事务是数据库的概念 xff0c 数据库事务 xff08 ACID xff1a 原子性 一致性 隔离性和持久性 xff09 xff1b 分布式事务的产生 xff0c 是由于数据库的拆分和分布式架构 微服务 带来的 xff0c 在常
  • RocketMQ的事务消息和改造

    什么是 rmq分布式事务消息 xff1f Apache RocketMQ在4 3 0版中已经支持分布式事务消息 xff0c 这里RocketMQ采用了2PC的思想来实现了提交事务消息 xff0c 同时增加一个补偿逻辑来处理二阶段超时或者失败
  • session和token区别

    一 session的状态保持及弊端 xff08 1 xff09 当用户第1次通过浏览器使用用户名和密码访问服务器时 xff0c 服务器对用户名和密码进行验证 xff08 2 xff09 验证成功后 xff0c 在服务器端生成并保存sessi
  • 关于阿里云对RocketMQ的topic,tag,consumer关系的理解

    什么是订阅关系一致 消息队列RocketMQ版 阿里云帮助中心 RocketMQ 中Topic Tag GroupName基本概念介绍 Young丶的博客 CSDN博客 rocketmq topic和group的区别 转载
  • MySql Workbench 8.0汉化插件分享

    打开workbench的安装数据目录 xff0c 路径是 xff1a C Program Files MySQL MySQL Workbench 8 0 CE data 打开以后 xff0c 可以看到下面有一堆的xml结尾的文件 xff0c
  • Java-Jdk12版本下载后没有Jre的解决方案以及配置环境变量

    新本Jdk12版本下载后不像以前的版本会自动生成Jre文件夹 xff0c 通过dos命令行可以解决 1 下载jdk12 网址 xff1a https www oracle com technetwork java javase downlo
  • android--性能优化1--首屏优化&启动速度与执行效率检测

    文章目录 实战篇traceview 工具使用操作步骤操作步骤2 systrace 工具使用操作步骤 AOP 工具 hugo 的使用使用方法效果 BlockCanary 使用AOP 工具使用 AspectJ操作步骤 优化方案 异步线程优化 针
  • error Failed connect to github.com 443原因 Github更换认证方式

    Github更换认证方式 github近期调整了认证方式 xff0c 不再允许第三方工具基于账号密码来访问和管理项目了 除非使用github DeskTop 自带的客户端 好坑啊 我一直再用android studio 自带的提交工具很方便
  • AppCompatRatingBar备份用 下次拷贝直接用自定义图片背景

    控件 lt androidx appcompat widget AppCompatRatingBar android id 61 34 64 43 id rating bar 34 style 61 34 64 style myRating
  • 备份Edittext编辑框字数限制ui以及逻辑

    ui布局 etContent addTextChangedListener new TextWatcher 记录输入的字数 private CharSequence enterWords private int selectionStart
  • android—性能优化2—内存优化

    文章目录 性能优化 工具 memory profilerLeakCanaryarthookepic 库 java内存管理机制java 内存回收机制Android内存管理机制Dalvik与 Art区别Low Memory Killer 内存抖
  • glide4.11.0封装gfilib优化gif图片加载

    文章目录 具体步骤 下载giflib 和 framesequence导入并集成 giflib 和 framesequenceglide的配置gif使用giflib集成开始使用加载思路创建自定义GifDrawable 需求 目前项目中加载进度
  • java筑基.泛型,反射,注解-利用注解加反射练习

    文章目录 泛型 泛型类泛型方法泛型接口子类明确泛型类的类型参数变量子类不明确泛型类的类型参数变量 限定类型变量通配符泛型 注解元注解注解的应用场景 反射 注解 43 反射练习 泛型 把类型明确的工作推迟到创建对象或调用方法的时候才去明确的特
  • android性能优化实践与总结(包含启动,内存优化)

    应用中性能优化实践与总结 精心总结 任何优化都需要进行检测 以数据说话 优化前和优化后有了怎样的提升 TOC 启动优化 检测启动时间 检测工具任选其一 hugo 插件 自己定义时间开始和结束手动计算时间 AOP 工具 AspectJ adb
  • android—性能优化3—网络优化

    文章目录 网络优化正确的认识流量消耗网络优化维度其他网络请求误区 网络优化工具选择Network Proifiler抓包工具stetho流量优化如何判断APP流量消耗偏高如何测试 测试方案 线上线下流量获取线上流量获取方案NetworkSt