App架构师实践指南器之性能优化四

 

1、网络性能描述
节流针对流量,移动数据网络下直接关乎用户的money;节电针对电池电量,快,关乎用户体验。

1.1 Wi-Fi与蜂窝网络
---Wi-Fi,是一个基于IEEE802.11标准的无线局域网技术。
---蜂窝网(Cellular network),也称移动网络,是一种移动通信硬件架构,分为模拟蜂窝网络和数字蜂窝网络,常见类型有GSM、CDMA、3G、TDMA、4G等。

1.2 The Radio State Machine(无线设备状态机)
---Android下,典型3G网络下网络无线设备包括3种耗能状态,分别为Full Power(网络连接激活状态时,允许设备以最快的速率传输数据)、Low Power(中间状态,使用Full Power状态下50%的能量耗损)和Standby(备用,无网络处于活跃状态时候的能量消耗状态),三者切换状态如图9-12所示。


------Full Power> Low Power: Full Power下静止5s自动转换到Low Power。
------Low Power > Full Power:Low Power下重新联网,消耗1.5s转换到Full Power。
------Low Power > Standby: Low Power下静止12s自动转换到Standby。
------Low Power > Full Power: Standby下重新联网,消耗2s转换到Standby。

Android App中,任何一次网络请求无线网络都会转成Full Power状态,并且在整个网络传输过程中始终处于该状态,传输结束后,该状态还会保留5s,而Low Power对应有12s才会完整释放网络。以Android官方到例子为例,假设某App需要在60s内进行3次网络请求,每次网络请求消耗1s,那么可能有两种方案:一种是3次请求分开,下一次请求等上一次请求结束后再进行;另一种是3次请求合并,一次请求完成3次数据请求,那消耗时间分别如下,对应结果如图9-13所示。
---方案1:(网络访问1s+高耗能状态切换等待5s+低耗能状态切换等待12s+无耗能2s)x 3 = 高耗能18s+低耗能36s+无耗能6s。
---方案2:网络访问1sx3 + 高耗能状态切换5s + 低耗能状态切换12s + 无耗能40s = 高耗能8s + 低耗能12s + 无耗能40s

1.3网络状态监测
Android中,可以通过ConnectivityManager(android.net.ConnectivityManager)类的getActiveNetworkInfo来获取当前网络状态,如下代码是一个基站信号和网络测试项目编写的判断网络状态函数。

2、网络性能测试和流量度量
网络性能测试工具本质就是流量的测试和度量,而流量度量包括消耗流量、上行流量(Tx)、下行流量(Rx)等。

2.1 网络性能测试工具
2.1.1 抓包工具。网络流量监测和统计,最基础的是抓包工具,如TcpDump、Fiddler、Wireshark、Charles等,在网络性能测试和度量中也是一种精准流量测试的方法,还可以通过抓包工具拦截具体的请求,模拟弱网环境。
2.1.2 除了抓包工具外,Android平台下,还可以借助Android Monitor(Network)和DDMS两个工具对网络流量数据进行统计分析。
---Android Monitor(Network)。Google Studio提供的Android Monitor工具可以直观地监测当前App特定进程的网络使用现状(以流量/时间的方式呈现Tx、Rx数据,如图9-14所示,非常直观)


---DDMS。DDMS中的Network Traffic tool/Network Statistics(Android 4.0,API 14+)也可以对网络请求进行监控来获取网络详细使用情况,与Android Monitor(Network)不同,Network Traffic tool中包含一个Tag的功能,如图9-15所示,可以结合TrafficStats类中的setThreadStatsTag(int tag)方法完成网络类型标记。网络类型可以区分网络请求类型,一般可以将App网络请求分为用户发起的(用户手动)、应用代码本身发起的和远程服务器发起的(推送等)3种,定义3种Tag分别设置int参数即可,对应清除标记用clearThreadStatsTag()。


2.2网络流量度量
2.2.1 Android 2.2以上(API 8+),可以通过TrafficStats类(android.net.TrafficStats)对网络流量数据进行获取统计,其中实用函数如下。
---getTotalRxBytes():总接收流量。
---getTotalTxBytes():总发送流量。
---getMobileRxBytes():通过Mobile的总接收流量(不包括Wi-Fi)。
---getMobileTxBytes():通过Mobile的总发送流量。
---getUidRxBytes():Uid进程的总接收流量。
---getUidTxBytes():Uid进程的总发送流量。

2.2.2 除了TraficStats类外,或者系统是Android2.2以下,可以尝试直接读取流量数据的存放目录进行获取,一般在proc/uid_stat//目录中,包括tcp_rcb和tcp_snd两部分,分别表示接收流量(下行流量)和发送流量(上行流量)。
---获取上行流量: cat /proc/uid_stat/uuid/tcp_snd
---获取下行流量: cat /proc/uid_stat/uuid/tcp_rcv
---uuid获取:cat /data/system/packages.list |grep pkg_name
---上述tcp_rcv和tcp_snd得到的是App当前时刻累计流量数值,如果需要获取特定时段具体流量值(如启动流量数据等),可以将上述命令运行两次,差值即为阶段流量值。

2.2.3 TrafficStats类主要针对的是总流量,如果要分析具体流量成分,可以使用NetWorkTraffic tool中提到的setThreadStatsTag(int)是一种不错的方案,需要在代码中具体标记,标记的流量数据在Android中存放的目录为/proc/net/xt_qtaguid/stats,所以也可以通过adb shell手动读取。

