前言
互联网时代, App做为于用户交互的端, 能够说实质上是一个界面, 制品的业务, 服务都是由于Server供给的. 而App与Server的交互依赖于网络, 故而网络优化, 亦是咱们的App优化中不可缺少的一个优化项
1、网络连接对用户的影响
App的网络连接针对用户来讲, 影响非常多, 且都数状况下都很直观, 直接影响用户对这个App的运用体验. 其中较为重要的几点: 流量 App的流量消耗对用户来讲是比较敏锐的, 毕竟流量是花钱的吗. 此刻大部分人的手机上都有安装流量监控的工具App, 用来监控App的流量运用. 倘若咱们的App这方面无掌控好, 会给用户欠好的运用体验.电量 电量相针对用户来说, 无那样显著. 通常用户可能不会太重视. 然则如前文电量优化中说的那样, 网络连接(radio)是对电量影响很大的一个原因. 因此咱们亦要加以重视.用户等待 亦便是用户体验, 良好的用户体验, 才是咱们留住用户的第1步. 倘若App请求等待时间长, 会给用户网络卡, 应用反应慢的感觉, 倘若有对比, 有替代品, 咱们的App很可能就会被用户无情抛弃.
2、分析网络连接的工具
2.1 Network Monitor
Android Studio内置的Monitor工具中就有一个Network Monitor:
其中: Rx — R(ecive) 暗示下行流量, 即下载接收.Tx — T(ransmit) 暗示上行流量, 即上传发送.
2.2 网络代理工具
通常来讲, 网络代理工拥有两个功效: 截获网络请求响应包, 分析网络请求设置代理网络, 移动App研发中通常用来做区别网络环境的测试, 例如Wifi/4G/3G/弱网等.
代理工具非常多, 诸如Wireshark, Fiddler, Charles等, 这里不一一细说了
3, 那些方面取优化网络连接
简单来讲, 两个方面:
减少Radio活跃时间
1-1. 亦便是减少网络数据获取的频次. 1-2. 这就减少了radio的电量消耗, 掌控电量运用.
减少获取数据包的体积
2-1. 能够减少流量消耗 2-2. 亦能够让每次请求更快, 在网络状况欠好的状况下亦有良好表现, 提高用户体验.
那样, 详细应该从那些方面着手呢?
3.1 接口设计
API设计
App与Server之间的API设计要思虑网络请求的频次, 资源的状态等. 以便App能够以较少的请求来完成业务需要和界面的展示.
例如, 注册登录. 正常会有两个API, 注册和登录, 然则设计API时咱们应该给注册接口包括一个隐式的登录. 来避免App在注册后还得请求一次登录接口(有可能失败, 从而引起业务流程失败).
再例如, 上文说到的获取repo详情, 实质上请求了4个接口, 请求了repo的信息, forks列表, contributors列表, readme, 这是由于github供给的接口是尽可能单一职责的. 然而在咱们的实质研发中, 咱们的Server除了供给这些单一职责的小接口外, 最好还能组合一个满足客户端业务需要的repo详情接口出来.
Gzip压缩
运用Gzip来压缩request和response, 减少传输数据量, 从而减少流量消耗.
思虑运用Protocol Buffer代替JSON
从前咱们传输数据运用XML, 后来运用JSON代替了XML, 很大程度上亦是为了可读性和减少许据量(当然还有映射成POJO的方便程度).
Protocol Buffer是Google推出的一种数据交换格式.
倘若咱们的接口每次传输的数据量很大的话, 能够思虑下protobuf, 会比JSON数据量小非常多.
当然相比来讲, JSON亦有其优良, 可读性更高.
照片的Size
上面Network Monitor中看到的22s到27s之间的有多次请求, 且数据量还很大. 便是在获取照片资源.
照片相针对接口请求来讲, 数据量要大得多. 故而亦是咱们需要优化的一个点.
咱们能够在获取照片时通知服务器需要的照片的宽高, 以便服务器给出合适的照片, 避免浪费.
咱们此刻非常多机构的照片资源都是运用第三方的云存储服务的(七牛, 阿里云存储之类的).
以七牛为例, 能够在请求照片的url中添加诸如质量, 格式, width, height等path来获取合适的照片资源: <pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="java" cid="n57" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; bac公斤round-image: inherit; bac公斤round-position: inherit; bac公斤round-size: inherit; bac公斤round-repeat: inherit; bac公斤round-attachment: inherit; bac公斤round-origin: inherit; bac公斤round-clip: inherit; bac公斤round-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">imageView2/<mode>/w/<LongEdge>
/h/<ShortEdge>
/format/<Format>
/interlace/<Interlace>
/q/<Quality>
/ignore-error/<ignoreError>
</pre>
3.2 网络缓存
适当的缓存, 既能够让咱们的应用看起来更快, 亦能避免有些不必要的流量消耗.
3.3 打包网络请求
当接口设计不可满足咱们的业务需要时. 例如可能一个界面需要请求多个接口, 或是网络良好, 处在Wifi状态下时咱们想获取更加多的数据等.
此时就能够打包有些网络请求, 例如请求列表的同期, 获取Header点击率较高的的item项的详情数据.
可以经过有些统计数据来帮忙咱们定位用户接下来的操作是高概率的, 提前获取这部分的数据.
3.4 监听关联状态
经过监听设备的状态: 休眠状态充电状态网络状态
结合JobScheduler来按照实质状况做网络请求. 比方说Splash闪屏宣传照片, 咱们能够在连接到Wifi时下载缓存到本地; 资讯类的App能够在充电, Wifi状态下做离线缓存.
3.5 弱网测试&优化
除了正常的网络优化, 咱们还需思虑到弱网状况下, App的表现.
3.5.1 弱网测试
有几种方式来模拟弱网进行测试.
Android Emulator
创建和起步Android模拟器能够设置网络速度和延迟:
创建时:
起步时,运用emulator命令: <pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="java" cid="n85" mdtype="fences" style="box-sizing: border-box; overflow: visible; font-family: var(--monospace); font-size: 0.9em; display: block; break-inside: avoid; text-align: left; white-space: normal; bac公斤round-image: inherit; bac公斤round-position: inherit; bac公斤round-size: inherit; bac公斤round-repeat: inherit; bac公斤round-attachment: inherit; bac公斤round-origin: inherit; bac公斤round-clip: inherit; bac公斤round-color: rgb(248, 248, 248); position: relative !important; border: 1px solid rgb(231, 234, 237); border-radius: 3px; padding: 8px 4px 6px; margin-bottom: 15px; margin-top: 15px; width: inherit; color: rgb(51, 51, 51); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;">$emulator -netdelay gprs -netspeed gsm -avd Nexus_5_API_22
</pre>
运用网络代理工具
以Charles为例:
保持手机和PC处在同一个局域网, 在手机端wifi设置高级设置中设置代理方式为手动, 代理ip填写PC端ip位置, 端口号默认8888.
其他模拟弱网方式
倘若你恰好亦是iOS的研发者, Apple供给了Network Link Conditioner, 非常好用.
能够模拟的网络状况与以上类似:
倘若你运用Linux环境研发, 还能够试下facebook出的ATC.
3.5.2 弱网优化
利用以上工具模拟弱网, 在弱网状况下体验咱们的App. 通常来讲, 网络延迟在60ms内, 是OK的, 超过200ms就比较糟糕了. 咱们需要做的是在比较糟糕的网络环境下还能给用户较好的体验.
弱网优化, 本质上是在弱网的状况下能让用户流畅的运用咱们的App. 咱们要做的便是结合以上的优化项: 压缩/减少许据传输量利用缓存减少网络传输针对弱网(移动网络), 不自动加载照片界面先反馈, 请求延迟提交
例如, 用户点赞操作, 能够直接给出界面的点赞成功的反馈, 运用JobScheduler在网络状况较好的时候打包请求
有需要文中完整代码的朋友能够 私信发送 “底层源码”就可 免费获取
此刻私信还能够得到 更加多《Android 学习笔记+源码解析+面试视频》
最后我想说:
针对程序员来讲,要学习的知识内容、技术有太多太多,想要不被环境淘汰就仅有持续提高自己,从来都是咱们去适应环境,而不是环境来适应咱们
技术是无止境的,你需要对自己提交的每一行代码、运用的每一个工具负责,持续挖掘其底层原理,才可使自己的技术升华到更高的层面
Android 架构师之路还很漫长,与君共勉
|