2024年安卓最新深入探索 Android 网络优化(三、网络优化篇)上(1),2024年最新面试建议英语

最后

分享一份NDK基础开发资料

详解:Linux网络虚拟化技术

分享内容包括不限于高级UI、性能优化、架构师课程、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

5)、其它

  • 1、公司成本
  • 2、带宽、服务器数量、CDN
  • 3、耗电

2、网络优化误区

  • 1)、仅仅关注流量消耗,忽视其它维度。
  • 2)、仅仅关注均值、整体、忽视个体。

二、网络优化工具

1、Network Profiler

特点

  • 1)、显示实时网络活动:发送、接收数据及连接数。
  • 2)、需启动高级分析。
  • 3)、仅支持 HttpURLConnection 与 OkHttp

打开高级分析

Run => Edit Cofigurations => 界面最右边 Profiling => 打开 Enable advanced profiling (required for API level < 26 only)

使用 Network Profiler 调试 WanAndroid 网络请求

选中目标网络请求,可以看到在下方的 Connection View 一栏看到对应的网络数据,如下所示:

  • Size
  • Type
  • Status
  • Time
  • Timeline

选中 Connection View 特定的一条数据即可在右边看到该请求对应的网络数据。

Overview

该网络请求的预览信息

普通 Json 数据请求

图片加载请求

Response

Response Header 与 Body 信息

Request

Request Header 与 Body 信息

CallStack

网络请求的调用堆栈信息, 下图就是 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)、点击捕获->选项,打开捕获窗口
  • 网卡设备/流量/捕获过滤器,点击“开始”按钮开始抓包
  • 输出(指定缓存文件)/选项(显示、名称解析、自动停止抓包条件) 面板
  • 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.scr10.0.0.5 or ip.src192.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、线上流量获取方案

结尾

  • 腾讯T4级别Android架构技术脑图;查漏补缺,体系化深入学习提升

img

  • 一线互联网Android面试题含详解(初级到高级专题)

这些题目是今年群友去腾讯、百度、小米、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。并且大多数都整理了答案,熟悉这些知识点会大大增加通过前两轮技术面试的几率

img

有Android开发3-5年基础,希望突破瓶颈,成为架构师的小伙伴,可以关注我

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

案,熟悉这些知识点会大大增加通过前两轮技术面试的几率

[外链图片转存中…(img-Jl9GNeet-1715828542245)]

有Android开发3-5年基础,希望突破瓶颈,成为架构师的小伙伴,可以关注我

本文已被CODING开源项目:《Android学习笔记总结+移动架构视频+大厂面试真题+项目实战源码》收录

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值