Android网络优化

背景

互联网时代, App作为于用户交互的端, 服务都是由Server提供的. 而App与Server的交互依赖于网络, 故而网络优化, 是我们的App优化中不可缺少的一个优化项,App网络质量的好坏直接影响着用户的体验。

概述

网络优化的方向主要是流量优化质量优化线下测试以及线上监控方案,本文对网络优化方面的知识做了一个全面总结,主要内容如下:
在这里插入图片描述在这里插入图片描述在这里插入图片描述

1、网络优化的三个要点

多维

网络优化应该是多维的,流量消耗网络质量,而不单单只是其中一个方面

精准

在做网络流量统计时,我们要做精准度量,如果只是获取了具体消耗了多少的值,对于我们定位和解决问题是没有太大的帮助,因为这个值只能表明用户用了多少流量。
如果线上用户反馈 App 消耗流量较多,但是我们不知道这个用户总共使用了 App 多长时间的话,那就不好定位问题所在,如果用户使用 App 的时间比较长,那消耗流量多一些很可能是正常的。
又比如用户反馈 App 在后台消耗流量比较多,但是我们只统计了整体的值,那就无法断定 App 在后台运行时到底消耗了多少流量。

监控

针对网络优化,我们应该建设全面且完善的网络监控体系,不能只监控一个指标,假如只监控网络请求成功率,那我们就只能知道用户大概的网络使用情况,这种粗粒度的监控没办法帮助我们找出并解决问题的根源。
比如线上用户使用了某个功能使用了 1000 次,然后出现了 1 次异常,而且用户点击重试后就恢复正常了。
这样单从数据上来看的话,网络请求的成功率还是比较高的,但是只通过成功率一个值是无法知道这一次异常出现的原因,也就无法避免后续出现这类异常。

2、网络优化的两个维度

流量维度

流量维度是 App 在一段时间内流量消耗的精准度量
流量消耗大不仅对用户有影响,对公司的运营成本也有影响,比如带宽、服务器数量、CDN 等方面的开支,而且网络请求密集对手机耗电量也有一定的影响。

在流量维度上,我们要做到区分类型、监控异常、上报日志。

  • 区分类型

我们不仅要知道用户在某个时间段内的具体流量消耗,还要知道用户在不同网络类型(流量、WiFi)下的流量消耗、区分 App 在前台和在后台时的流量消耗。
只有积累了不同维度的数据,才能快速断定和解决问题。

  • 监控异常

对于流量统计,我们不仅要知道用户的流量消耗均值,还要知道线上用户消耗流量的异常率。

这里的异常分为三种:

  • 流量消耗过多
  • 请求次数过多
  • 下载文件过大

这三个都是我们要注意的异常。

  • 上报日志

最理想的情况,就是我们对所有的网络请求,在本地都有一个完整的监控,每一个请求的 Request 和 Response 相关的所有信息都全部记录下来。
服务端可以下发指令控制客户端上传这些数据,客户端也可以在相关数据超过阈值后主动上报

质量维度

网络请求的质量直接影响了用户的真实体验,如果网络请求速度慢或请求成功率比较低,都会导致不好的用户体验。

对于网络请求质量的监控,可以从下面几个维度进行区分,以便后续能快速定位和解决问题。

  • 请求时长
  • 请求成功率
  • 长尾率(时长>3s的请求成功的接口占比)
  • 失败率
  • Top 失败接口
  • 长连接传化率(辅助指标)
  • httpdns转化率(辅助指标)
网络优化的两个误区
  • 只关注一个维度

    只关注一个维度比如流量消耗或者质量,忽视了其他维度。

  • 忽略个体数据

    还有就是做网络监控时只关注均值和整体的数据,忽略了个体的数据。
    比如前面提到的请求成功率的例子,从整体上来看成功率非常高,但是这种数据无法帮助我们改善单次请求。

3、三个线下测试工具

对于线下测试环境,我们要有一个正确的认识,线下测试是为了把问题尽可能在上线前暴露出来,在线下测试环节,我们要注意下面 4 点。

  • 网络切换
  • 弱网/无网测试
  • 请求是否有误
  • 接口请求是否有误,比如传了过多的参数或传参不正确
  • 周期长

C 端的 App 到了稳定期后,用户可能高达几千万甚至更多,这时 App 功能一般是非常复杂的,而且包含了其他功能,比如性能监控等。
这些功能的网络请求往往不是实时上报的,所以我们在做流量消耗测试的时候,周期一般会很长,不能只是简单测 10 分钟。

我们要确保我们的 App 在切换网络、弱网或无网时做到下面这两点。

  • 不能中断流程
    有的 App 对安全性要求比较高,如果突然切换网络状态,会导致用户的登录态失效,也就是要用户重新登录。
    这时我们要注意重新登录后 App 会不会重新回到之前的流程中,不能中断用户正在进行的流程。
  • 关闭加载弹窗
    而且在弱网或无网状态下,一定要测试 Loading 弹窗是否会停止,如果不注意的话,在无网的情况下,应用的请求失败了,但是却没有关闭 Loading 弹窗,影响了用户的其他操作。
    如果对无网状态重视不足,就测不出这样的 Bug 。

