写点什么

深入探索 Android 网络优化(三、网络优化篇,flutter 页面跳转卡

用户头像
Android架构
关注
发布于: 1 小时前

网络请求的调用堆栈信息, 下图就是 Awesome-WanAndroid 发起一个网络请求所经历的调用堆栈:



Awesome-WanAndroid 使用 Glide 发起一个图片加载请求所经历的调用堆栈:


关键细节

高级配置中的 required for API level < 26 only 不是限定调试的手机版本小于 26,我使用 API 27 的手机也可以调试。

实践中获得的新知识及感悟

如果想快速搞懂接手项目中的网络/图片加载等框架的 w 网络请求流程,可以使用 Profiler NETWORK 的 CallStack 功能,并且双击其中任意的一行调用链方法都可以 jump to 指定源码。


选中网络请求无法显示数据?


打开高级分析即可。

2、Charles

使用 Java 开发的,MAC 上使用较多。

特点

  • 1)、断点功能

  • 2)、Map Local

  • 3)、弱网环境模拟

安装配置

1、下载 Charles

2、截获手机端的网络包。

需要配置手机与电脑连接同一 WIFI。

1)、电脑端设置 Charles — 打开 HTTP 代理并设置代理端口
  • Charles 菜单栏 => Proxy => Proxy Settings => 填代理端口 8888 并勾选 Enable transparent HTTP proxying。

2)、手机端设置 WIFI 代理及端口
  • 获取电脑 IP 地址

  • 点击 Charles 的 help => local address。

  • 设置 WIFI 代理及端口号

  • 手机设置 => WLAN => 查看当前连接的 WIFI 详情 => 最底部代理项设置为手动 => 配置 电脑 IP 地址与端口号 8888。

3)、设置完成,运行任意联网程序,Charles 会弹出请求连接的确认框,点击 allow 即可。

3、截取 HTTPS

需要信任 Charles 的 CA 证书。

1)、打开 SSL 代理,并配置 Host 与 Port
  • 电脑端 Proxy => SSL Proxying Setting => 选中 Enable SSL Proxying 并点击 Add 配置 Host 与 Port 分半为 * 与 443。

2)、信任 Charles Proxy CA 机构
  • 电脑端 Help => SSL Proxying => Install Charles Root Certificate => 选中并双击 Charles Proxy CA 根证书颁发机构 => 点击信任 => 使用此证书时选择始终信任。

3)、手机端安装 Charles 颁发的 SSL 证书
  • 电脑端 Help => SSL Proxying => Install Charles Root Certificate on a Mobile Device,此时会弹出提示框让手机端访问 chls.pro/ssl 去下载证书。

4)、手机端安装证书
  • 从文件管理器中找到下载文件 => 如果是 .pem 结尾 i,将后缀名改为 .crt 并点击该文件 => 输入锁屏密码 => 等待证书导入后配置证书名(我填的是 Charles)即可。

实践过程

选中目标网络请求

从 Overview 中可以看到很全面抓包信息 。

使用断点功能

1)、右键点击要断点的 URL,选中 BreakPoints 开启断点功能。
2)、点击顶部 Proxy => Breadkpoint Settings。
3)、双击 Breakpoints Settings 面板中的目标

URL,在弹出的 Edit Breakpoint 面板中进行编辑。

4)、这里默认选择断点 Request 与 Response,我们可以选择仅断点 Response 或 Request。点击确认即断点设置完成。
5)、然后,我们就可以点击主面板右侧的 Edit Response 编辑 Response,修改完成后点击最下方的 Execute 即可。

使用 Map Local

1)、自由模拟服务端的返回数据,以提前进行接口测试。
1)、右键点击要使用 Map Local 的 URL,选中 Map Local 开启断点功能。
1)、然后,我们在 Edit Mapping 面板中选择 Map To 的 Local path,选择本地设定的 maplocal 本地数据(例如 JsonString)