3、网络性能优化
3.1网络性能优化最佳实践
--- 请求与连接相关。
---请求合并/请求频率控制。将多个请求/批量请求合并成一个,进行请求捆绑,控制请求频率,减少请求次数,特别是单个页面中多次数据等查询,尽量一次完成。
---超时和重试。为单个请求设置超时时间,当网络不稳定等因素导致当前网络服务失败时,结合业务适当对GET类请求考虑网络重试。
---数据预取。网络模块三耗电耗流量大户之一,要尽量考虑减少网络模块激活次数。除了控制请求频率,多次请求合并外,还可以进行网络数据预取,即在未使用网络数据前先缓存部分数据。具体预取数据对多少还要根据网络类型(2G/3G/4G或Wi-Fi)指定不同的规则。
---用IP代替域名。这可以省去DNS解析过程时间消耗。当然,考虑到安全性和扩展性,该IP最好是一个动态更新到IP列表。
---多线程和延迟传输。自线程,多任务网络请求,适当的时候进行请求暂存,延迟传输。
---采用服务端推送方式代替轮询,尽量避免轮询,“polling the server is horrible”。如果特定业务场景下必须轮询,也要采取一定策略来控制轮询频率,如无数据更新时增加轮询时间间隔,不同网络状态下采取不同轮询时间间隔等。

3.2 传输和数据相关
---数据格式。传输数据时,可以根据具体业务选择数据格式,例如可以用Json代替XML,或者用Protocol Buffer代替Json,适当选择Json库等。

---数据缓存。网络数据实现本地缓存,避免每次都重新获取,可以大幅度地加速数据等读取和访问。Android中如果采用原生网络接口,HttpResponseCache默认都是关闭的,需要在代码中手动开启,第三方网络库如OkHttp、Volley等基本都提供了完整的网络缓存方案。
------与UI相关的网络数据,可以借助数据存储(如Android中的Preference、SQLite等)缓存,下次请求前显示上次数据,获取新数据后,再更新旧数据,可以避免空白页面的不良体验。
------网络缓存建议采取多级缓存,如用内存+文件的二级缓存策略,Android中可以使用LruCache和DiskLruCache实现二级缓存。

---数据压缩。压缩数据可以减少网络传输的数据量,针对图片数据,选择合适的图片格式,适当牺牲图片质量。针对一般数据或payload,采取序列化/反序列化算法,优化数据格式等。
------POST请求,Bodykey 适当采取压缩,如GZip来压缩日志等。
------请求头压缩。采用SPDY和HTTP2.0直接压缩,HTTP1.1可以通过服务端对前一个请求头进行缓存,后面相同请求头用md5表示即可。


3.3 网络环境相关。
---网络环境可以简单地分为两方面:一方面是国内,主要是不同网络类型的切换(2G/3G/4G或Wi-Fi),带宽和延迟差异很大;另一方面为国外,即在国外访问国内带宽和速度问题。
---国内网络环境问题。要根据不同网络类型进行对应修改,例如请求超时时间设置,请求频率的控制等,同时可以监听设备状态(休眠/充电/网络)来对网络业务采取不同策略,特别是弱网环境下采取必要措施(如界面不自动加载图片,请求延迟提交等),同时需要进行专门的测试,防止Crash等异常。
---海外网络性能问题基本上可以通过资本手段解决,如CDN加速、提高带宽、实现动静资源分离等。

3.4 图片专栏。
---网络传输一般都会涉及图片,图片等下载和传输是不可避免的问题。

---Google官方减少图片下载大小的建议。
------减少PNG格式图片的大小关键是减少构成图像每行像素中使用的唯一颜色数,为防止有损编码,可以通过优化索引格式和矢量量化来平衡有损压缩和图像质量。
------为减少JPG格式图片的大小,可以尝试使用不同编码格式生成较小文件,同时稍微减少质量,以便得到更好的压缩。
------WepP格式的图片是Android 4.2.1 API 17+支持的新的图片格式,同时支持有损和无损压缩,可以创建更小、更丰富的图像,推荐使用。
------服务端图片可以同时支持多分辨率的原图和缩略图来适应App端端多样性。

3.5页面呈现和后台服务。
---页面呈现(页面加载)优化,主要针对涉及网络数据的页面,如何更快地呈现用户这一过程优化。
------将网络请求提前到页面初始化呈现之前(如Android的Activity中,一般会先加载View,初始化各种控件后,再开始请求网络,可以尝试将开始网络请求提前到加载View之前,因为一般setContentView、init各种控件耗时是几十毫秒级别,处理得好,这个顺序调整可以将网络数据请求提前几十毫秒)。
------如果当前页面不是首页面,可以将网络请求提前到前一个页面跳转时触发。

3.6 后台服务。
---减少后台联网行为,减少后台启动次数。
---减少统计相关数据。联网消耗数据中,统计数据有可能是很大一部分,这块往往容易被忽略掉,过多的统计打点和数据上传往往是非必须的。

3.7 网络性能优化实例
如果项目已成熟,或者需要特定的专项网络优化,如下是两个优化实例。
---腾讯TMQ专项测试团队在《移动App性能评测与优化》中阐述了用鱼翅分片的方法对手机QQ网络上传速度的优化,涉及长连接、分片大小的选择、分片和速度的权衡、分片传输成功率以及失败重传策略的详细阐述。
---《携程App的网络性能优化实践》阐述了基于携程具体业务的Native和Hybrid混编客户端xia网络性能优化和实践,涉及DNS、TCP连接、读写操作、传输Payload大小、复杂国内外网络情况等问题的优化建议,同时提到业界网络性能优化的新方向---Google的SPDY协议和QUIC协议。

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值