下面我们来看 3 个常用的线下测试工具:

  • Network Profiler(在最新版本的Android Studio Flamingo中是Network Inspector,位于App Inspection下面)
  • Charles
  • Stetho
3.1 Network Profiler(Network Inspector)

Network Profiler(Network Inspector) 是 AS 自带的网络分析工具,它能显示实时网络活动,比如发送网络请求、接受的数据以及连接数等。
这里笔者使用的是Android Studio Flamingo,所以这里介绍的是Network Inspector。
Network Inspector 会在时间轴上显示实时网络活动,包括发送和接收的数据。Network Inspector 便于您检查应用传输数据的方式和时间,并适当优化底层代码。

1、在 Android Studio 导航栏中,依次选择 View > Tool Windows > App Inspection。在应用检查窗口自动连接到应用进程后,从标签页中选择 Network Inspector

可以看到连接视图(Connection View),右侧则是某个连接的信息,包括请求时间、响应、请求以及调用栈
在这里插入图片描述线程视图,显示应用的每个 CPU 线程的网络活动,你可以在此视图中检查各网络请求由哪些线程负责。
在这里插入图片描述规则视图,Rules 有助于测试应用在遇到不同状态代码、标头和正文等响应时的行为方式
在这里插入图片描述Response 部分,可以在将响应发送到应用之前对其进行修改,例如可以将规则设置为对具有特定状态代码的响应执行并修改该状态代码。
在这里插入图片描述修改 header

在 Header rules 部分中,可以创建多个子规则来添加或修改响应中的标头。

当创建多个标题规则时,使用规则表顶部的向上和向下箭头来更改标题规则的顺序,该顺序会影响修改后的响应标头,因为标头规则是按照它们列出的顺序应用的。

可以通过点击 Header rules 部分中的 + 添加规则,然后在 Add new header 部分中输入标题的名称和值 。
在这里插入图片描述修改 header ,可以在 Edit existing header 选项卡里指定要查找的 header 名称或值,输入要替换的header 名称或值。
在这里插入图片描述请求信息
在这里插入图片描述响应信息
在这里插入图片描述调用栈
在这里插入图片描述 Charles和Stetho这里就不介绍了,有兴趣的可以自己去了解

4、 线上监控的三个要点

在看获取网络流量前,我们先来看下线上监控的三个要点:服务端监控、客户端监控以及异常监控。
2.1 服务端监控

  1. 耗时统计维度

对于服务端的监控,我们要注意请求的耗时,而且耗时要分多个维度区分。

地域

具体是哪个省、哪个城市的请求速度比较慢;

时间段

版本

机型
  1. 失败率

服务端要统计失败率:

请求失败

业务失败

业务相关的失败也是失败,比如网络请求确实成功了,但是用户没有拿到自己需要的数据,对于失败率的统计要全面,这样衡量的指标才能更敏锐地感知线上的异常波动;
  1. Top 失败接口

同时在 APM 后台,我们最好统计一下一段时间内,比如 1 天或 1 周内,排行 Top 的失败接口或异常接口,每隔一段时间就进行一次统计,这样就能知道哪些接口不稳定,以便进行针对性的优化。

  1. 长尾率
    请求时长超过3s的接口占比
  2. 长连接转化率
    走长连接的接口占比
  3. httpdns的转化率
    走 httpdns的接口占比

2.2 客户端监控

客户端监控比服务端监控更关键,在客户端的监控则更全面,能拿到更多的数据。

我们要在线上监控的数据包括请求具体耗时、成功率、错误码以及图片加载每一步的耗时。

虽然图片加载耗时和成功率在服务端也是可以统计的,但是服务端拿到的数据不完整等,因为很多请求压根没有到服务端就失败了。

而且服务端传过来的数据加上网络通道的延迟时间,肯定比服务端统计到的时间要长,所以我们要在客户端也加上统计。

  1. API 监控

客户端能拿到请求的每一个步骤的信息,包括 DNS 解析时间、建立连接的时间、请求时间以及网络包大小等信息。

同时我们可以记录用户每一次网络请求的操作,比如具体请求了哪些接口,请求是否成功以及失败的原因,这些信息我们都能作为监控的基础信息传给 APM 服务端,在后面会介绍如何监控网络请求的每一步。
2. 图片监控

同时还要注意做图片监控,一张图片消耗的流量可能比 5 个甚至更多接口的数据还要多。
3. 网络容灾机制

假如某一天我们的用户量突然暴涨,按服务器可能是扛不住这个压力的,对于服务端来说,可以用备用服务器分流,避免把主服务器搞垮。

而我们客户端也可以做一个策略,就是在一定时间内,网络请求失败了多次时,就不再进行网络请求。
3.2 异常监控

异常监控的目的,是提升我们对异常的感知灵敏度,而不是被动等待用户反馈。

  1. 服务器防刷

在服务端,我们要判断是不是有人在刷我们的服务器,也就是恶意攻击,如果检测到有人在刷服务器,我们可以锁定 IP 拒绝这些 IP 访问。
2. 异常兜底