弱网模拟功能

  • 1)、注意开启前需将 Map Local 关闭。

  • 2)、点击 Proxy => Throttle Setting => 选中 Enable Throttling

  • 3)、这里预设了很多模拟设置,我们只需将 网络包传输的速率 Throttle preset 设置为较低的速率(一般设为 256/512)。

碰到的问题

  • 1)、注意手机与笔记本电脑需要同一 WIFI 下,不能自己开热点或使用公司内网,否则无法在 电脑端 无法弹出手机连接 Charles 的提示确认框,并且也无法下载 Charles 提供的 SSL 证书。

  • 2)、手机端下载 Charles 提供的 SSL 证书时最好不使用系统浏览器访问。

3、Wireshark

强烈推荐 geektime-webprotocol


WireShark 主要可以用来对四种流进行跟踪,如下所示:


  • TCP

  • UDP

  • SSL

  • HTTP

1)、WireShark 基本使用

如何捕获报文

  • 1)、点击捕获->选项,打开捕获窗口

  • 网卡设备/


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


流量/捕获过滤器,点击“开始”按钮开始抓包


  • 输出(指定缓存文件)/选项(显示、名称解析、自动停止抓包条件) 面板

  • 2)、点击捕获->停止,停止抓包


Wireshark 面板

快捷方式工具栏

数据包的颜色(视图->着色规则)

设定时间显示格式

数据包列表面板的标记符号

文件操作

  • 1)、标记报文 Ctrl+M。

  • 2)、导出标记报文(文件->导出特定分组),亦可按过滤器导出报文 ,

  • 3)、合并读入多个报文(文件->合并)。

如何快速抓取移动设备的报文?

  • 1、打开手机的 wifi 热点。

  • 2、电脑连接手机的 wifi 热点。

  • 3、用 Wireshark 打开捕获->选项面板,选择 wifi 热点对应的接口设备抓包即可。

2)、Wireshark 过滤器

如果表达式的背景为绿色,则说明过滤器的语法是正确的,红色则说明有错误。

捕获过滤器

它用于减少抓取的报文体积,使用 BPF(Berkeley Packet Filter) 语法,功能相对有限。


BPF 可以在设备驱动级别提供抓包过滤接口,多数抓包工具都支持此语法。而 BPF 的 Expression 表达式由多个 primitives 原语组成。而每一个 primitives 原语则由名称或数字,以及描述它的多个 qualifiers 限定词组成。

qualifiers 限定词
  • 1、Type:设置数字或者名称所指示类型

  • host、port。

  • net ,设定子网,net 192.168.0.0 mask 255.255.255.0 等价于 net 192.168.0.0/24。

  • portrange,设置端口范围,例如 portrange 6000-8000。

  • 2、Dir:设置网络出入方向

  • src、dst、src or dst、src and dst。

  • ra、ta、addr1、addr2、addr3、addr4(仅对 IEEE 802.11 Wireless LAN 有效)。

  • 3、Proto:指定协议类型

  • ether、fddi、tr、 wlan、

  • ip、 ip6、 arp、 rarp、

  • decnet、 tcp、udp、icmp、igmp、icmp

  • igrp、pim、ah、esp、vrrp

  • 4、其他

  • gateway:指明网关 IP 地址,等价于 ether host ehost and not host host。

  • broadcast:广播报文,例如 ether broadcast 或者 ip broadcast。

  • multicast:多播报文,例如 ip multicast 或者 ip6 multicast。

  • less, greater:小于或者大于。

简单示例

src or dst portrange 6000-8000 && tcp or ip6

显示过滤器

它对已经抓取到的报文进行过滤显示,功能强大。

基于协议域过滤
  • 捕获所有 TCP 中的 RST 报文:tcp[13]&4==4。

  • 抓取 HTTP GET 报文:port 80 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420。(47455420 是 ASCII 码的 16 进制,表示”GET ”)

  • 抓取 HTTP POST 报文:port 80 and tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504F5354

显示过滤器的过滤属性

任何在报文细节面板中解析出的字段名,都可以作为过滤属性。在视图->内部->支持的协议面板里,可以看到各字段名对应的属性名。例如,在报文细节面板中 TCP 协议头中的 Source Port,对应着过滤属性为 tcp.srcport。

常用操作符
  • 1)、and(&&):AND 逻辑与,ip.src==10.0.0.5 and tcp.flags.fin。

  • 2)、or(||):OR 逻辑或,ip.scr==10.0.0.5 or ip.src==192.1.1.1。

  • 3)、xor(^^):XOR 逻辑异或,tr.dst[0:3] == 0.6.29 xor tr.src[0:3] == 0.6.29。

  • 4)、not(!):NOT 逻辑非,not llc。

  • 5)、[...?]:中括号[]Slice 切片操作符

  • [n:m]表示 n 是起始偏移量,m 是切片长度,例如:eth.src[0:3] == 00:00:83

  • [n-m]表示 n 是起始偏移量,m 是截止偏移量,例如:eth.src[1-2] == 00:83

  • [:m]表示从开始处至 m 截止偏移量,例如:eth.src[:4] == 00:00:83:00

  • [m:]表示 m 是起始偏移量,至字段结尾,例如:eth.src[4:] == 20:20

  • [m]表示取偏移量 m 处的字节,例如:eth.src[2] == 83

  • [,]使用逗号分隔时,允许以上方式同时出现,例如:eth.src[0:3,1-2,:4,4:,2] ==00:00:83:00:83:00:00:83:00:20:20:83

  • 6)、in:大括号{}集合操作符,例如 tcp.port in {443 4430..4434} ,实际等价于 tcp.port == 443 || (tcp.port >= 4430 && tcp.port ? 4434)。

可用函数
  • upper:将字符串字段转换为大写。

  • lower:将字符串字段转换为小写。

  • len:返回字符串或字节数组的字节长度。

  • count:返回在一帧中字段出现的数量。

  • string:将非字符串字段转换为字符串。

显示过滤器的可视化对话框
环形缓冲器

例如使用 3 个文件的环形缓存器,从 **.1 => **.2 => **.3 然后又从 **.1 文件开始记录,形成环形。

4、TcpDump(网络数据包嗅探器)

1)、抓包步骤

1、获取 ROOT 权限的手机一部

2、下载 tcpdump

3、将 tcpdump 安装到手机上

adb push tcpdump /data/local/tmp

4、修改 tcpdump 的权限,使其具有可执行的权限

chmod 777 /data/local/tmp/tcpdump

5、执行 tcpdump 命令进行抓包,按组合键 Ctrl + C 可以停止抓包

6、将抓到的数据包的信息保存为 Pcap 文件,这里仅需在执行 tcpdump 后加上 -w 参数

tcpdump-w /data/local/tmp/tcp.pcap

7、把 Pcap 复制到 电脑上,使用 Wireshark 分析数据包的流量。

2)、捕获及停止条件

  • -D:列举所有网卡设备。

  • -i:选择网卡设备。

  • -c:抓取多少条报文。

  • --time-stamp-precision:指定捕获时的时间精度,默认毫秒 micro,可选纳秒 nano。

  • -s:指定每条报文的最大字节数,默认 262144 字节。

3)、文件操作

  • -w:输出结果至文件(可被 Wireshark 读取分析)。

  • -C:限制输入文件的大小,超出后以后缀加 1 等数字的形式递增。 注意单位是 1,000,000 字节。

  • -W:指定输出文件的最大数量,到达后会重新覆写第 1 个文件。

  • -G:指定每隔 N 秒就重新输出至新文件,注意-w 参数应基于


strftime 参数指定文件名。


  • -r:读取一个抓包文件。

  • -V:将待读取的多个文件名写入一个文件中,通过读取该文件同时 读取多个文件。

4)、输出时间戳格式

  • -t:不显示时间戳。

  • -tt:自 1970 年 1 月 1 日 0 点至今的秒数。

  • -ttt:显示邻近两行报文间经过的秒数。

  • -tttt:带日期的完整时间。

  • -ttttt:自第一个抓取的报文起经历的秒数。