在客户端,我们可以加上主动预警能力,比如我们下载了一个超过设定值的文件,客户端在下载后就可以把这个结果上报给服务器,表明现在遇到了异常,需要研发同学进一步确认。

在一些场景下,服务端可能出现流量过多扛不住的情况,这时客户端可以做一个兜底策略,如果在一定时间内,比如 30 秒内,接口请求连续失败 5 次,那就不允许持续访问,同时把重试时间设长一些。
3. 单点问题追查

假如线上用户反馈 App 消耗流量过多,或者是在后台时消耗流量较多,我们都可以具体分析用户下的网络请求日志,以及下发命令查看具体时间段的流量消耗。

5. 三个线上监控方案

有的问题只在线上出现,在线下发现不了,比如在线下测试某个版本的时候,H5 包不一定是新版本,但是到了线上后,部分用户可能会被命中,然后下发了新版本的包。

而这些包如果没有经过压缩,这样的异常就无法在线下的测试环境中全部发现,只能通过线上监控发现。

下面我们来看下三个线上监控方案:

OkHttp 事件监听器
NetworkStatsManager
TrafficStats

这三个方案中 OkHttp 事件监听器能获取到的数据最细致,也最实用,而 NetworkStatsManager 和 TrafficStats 主要是用于获取流量消耗。

5.1 OkHttp 事件监听器
5.1.1 自定义事件监听器

结合 OkHttp 获取网络请求质量数据,OkHttp 给我们留了一个事件监听器 EventListener 回调,我们可以自己实现这个监听器,监听每一次的请求。

5.1.2 自定义 GlideModule

自定义 GlideModue 是为了监控图片加载的过程,下面我们来看下怎么监控 Glide 加载图片过程的耗时和相关数据。

5.1.3 OkHttp 最大并发请求数

关于请求的频率,我们可以看下 OkHttp 默认的请求池,在 OkHttp 的 Dispatcher 分发器中,有一个 executeService 线程池,它的核心池大小为 0 ,最大值是整型的最大值。

但这并不是意味着通过 OkHttp 发送的网络请求可以并发无数个,对于 IO 密集型任务我们可以多发送一些,因为这类任务对 CPU 消耗不大,但是我们还是要注意,单个 App 能创建的线程数也是有上限的。

5.1.4 区分前后台流量

之所以要在日志中区分前后台流量,是因为很多用户会担心 App 一直在后台消耗流量,如果粗粒度地只获取流量数据,是不知道这些流量有多少是 App 在后台运行时消耗的,这样的话不要说解决用户反馈的问题,就连定位问题都定位不了。

5.1.5 四步上传数据

下面是上报性能日志的大概的四个步骤。

后台任务

在 App 启动时,执行一个后台任务;

间隔统计

这个任务每隔一段时间(如 30 秒内)就获取网络数据;

自定数据

自己维护一份数据统计,给数据加上标志,记住用户在前后台的流量消耗总量;

上报数据

在合适的时机(如用户反馈、达到阈值、处于 WiFi 网络下)把数据上报到 APM 后台,这样对用户的流量就不会造成影响,而且数据也能作为流量治理依据;
5.2 NetworkStatsManager

NetworkStatsManager 是 API 23 后的流量统计管理器,它可以获取某个时段的流量信息,也可以获取不同网络类型下的流量消耗,它最大的不足就是用户体验比较差,需要用户开启“查看使用情况”权限。

下面是一些使用网络或对流量的消耗比较多的场景。

API 请求

升级包

各种升级的资源包,比如 App 升级包、WebView 使用的 H5 Zip 包、RN 使用到的 bundle 包等;

配置

在 App 做大后,还要用到各种配置信息,比如做 A/B 测试时使用的配置信息、运营活动下发的配置信息;

图片

图片是流量消耗的大户,图片的下载和上传都非常消耗流量;

监控

在 App 做大后,还会做各种监控功能,比如 APM 监控的各种数据都需要网络才能上传到服务端;
5.2.1 流量优化的三个要点

在讲怎么用 NetworkStatsManager 获取流量消耗前,我们要先了解下流量优化的三个要点。

  1. 不能只看绝对值

绝对值不能作为流量消耗偏高的唯一统计标准,不能说 App 消耗了 10M 的流量,那就要马上去优化。

绝对值的对比是没有意义的,比如用了 App 30 分钟,浏览了很多的商品或视频,那用了 10M 可能已经算少了。

  1. 对比竞品

那要以什么为标准呢?我们最好是对比竞品,对比两个 App 在相同的场景下的流量消耗。

比如和竞品一起跑一个发布评论的主流程,这里要注意,要保证两个 App 发布的评论是相同的,而且图片也是相同的,以保证变量是唯一的。

这样对比一下,如果我们和竞品的流量消耗差距比较大,那我们对流量优化的步伐,就应该加快一些,这个绝对值跟竞品的对比,应该结合使用。

  1. 设定预期

我们要判断一下新上功能的流量消耗,比如我们要预期是用户使用新功能后,单次消耗流量应该为 300K 左右,但是上线后超过了 300K 时,我们就要确认下流量消耗是否偏高。

6. 三个流量优化方案

6.1 数据缓存
6.1.1 OkHttp 缓存

如果我们仔细跟一下自己项目中的接口,就会发现很多对实时性没有那么高要求的接口,使用缓存不仅可以节约流量,而且能大幅提升数据访问速度。

我们常用的网络库,比如 OkHttp 和 Volley,都有比较好的缓存实践。

而且没做缓存对用户体验也不好,一般的 App 会在打开后显示一个无数据的界面,和展示上一次的数据相比,这个用户体验其实是比较差的。

6.1.2 过期时间与增量更新
  1. 过期时间

在服务端返回的数据中加上一个过期时间,这样我们每次请求的时候判断一下有没有过期,如果没有过期就不需要去重新请求。

  1. 增量更新

数据增量更新的具体思路,就是在数据中加上一个版本的概念,每次接收数据都进行版本对比,只接收有变化的数据。

这样传输的数据量就会减少很多,比如省市区和配置等数据比较少更新,如果每次都要请求省市区的数据,这就是在浪费流量。

6.2 数据压缩
  1. Gzip

对于 Post 请求,Body 是用 Gzip 压缩的,也就是请求的时候带上 Gzip 请求头,服务端返回的时候也加上 Gzip 压缩,这样数据流就是被压缩过的。
2. 压缩请求头

请求头也占用一定的体积,在请求头不变的情况下,我们可以只传递一次,以后都只需要传递上一次请求头的 MD5 值,服务端做一个缓存,在需要请求头中的某些信息时,就可以直接从之前的缓存中取。
3. 合并网络请求

每一个网络请求都会有冗余信息,比如请求头,而合并网络请求就可以减少冗余信息的传递;

6.3 图片压缩
  1. 缩略图

图片压缩的第一个手段,就是在列表中优先使用缩略图,因为展示原图会加大内存消耗和流量消耗,而且在列表中直接展示原图没有意义。

下面是原图和缩略图的对比大小,缩略图尺寸为原图的 50%,大小为原图的 10%。
在这里插入图片描述
2. WebP

图片压缩的第二个手段,就是使用 Webp 格式,下面是同一张图片在 PNG 格式和 WebP 格式下的对比,WebP 格式的大小为 PNG 格式的 51%。
在这里插入图片描述3. Luban

比如我们在上传图片的时候,做一个压缩比如在本地是一个 2M 的图片,完整地上传上去意义不大,只会增加我们的流量消耗,最好是压缩后再上传。
下面这张图片的原始大小为 1.6M,压缩后变成了 213KB,体积为原始大小的 13%。
在这里插入图片描述

7. 网络请求质量优化

在前面我们学习了网络请求流量优化,但是实际上,对用户体验破坏最大的是网络请求质量差,很多同学忽略了这点。

因为我们一般在开发或测试阶段,都是在公司用 WiFi 测试,网络质量比较好,假设我们的 App 在流量消耗上问题不大,但是用户经常反馈界面打不开、打开慢、图片加载不出来等问题。

这时用户很有可能会卸载我们的 App ,转向竞品,只有在网络请求质量高,用户体验好,继续使用我们的 App 时,用户才有可能遇到流量消耗的问题,所以网络质量优化比流量优化更关键。

网络质量优化的两个指标:

网络请求成功率
网络请求速度
(辅助指标:长尾率,长连接转化率,httdns转化率)

这两个指标都会影响用户体验,在介绍网络请求质量优化前,我们先来看下一个 Http 请求的过程。

发出请求

客户端发出一个请求,这个请求到达运营商的 DNS 服务器,然后被解析成对应的 IP 地址;

创建连接

第二步就是创建连接,会走 TCP 三次握手,然后根据 IP 地址找对对应的服务器,发送一个请求;

返回资源

服务器找到对应的资源,然后原路返回给客户端;

一个网络请求可以简单分为连接服务器 -> 获取数据两个部分。

其中连接服务器前还包括 DNS 解析的过程;获取数据后可能会对数据进行缓存

7.1质量优化方向
连接服务器优化策略
7.1.1 HttpDNS

首先来看怎么在发出请求这一步上优化,网络请求成功率与速度一上来就受 DNS 服务器的影响,如果我们的 DNS 解析到 IP 地址的过程被劫持或 DNS 解析慢,都会严重影响用户体验。

DNS 被劫持的结果就是用户得到的数据并不是我们真实想要提供给用户的数据,如果 DNS 解析慢,那用户等待的请求时间就会变长。

所以 DNS 优化是网络质量优化的第一步,我们使用 HttpDNS,绕过运营商域名解析过程,HttpDNS 不是使用传统的 DNS 协议,向 DNS 服务器的 53 端口发送请求,而是使用 Http 协议,向服务器的 80 端口发送请求。

这样做的好处有两个:

防劫持

降低 Local DNS 劫持,绕过运营商域名解析过程;

提升速度

降低平均访问时长,因为节省了一次解析过程;