5)、分析信息详情

  • -e:显示数据链路层头部。

  • -q:不显示传输层信息。

  • -v:显示网络层头部更多的信息,如 TTL、id 等。

  • -n:显示 IP 地址、数字端口代替 hostname 等。

  • -S:TCP 信息以绝对序列号替代相对序列号。

  • -A:以 ASCII 方式显示报文内容,适用 HTTP 分析。

  • -x:以 16 进制方式显示报文内容,不显示数据链路层。

  • -xx:以 16 进制方式显示报文内容,显示数据链路层。

  • -X:同时以 16 进制及 ACII 方式显示报文内容,不显示数据链路层 ? -XX 同时以 16 进制及 ACII 方式显示报文内容,显示数据链路层。

5、Stetho

  • 1)、在 build.gradle 中,除了 Stetho 依赖外,还需添加 'com.facebook.stetho:stetho-okhttp3:1.5.0'。

  • 2)、在 Application 的 onCreate 方法中初始化 'Stetho.initializeWithDefaults(this)'。

  • 3)、调用 OkHttp 的 'addNeworkInterceptor' 方法添加 Stetho 用于收集网络信息而提供的网络拦截器。

  • 4)、访问 Chrome 调试页面 'chrome://inspect'。

6、其它的性能检测工具

  • strace:跟踪 Socket 相关的系统调用。

  • netstat:记录多种网络栈和接口统计信息。

  • ifconfig:记录接口配置。

  • ip:记录网络接口统计信息。

  • ping:测试网络连通性。

  • traceroute:测试网络路由。

  • /proc/net 命令:查看网络统计信息,Android TrafficState 使用了 /proc/net/xt_qtaguid/stats 和 /proc/net/xt_qtaguid/iface_stat_fmt 文件来统计 App 的流量信息。

三、精准获取流量消耗

1、如何判断 App 流量消耗偏高?

  • 1)、绝对值看不出高低。

  • 2)、对比竞品,相同 Case 对比流浪消耗。

  • 3)、异常监控超过正常指标。

2、测试方案

  • 1)、打开手机设置 => 流量管理 => 仅允许目标 App 联网

  • 2)、可以查找出大多数的问题,但是线上场景线下可能遇不到。

3、线上流量获取方案

1)、TrafficStats

特点

  • API 18 以上。

  • 记录手机重启以来的数据流量。

API

  • getMobileRxBytes():通过蜂窝流量接收到的信息。

  • getUidRxBytes(int uid):获取指定 uid 的接收流量。

  • getTotalRxBytes():总发送流量。

缺点

无法获取某个时间段内的流量消耗。

2)、NetworkStatsManager

API 23 之后。

特点

  • 1)、获取指定时间间隔内的流量信息。

  • 2)、获取不同网络类型下的消耗。

NetUtils.getStats

获取指定时间间隔的 蜂窝 + WIFI 流量总信息

4、前后台流量获取方案

问题:线上反馈 App 后天流量消耗大?

只获取一个时间段的流量不够全面。

实现原理

后台定时任务 => 获取时间间隔内流量 => 记录前后台 => 分别计算 => 上报 APM 后台 => 流量治理依据

小结

  • 1)、该方案无法获取应用在前后台切换时的流量,因此有一定的误差,但这个误差是可以接受的。

  • 2)、结合精细化的流量异常报警针对性的解决后台跑流量的问题。


成功 log 如下所示:


2020-05-11 10:47:55.633 4036-4181/json.chao.com.wanandroid I/WanAndroid-LOG: │ [MainActivity.java | 193 | lambda1initEventAndDataMainActivity] foreNetUseData: 4 MB2020-05-11 10:47:55.652 4036-4181/json.chao.com.wanandroid I/WanAndroid-LOG: │ [MainActivity.java | 197 | lambda1$MainActivity] totalNetUseData: 8 MB

四、网络请求流量优化

1、常见使用网络的场景

用户头像

Android架构

关注

还未添加个人签名 2021.10.31 加入

还未添加个人简介

评论

发布
暂无评论
深入探索 Android 网络优化(三、网络优化篇,flutter页面跳转卡