腾讯云和阿里云都提供了 HttpDNS 服务,具体的实现可能看他们的官方文档。

  1. 不用域名,用 IP 直连

省去 DNS 解析过程,DNS 全名 Domain Name System,解析意指根据域名得到其对应的 IP 地址。

如 www.codekk.com 的域名解析结果就是 104.236.147.76。

首次域名解析一般需要几百毫秒,可通过直接向 IP 而非域名请求,节省掉这部分时间,同时可以预防域名劫持等带来的风险。

当然为了安全和扩展考虑,这个 IP 可能是一个动态更新的 IP 列表,并在 IP 不可用情况下通过域名访问。

  1. 服务器合理部署

服务器多运营商多地部署,一般至少含三大运营商、南中北三地部署。

配合上面说到的动态 IP 列表,支持优先级,每次根据地域、网络类型等选择最优的服务器 IP 进行连接。

对于服务器端还可以调优服务器的 TCP 拥塞窗口大小、重传超时时间(RTO)、最大传输单元(MTU)等。

7.1.2 Http 协议版本优化

刚刚说到了网络请求的第二步是创建连接,当中涉及 TCP 三次握手,这个过程是比较长的,如果每次请求都要走三次握手,那这个效率是比较低的。

所以 Http 的不同版本对这点的优化也非常多,下面是 Http 协议不同版本之间的主要区别。

Http 1.0

较老的版本,现在已经很少见到用这个版本的服务了,它最大的缺点就是 TCP 连接不复用,每个 TCP 连接只能发送 1 个请求,如果要请求别的资源,就必须重新建立一个连接。

TCP 创建连接的成本非常高,需要三次握手,并且在开始阶段发送速度比较慢,也就是 Http 1.0 的性能非常差。

Http 1.1

Http 1.1 的出现只比 1.0 晚了半年,它最大的变化就是引入了持久连接,从这个版本开始,是默认不关闭的,可以被多个网络请求复用,这样效率就有了很大的提升。

它还是有些缺陷,就是它虽然允许 TCP 复用,但是同一个 TCP 连接里面的所有数据通讯必须按顺序来,也就是处理完一个请求后,再响应下一个请求。

如果前面的网络请求比较慢,那后面的请求也只能等着。

Http 2.0

Http 2.0 是一个二进制协议,它最大的改进就是客户端和服务端可以同时发送多个请求和响应,不需要像 Http 1.1 一样按顺序请求,是一个双向的实时通信。

这点是 Http 2.0 相对于 Http 1.1 的最大的改进,大家以后要跟服务端配合时,有得选的前提下,尽可能选择高版本的 Http 协议。

使用qiuc协议
QUIC(Quick UDP Internet Connection)是谷歌推出的一套基于UDP的传输协议,它实现了TCP + HTTPS + HTTP/2的功能,目的是保证可靠性的同时降低网络延迟。因为UDP是一个简单传输协议,基于UDP可以摆脱TCP传输确认、重传慢启动等因素,建立安全连接只需要一的个往返时间,它还实现了HTTP/2多路复用、头部压缩等功能。
众所周知UDP比TCP传输速度快,TCP是可靠协议,但是代价是双方确认数据而衍生的一系列消耗。其次TCP是系统内核实现的,如果升级TCP协议,就得让用户升级系统,这个的门槛比较高,而QUIC在UDP基础上由客户端自由发挥,只要有服务器能对接就可以。

7.1.3 资本优化

最后一个优化方案就是砸钱,常见的手段有 CDN 加速、提高带宽、动静资源分离。

大家需要注意,使用 CDN 后,如果某个资源需要更新,更新完成后是需要清理缓存的,这些优化不涉及客户端,同时也不要忘了减少传输量,注意请求的时机和频率,这一条和我们前面讲到的流量优化相关。

获取数据优化策略
  1. 连接复用

节省连接建立时间,如开启 keep-alive。

对于 Android 来说默认情况下 HttpURLConnection 和 HttpClient 都开启了 keep-alive。只是 2.2 之前 HttpURLConnection 存在影响连接池的 Bug,具体可见:http://www.trinea.cn/android/android-http-api-compare/

  1. 请求合并

即将多个请求合并为一个进行请求,比较常见的就是网页中的 CSS Image Sprites。

如果某个页面内请求过多,也可以考虑做一定的请求合并,使用bff请求方式

  1. 减小请求数据大小

(1) 对于 POST 请求,Body 可以做 Gzip 压缩,如日志。

(2) 对请求头进行压缩

这个 Http 1.1 不支持,SPDY 及 Http 2.0 支持。

Http 1.1 可以通过服务端对前一个请求的请求头进行缓存,后面相同请求头用 md5 之类的 id 来表示即可。

  1. CDN 缓存静态资源

缓存常见的图片、JS、CSS 等静态资源。

  1. 减小返回数据大小

(1) 压缩

一般 API 数据使用 Gzip 压缩,下图是之前测试的 Gzip 压缩前后对比图。
在这里插入图片描述

(2) 精简数据格式

如 JSON 代替 XML,WebP 代替其他图片格式。

(3) 对于不同的设备不同网络返回不同的内容

如不同分辨率图片大小。

(4) 增量更新

需要数据更新时,可考虑增量更新。如常见的服务端进行 bsdiff,客户端进行 bspatch。

(5) 大文件下载

支持断点续传,并缓存 Http Resonse 的 ETag 标识,下次请求时带上,从而确定是否数据改变过,未改变则直接返回 304。

  1. 数据缓存

缓存获取到的数据,在一定的有效时间内再次请求可以直接从缓存读取数据。

关于 Http 缓存规则 Grumoon 在 Volley 源码解析最后杂谈中有详细介绍,可见:

http://codekk.com/blogs/detail/54cfab086c4761e5001b2542

其他优化手段

这类优化方式在性能优化系列总篇中已经有过完整介绍

  1. 预取

包括预连接、预取数据。

  1. 分优先级、延迟部分请求

将不重要的请求延迟,这样既可以削峰减少并发、又可以和后面类似的请求做合并。

  1. 多连接

对于较大文件,如大图片、文件下载可考虑多连接。

需要控制请求的最大并发量,毕竟移动端网络受限。

  1. 细分网络请求的各个阶段的耗时,对比较耗时的阶段进行优化
  2. 优化网络拦截器,对耗时的拦截器进行优化
  3. 优化Top失败接口
  4. 走socket长连接,提高接口走长连接的转化率
  5. 提高接口httpdns的转化率
  6. 针对特定业务进行接口优化
  7. 考虑IPV4和IPV6下的接口情况
  8. 考虑前台和后台接口的成功率和时延

参考文章
探索 Android 网络优化方法
关于 Android 网络优化你应该了解的知识点
探索 Android 网络优化方法
深入探索 Android 网络优化(二、网络优化基础篇)上
深入探索 Android 网络优化(三、网络优化篇)上
Android性能优化(七)网络优化
探索 Android 网络优化方法
Android 网络优化-DNS优化
使用 Network Inspector 检查网络流量

Android Studio Flamingo | 2022.2.1 发布,快来看看有什么更新吧

wings专栏
关注 关注
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android性能优化系列篇(五):弱网优化
m0_64420071的博客
10-18 1595
汇总了一下众多大佬的性能优化文章,知识点,主要包含: UI优化/启动优化/崩溃优化/卡顿优化/安全性优化/弱网优化/APP深度优化等等等~ 本篇是第五篇:弱网优化
Android 网络性能优化(4)弱网优化(1)
2401_83641634的博客
04-04 1027
算法知识点繁多,企业考察的题目千变万化,面对越来越近的“金九银十”,我给大家准备好了一套比较完善的学习方法,希望能帮助大家在有限的时间里尽可能系统快速的恶补算法,通过高效的学习来提高大家面试中算法模块的通过率。这一套学习资料既有文字档也有视频,里面不仅仅有关键知识点的整理,还有案例的算法相关部分的讲解,可以帮助大家更好更全面的进行学习,二者搭配起来学习效果会更好。部分资料展示:有了这套学习资料,坚持刷题一周,你就会发现自己的算法知识体系有明显的完善,离大厂Offer的距离更加近。
Android 网络性能优化(4)弱网优化
RikkaTheWorld
10-15 9007
1. 背景 移动端时段,手机网络的连接形态是无线的,即通过Wifi连接,在前面章节有提高过,无线连接的优点就是便捷,只要有信号就能上网。而它的缺点是不稳定,它没有像导线那样的抗干扰手段,而且离信号越远网络越差。手机用户几乎都能体验到网络不好的情况的。 而对于移动端开发来说,在网络不好的情况下进行交互,如果处理不好,会消耗宽带、浪费电量等资源问题,所以我们有必要解决弱网环境下会出现的问题。弱网优化需要解决的核心问题有两点: 移动网络环境如此复杂,我们如何确定当下就是弱网环境? 如果是弱网环境,我们应该如何提
Android 网络优化 Okhttp && Tcp && http网络优化
最新发布
xiaokangss的博客
04-29 580
若此时第一次的连接请求报文段延迟了一段时间后到达了服务器端,本来这是一个很早到达的失效的报文段,但是服务器端收到了该链接请求后误以为是客户端重新又发起了一次连接请求,于是服务器端发出确认应答报文段,并表示同意建立连接。
Android 网络优化
hugang的博客
12-21 1663
网络优化的主要手段有两种: 第一种是通过抓包工具找到我们网络请求耗时的地方,然后进行针对性的改进。 第二种是通过将用户的网络请求信息打印到日志,然后我们远程获取这些用户的日志来定位到具体哪些请求耗时高,这样做的好处是我们不用自己复现问题了。 这里我介绍下Fiddler抓包工具+Android Studio+夜神模拟器 的使用方法 Fiddler抓包工具设置 然后下载一个Android模拟器,比如夜神模拟器,然后配置它的网络 夜深模拟器经过以上配置后,在夜深模拟器上安装的APP的任何网络请求都会
networkstatsmanager
Andrio的博客
11-14 809
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { if(hasPermissionToReadNetworkStats()) { Log.e("Info","========222========="); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { ..
Android-入门教程-Android Studio-Network Inspector
深度安全实验室
02-18 1575
使用 Network Inspector 检查网络流量 | Android 开发者 | Android Developers
Android性能优化网络优化
qq_22060403的博客
07-10 317
网络优化主要从三个方面进行;1、速度 2、成功率 3、流量 一、 接口设计 API设计 1、App与Server之间的API设计要考虑网络请求的频次, 资源的状态等. 以便App可以以较少的请求来完成业务需求和界面的展示.。 2、从前我们传输数据使用XML, 后来使用JSON代替了XML, 很大程度上也是为了可读性和减少数据量(当然还有映射成POJO的方便程度). 3、Gzip压缩 使用Gzip来压缩request和response, 减少传输数据量, 从而减少流量消耗. 考虑使用Protoco..
Android性能优化.pdf
12-22
Android性能优化】是Android开发中的重要环节,涵盖了多个关键领域,包括ANR问题解析、crash监控方案、启动速度与执行效率优化、内存优化、耗电优化网络传输与数据存储优化以及APK大小优化。 **ANR问题解析**是...
Android splash 优化
08-04
总之,优化Android的Splash界面需要兼顾美观与性能,通过减少布局复杂性、异步处理、资源预加载等方法,可以显著提升启动速度,提高用户满意度。同时,利用Android Studio提供的工具进行性能分析,能够更有效地定位...
Android图片性能优化详解
08-27
Android应用开发中,图片性能优化是一个至关重要的环节,它直接影响到应用的用户体验和加载速度。本文主要探讨了Android平台上几种常见的图片格式及其优化方法。 首先,Android原生支持的图片格式包括JPEG、PNG、...
Android核心性能优化汇总
07-05
总结,Android性能优化是一个综合性的任务,涉及到UI、启动、崩溃、卡顿、安全、网络等多个方面。开发者需要结合系统提供的优化方案、第三方库以及各种工具,进行全方位的优化,以提供更优质、更稳定的应用体验。
Android优化技术详解
04-14
总结来说,"Android优化技术详解"涵盖了内存管理、UI优化、多线程处理、资源优化网络优化、电池管理以及性能监控等多个层面。开发者需全面掌握这些技能,以打造出运行流畅、用户体验优秀的Android应用。通过不断...
Android 项目优化笔记(三):首页
Sky的博客
10-29 281
###一、首页优化问题 那么首先回顾一下有关首页的优化建议: 角色切换方式 可以优化,如果更换的话可能需要 重新设计,且涉及逻辑较多,暂不更改。 用户登录时 提示用户选择角色。(Maybe) 角色切换可添加动画,用户操作时从左上角动画延伸至整个首页。Reveal Effect (揭露效果)。 MD 风格:头部 CoordinatorLayout + AppBarLayout + Toolbar,...
Android 性能优化网络优化
王永迪的专栏
04-17 4281
前言 随着移动网络的不断升级,客户端的网络传输由3G进化到Wifi、4G,且Wifi场景越来越多。虽然网络环境在变好,但也对网络的应用提出了更高的要求,会发现很多大厂都十分重视网络指标,如果技术人员不加以控制,在弱网、体验、包括服务器带宽、流浪方面都会造成不同程度的损失。 网络指标 流量 网络第一个影响的app指标当然是流量,在手机设置界面可以清楚查看到每个 app 耗费的流量,极端情况下会造成用...
移动端网络优化:移动端弱网优化
蔚可云的博客
04-12 2467
弱网优化需要解决的核心问题有两点: 1)移动网络环境如此复杂,我们如何确定当下就是弱网环境; 2)确定为弱网环境下,我们如何提升弱网下的成功率,降低弱网下的时延,进而提升用户的网络体验。 判断弱网的指标 首先我们来探讨下都有哪些指标会影响到网络的质量,包括httprtt,tcprtt,throughput,signal strength,bandwidth-delay product。 1)httprtt: httprtt(http Round-Trip Time)又名TTFB(Tim.
android 获取流量总数,NetworkStatsManager.querySummaryForDevice获取流量使用情况
weixin_39541681的博客
05-30 1237
querySummaryForDevice方法第一个参数0表示查手机流量,1表示查wifi流量。对于第二个参数subscriberId,如果是Android10系统,传null即可。以下代码在自己的小米8A和华为mate pad pro上有用。我也不是很懂,就是试出来这样可行,供有需要的人参考。plus.android.importClass('android.app.usage.NetworkS...
Android性能优化实战:网络缓存与资源管理
1. **网络请求优化**:网络数据缓存是关键,由于Android系统的HttpResponseCache默认关闭,这可能导致重复请求数据,降低效率。作者建议开启HttpResponseCache,以缓存网络数据,特别是常被访问的数据,如HTTP请求或...

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

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
写文章

热门文章

  • Android沉浸式状态栏,看完这篇就够了! 40129
  • Android ImageView的scaleType详解 27772
  • 解决“error: the requested upstream branch ‘origin/master‘ does not exist” 19261
  • OkHttp用法详解 15943
  • Lottie-Android详解 15268

分类专栏

  • Mac 1篇
  • git 9篇
  • Android 64篇
  • Java 22篇
  • NDK 1篇
  • C 3篇
  • 计算机基础
  • Flutter 2篇
  • Gradle 3篇
  • 计算机网络 5篇
  • Python 1篇
  • bash 1篇
  • 设计模式 2篇
  • Dart 1篇
  • 算法 7篇
  • SQLite 1篇
  • SQL

最新评论

  • OkHttp用法详解

    仵渊博: 大佬能不能这样考虑,常用的请求通过在代码中固定写死获取同一个Httpclient设置超时时间为10秒,不常用的通过方法重载进行配置,每次调用时手动传入超时时间参数,每次都构建一个httpClient

  • 解决“error: the requested upstream branch ‘origin/master‘ does not exist”

    程序战蛙阿宣: 牛牪犇逼,直接解决

  • Mac安装和卸载node和npm

    Hz144: 终于删干净了

  • OkHttp用法详解

    索石: 博主你好,看了你的这篇文章受益良多。另外有个问题想请教。我现在有两类请求不同配置信息的请求,A类请求超时时间10秒,占大多数,B类超时时间2秒,极个别,通过您的文章了解到可以通过client.newBuilder().build()方法为B类请求创建新的client,达到修改配置信息的目标,但是文章中也提到两个client是共享配置信息的,那么我是不是需要在每次做A类请求的时候都去修改这个配置信息?有没有方法使更改的配置信息只在某一次请求中生效?

  • 从github上clone代码时The unauthenticated git protocol on port 9418 is no longer supported解决方法

    adobase: 很有用 找了一上午 就这个有用表情包

大家在看

  • 重生之“我打数据结构,真的假的?”--3.栈和队列 346
  • 【成品论文】2024年华为杯研究生数学建模比赛E题高质量成品论文分享(点个关注,后续会更新 732
  • 链表(二) 找链表倒数第k个结点(详细文字推导) + 链表环(详细通俗思路) 333
  • 编写测试用例:策略、技巧与最佳实践 229
  • 一切皆是映射:深度Q网络(DQN)与知识图谱的融合研究

最新文章

  • Android实现文本链接可点击
  • Android设计规范及分辨率简介
  • RecyclerView导致父控件点击事件无效
2024年4篇
2023年5篇
2022年8篇
2021年30篇
2020年71篇
2019年1篇

目录

目录

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值

PHP网站源码宝安推广网站惠州百度网站优化排名永湖百度竞价宝安优化盐田外贸网站制作坑梓网站搜索优化民治建站大运建网站惠州网站优化按天计费福田阿里店铺托管木棉湾网站定制同乐阿里店铺运营坪山营销型网站建设松岗百度seo布吉网站优化按天收费石岩SEO按天计费平湖百搜标王福田百度关键词包年推广大鹏seo网站优化福永网络推广坪山网站关键词优化永湖网站定制坪山seo网站优化南澳网站关键词优化丹竹头如何制作网站广州模板制作坪地百搜词包横岗网站搜索优化同乐seo排名大浪百度标王歼20紧急升空逼退外机英媒称团队夜以继日筹划王妃复出草木蔓发 春山在望成都发生巨响 当地回应60岁老人炒菠菜未焯水致肾病恶化男子涉嫌走私被判11年却一天牢没坐劳斯莱斯右转逼停直行车网传落水者说“没让你救”系谣言广东通报13岁男孩性侵女童不予立案贵州小伙回应在美国卖三蹦子火了淀粉肠小王子日销售额涨超10倍有个姐真把千机伞做出来了近3万元金手镯仅含足金十克呼北高速交通事故已致14人死亡杨洋拄拐现身医院国产伟哥去年销售近13亿男子给前妻转账 现任妻子起诉要回新基金只募集到26元还是员工自购男孩疑遭霸凌 家长讨说法被踢出群充个话费竟沦为间接洗钱工具新的一天从800个哈欠开始单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#中国投资客涌入日本东京买房两大学生合买彩票中奖一人不认账新加坡主帅:唯一目标击败中国队月嫂回应掌掴婴儿是在赶虫子19岁小伙救下5人后溺亡 多方发声清明节放假3天调休1天张家界的山上“长”满了韩国人?开封王婆为何火了主播靠辱骂母亲走红被批捕封号代拍被何赛飞拿着魔杖追着打阿根廷将发行1万与2万面值的纸币库克现身上海为江西彩礼“减负”的“试婚人”因自嘲式简历走红的教授更新简介殡仪馆花卉高于市场价3倍还重复用网友称在豆瓣酱里吃出老鼠头315晚会后胖东来又人满为患了网友建议重庆地铁不准乘客携带菜筐特朗普谈“凯特王妃P图照”罗斯否认插足凯特王妃婚姻青海通报栏杆断裂小学生跌落住进ICU恒大被罚41.75亿到底怎么缴湖南一县政协主席疑涉刑案被控制茶百道就改标签日期致歉王树国3次鞠躬告别西交大师生张立群任西安交通大学校长杨倩无缘巴黎奥运

PHP网站源码 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化