Android App性能评测分析-网络流量篇

1、 前言

移动互联网发展到现在,虽然用户的联网方式已经完成了3G/4G网络依赖到Wifi依赖的转变,但是过多以及没有经过处理的网络请求,会消耗用户的网络流量,造成用户流量费用(金钱)的损失,高流量的消耗必然导致非WIFI场景用户的流失,流量测试在性能评测中势必会占较大的权重。下面会根据实际app性能测试案例,展开进行app性能评测之网络流量的分析和总结。

2、 流量测试方法

2.1 流量理解

运营商替我们的手机转发数据报文,数据报文的总大小(字节数)即流量,这里的数据报文包含手机上下行的报文。由于数据报文采用IP协议传输,运营商计算的流量一般是包含IP头的数据报文大小

2.2 流量数据获取

流量获取方式对比总结如下:

流量获取.png

下面将会简单介绍这三种统计方法,会重点介绍TCP收发长度统计,因为该方法会在我们移动端APP流量测试中最常用到

2.2.1 抓包测试法

原理
流量测试最直接的方法就是抓包。在App运行期间,通过抓包工具如Tcpdump+wireshark把手机收发的所有报文度抓取下来,再计算收发报文总大小,即App消耗的流量。
操作方法:操作方法网上一搜教程一大堆,篇幅也较长,在这里不做具体介绍。
优势:数据准确
劣势:tcpdump有个问题,就是它捕捉到的流量是系统层面的,我们很难区分捕捉得到的流量数据是否都是当前apk产生的,所以如果我们需要测试某一个App消耗的流量需要禁用其他APP的连网权限,需要ROOT,操作起来步骤也比较长,如果追求高效率不推荐使用该方法。

2.2.2 安卓自身提供的TCP收发长度统计功能

原理:一般APP和后台服务器之间的通信都是基于TCP的,所以我们可以利用此统计来测试我们APP的流量,而且安卓提供的该统计功能是按照APP纬度来统计的。
优势:不需要禁止其他app的连网权限而且手机不需要ROOT,操作步骤简单,获取数据相对准确。
劣势:这种方式只能获取TCP协议的流量,UDP的没有计算。
操作步骤
1)使用ps命令查看所测app的uid

获取uid.png

关于UID,简单地进行下说明。在Linux系统中,UID表示的是User Identifier,主要用于表示是哪位用户运行了该程序。但在Android系统中,由于Android系统本身就为单用户系统,这时UID就被赋予了新的使命,主要用于实现数据共享。具体地,Android系统为每个应用都分配了一个UID,不同apk的UID几乎都是互不相同的,而对于不同UID的apk,不能共享数据资源。之所以用“几乎”,是因为有时候同一厂家会存在多个产品,并且希望能在多个apk之间实现数据共享,这个时候,便可通过在menifest配置文件中指定相同的sharedUserId,然后在Android系统中安装应用时便会分配相同的UID。

2)进入/proc/uid_stat/10850目录,cat获取当前tcp_snd和tcp_tcv的初始值

shell@OnePlus:/ $ cat /proc/uid_stat/10853/tcp_rcv

shell@OnePlus:/ $ cat /proc/uid_stat/10853/tcp_rcv

3)此时可以开始测试了,测试完成后再次获取tcp_snd和tcp_tcv的值
4)所测时间内的流量计算
发送流量:tcp_snd_new-tcp_snd_old=2032150-893233=1128917bytes
接收流量:tcp_rcv_new-tcp_rcv_old=18648825-1350829=17297996bytes

注意:测试前记录下数字,测试完后减去记录的数字就是流量大小。单位bytes,这个数据是累加的,除非卸载应用才会被删除。否则会一直增加。另外这种方式只能获取TCP协议的流量,UDP的没有计算。

所以也可以用下面的命令获取到
其中第6和8列为 rx_bytes(接收数据)和tx_bytes(传输数据)包含tcp,udp等所有网络流量传输的统计,一个uid可能对应多个 进程,所以这有两行流量是累加的就求和就行,这种方法只能再Android6.0以下手机上操作。

shell@OnePlus:/ $ cat /proc/net/xt_qtaguid/stats | grep 10853

流量查询.png

2.2.3 第三方工具

原理:通过系统API来获取基本的流量数据。TrafficStats类提供了多个方法获取不同角度的流量数据,例如腾讯Gt、网易Emmagee、平安测试助手等
优势:简单快捷
劣势
(1)这种方法统计不到一些系统的DNS等流量,还有不使用接口封装的模块产生的流量会被遗漏
(2)目前安卓6.0以上手机不再提供该API,所以安卓6.0以上手机均无法通过第三方工具获取流量数据

2.3流量测试场景

流量可以从用户使用的相关性角度分为:一类是用户的操作直接导致的流量消耗;另一类是后台,即在用户没有直接使用情况下的流量消耗。所以会分以下几种测试场景

2.31页面流量测试

这种是基于用户的操作直接导致的流量消耗而进行的页面流量测试,也是最基本的测试场景

2.3.2 切换至后台运行时流量测试

CPU空闲时,停留在主界面不退出,打开网络然后锁屏,24小时后查看流量变化

为什么需要测试产品的背景流量?在不操作 APP 的情况下,发现一天中每个时间段的流量都是不一样的,即上午的一小时消耗的流量可能就与下午的一小时消耗的流量不一样。因为 APP 的后台运行机制, APP 后台运行时的流量一般都是按照时间策略触发的,每天的各个时间段的发包频率是不一样的,基于这种机制,我们就需要测试 24 小时 APP 的背景流量。

2.3.3 随机流量测试

APP在操作运行时,按照设置的时间规律,比如每隔1小时后查看流量变化,看流量的变化走势,尝试从后台运行角度分析具体耗费流量的原因

3、XX银行流量性能评测结果分析

3.1 总览

此次质量开放平台-评测中心(http://fit-stg1.jryzt.com/Hyperion-server/html/index.html)的性能测试的采集的流量主要是针对场景页面的流量测试,个人认为实际上APP流量测试的场景远不止于页面,应该更倾向于面向整个APP的包大小、报文协议、更新机制、配置机制、心跳机制,后台服务耗费流量方向进行流量的测试及分析。

各场景流量统计及得分对比.png

从流量对比看,行业竞品均值为432.4KB,90分位约114.8KB,75分位约357.5KB,中位数约700.9KB,25分位约2832.2KB。【榕商Bank】各场景页面平均流量为43KB,看平均值表现优秀,页面耗费最大的流量为141.563KB,未超过200K。仔细分析可以看出首页加载是相对耗费流量较大的页面,这个页面仍然有可优化的空间。

3.2 首页流量分析

根据抓包及代码段分析显示APP启动到首页加载完成是一个预加载和异步加载的过程。

(1) 启动到首页加载完成网络请求密集,请求内容丰富,部分资源重复请求消耗流量。

请求了相关配置信息、启动页广告、个推、磁贴配置信息、商城理财产品列表,运营广告Banner、F后端接口,广告BANNER位、插件信息、任意门、厨房、百度地图SDK(talkingdata、灰度升级)等林林总总加起来就有40+个网络请求,加载的数据+广告页一共有1.7M左右,这说明了我们的APP首页设计的内容比较丰富,部分资源重复请求,所以耗费流量较多,这是产品设计问题以及信息未做缓存处理导致,建议优化。

(2)PushService在后台消耗流量

每隔1分钟、5分钟、10分钟通过ADB命令可以查看到,首页加载完成后在在TAB各个页签之间切换不产生任何数据交互。但是PushService大约每隔1分钟就要耗费2000byte的流量,为了保证消息的及时性,PushService会一直开着,所以如果为了让用户少消耗流量,建议在APP启动时应该提醒用户是否开启推送服务。

流量查询.png

(3)心跳机制耗费流量?

理论上讲,频繁的心跳发送会耗费流量。
根据网上的一些说法, 中移动2/3G下, NAT超时时间为5分钟, 中国电信3G则大于28分钟, 理想的情况下, 客户端应当以略小于NAT超时时间的间隔来发送心跳包。

心跳周期(即网络空闲定时器的超时时间)过长,则服务器端要等比较长的时间才能检测到连接断线;心跳周期过短时虽然能够很快检测到连接断线,但是消耗在心跳包上的网络资源会过大。

但是我们的APP设置的心跳周期为5分钟,5分钟未操作锁屏时,当用户点亮屏幕的时候,会做一次心跳唤醒,这个5分钟时间是在合理范围内,而且心跳机制会比轮询机制更减少流量的耗费,心跳机制主要作用是防止NAT超时, 其次是探测连接是否断开,不可缺少,不能为了流量优化而牺牲功能。
另外,如果APP和服务器实时性数据传输要求不高的话,可以不使用心跳发包维持长连接,不然就会带来流量的不合理耗费。

4、App端耗流量场景问题及排查思路

1.后台接口是否返回冗余数据

例如理财产品理财列表接口一般会返回理财产品相当多的信息,其中这些信息有50%的字段是不需要展现给用户的,其实这就可以考虑在接口设计的时候与前端开发约定好将这部分后端返回的数据作为冗余数据,后续不再返回给前端,减少流量的消耗。
另外APP端和服务器端的每个接口的数据结构都尽量简单,每个字段对应的内容也应该尽量简短。

2.相关图片和视频资源是否进行Gzip压缩后上传

HTTP协议上的Gzip编码是一种用来改进WEB应用程序性能的技术,用来减少传输数据量大小,减少传输数据量大小有两个明显的好处:
可以减少流量消耗;
可以减少传输的时间。

3.图片格式处理是否得当:一般来说WebP格式>JPG>PNG

同样的照片,采用WebP格式可大幅节省流量,相对于JPG格式的图片,流量能节省将近 25% 到 35 %;相对于 PNG 格式的图片,流量可以节省将近80%。最重要的是使用WebP之后图片质量也没有改变。

  1. App中需要加载的图片是否按需加载

App中需要加载的图片按需加载,列表中的图片根据需要的尺寸加载合适的缩略图即可,只有用户查看大图的时候才去加载原图。不仅节省流量,同时也能节省内存

5.网络请求方面:是否合并网络请求,减少请求次数

APP端应该尽量减少向服务器端发送请求的次数,能合并的接口尽量合并;每发一次请求,双方就都需要至少向对方发送一次HTTP的头字段数据;如果连接断开了,还要多个和服务器的握手过程;这些都会多消耗网络流量。

6.是否进行网络缓存

对服务端返回数据、图片,JS进行缓存,设定有效时间,有效时间之内不走网络请求,减少流量消耗。但由于手机存储空间有限,也需要控制整个缓存大小,并给用户提供清理缓存的选项。

7.是否采用客户端的轮询来获取一些信息的查询

采用客户端的轮询来获取一些信息的查询会消耗流量,应该使用服务器推送的方式;

8.数据更新是否采用增量方式

数据更新采用增量,而不是全量,仅将变化的数据返回,客户端进行合并,减少流量消耗;
非 WiFi 情况下,对于 APP 界面展示的数据,在 APP 后台运行时尽量不去拉取。

9.是否针对不同网络类型设计不同的访问策略

比如使用非WIFI网络进行大图、视频资源查看,是否会提醒用户当前操作会耗费过多的流量,是否需要切换到WIFI场景进行浏览

参考:
Android性能优化典范《Network Performance》
《移动App性能评测与优化》
Android端消息推送总结:http://www.52im.net/thread-195-1-1.html
腾讯原创分享(二):如何大幅压缩移动网络下APP的流量消耗(上篇):http://www.52im.net/thread-696-1-1.html
《Protobuffer和json深度对比》

时间: 2024-08-29 11:46:27

Android App性能评测分析-网络流量篇的相关文章

Android App性能评测分析-内存篇

1.内存了解 在Android App的性能优化的各个部分里,内存方面的知识较多且不易理解,内存的问题绝对是最令人头疼的一部分,需要对内存基础知识.内存分配.内存管理机制等非常熟悉,才能排查问题. 1.1 了解进程的地址空间 在32位操作系统中,进程的地址空间为0到4GB,这里主要说明一下Stack和Heap:Stack空间(进栈和出栈): 由操作系统控制,其中主要存储函数地址.函数参数.局部变量等等,所以Stack空间不需要很大,一般为几MB大小. Heap空间: 它的使用由程序员控制,程序员

Android App性能评测分析-cpu占用篇

1.前言 很多时候在使用APP的时候,手机可能会发热发烫.这是因为CPU使用率过高,CPU过于繁忙,会使整个手机无法响应用户,整体性能降低,用户体验就会很差,也容易引起ANR等等一系列问题.以下会根据实际app性能测试案例,展开进行app性能评测之CPU使用率的分析和总结. CPU使用率原理理解 在Linux系统下,CPU利用率分为用户态.系统态.空闲态,分别表示CPU处于用户态执行的时间,系统内核执行的时间,和空闲系统进程执行的时间. 平时所说的CPU利用率是指:CPU执行非系统空闲进程的时间

Android App性能评测分析-启动时间篇

1.前言 随着项目版本的迭代,App的性能问题会逐渐暴露出来,而好的用户体验与性能表现紧密相关,性能问题从应用的启动优化开始,下面会根据实际app性能测试案例,进行app性能评测之启动时间的分析和总结. 2.App启动方式了解 通常来说, 一个App启动也会分如下三中不同的状态: 冷启动 当启动应用时,后台没有该应用的进程,这时系统会重新创建一个新的进程分配给该应用,这个启动方式就是冷启动,也就是先实例化Application 冷启动的流程即为App启动流程的全过程, 需要创建App进程, 加载

Pury — 一个新的 Android App 性能分析工具

本文讲的是Pury - 一个新的 Android App 性能分析工具, 手机应用存在的目的,就是在帮助用户做他们想做的事情的同时,提供最好的用户体验 -- 而用户体验的重中之重是应用的性能.但有时候开发者们却以性能为借口,既没有达到既定目标,又写着低质量并难以维护的代码.在这里我想引用 Michael A. Jackson 的一句话: "程序优化守则第一条:别去做它.程序优化守则第二条(仅限于专业人员):别去做它,现在还不是时候." 在开始任何优化之前,我们要先认清问题的症结所在.

移动App性能评测与优化

实战 移动App性能评测与优化 TMQ专项测试团队 编著  图书在版编目(CIP)数据 移动App性能评测与优化/ TMQ专项测试团队编著. -北京:机械工业出版社,2016.9 (实战) ISBN 978-7-111-54826-3 I. 移- II. T- III. 移动终端-应用程序–程序测试–研究 IV. TN929.53 中国版本图书馆CIP数据核字(2016)第213174号 本书通过六个专题方向介绍腾讯公司移动互联网事业群在移动应用性能评测优化方面的实战经验,涉及内存.电量.流畅度

优化Android App性能?十大技巧必知!

http://blog.csdn.net/qijianke2014/article/details/40041331 无论锤子还是茄子手机的不断冒出,Android系统的手机市场占有率目前来说还是最大的,因此基于Android开发的App数量也是很庞大的.那么,如何能开发出更高性能的Android App?相信是软件开发公司以及广大程序员们头疼的一大难题.今天,就给大家提供几个提高Android App性能的技巧. 高效地利用线程 1.在后台取消一些线程中的动作 我们知道App运行过程中所有的操

《jQuery与JavaScript入门经典》——2.5 分析网络流量

2.5 分析网络流量 调试JavaScript时,常用的一个极具价值的Firebug工具是网络流量分析器.要使用网络流量分析器,可单击Firebug中的标签Net(网络),如图2.25所示.它显示从浏览器向Web服务器发送的每个请求的信息,让您能够更深入地了解当前传输的数据.当前是否发送了请求以及请求的顺序是否正确. 图2.25显示了加载网页amazon.com涉及的网络流量.发出的请求很多,每个请求都在流量列表中占据一行.对于每个请求,都显示了如下信息. URL:请求的URL很有用.您可右击U

基于WebSphere Commerce的电子商务应用性能优化(3) 网络流量瘦身建议

网络流量瘦身建议 浏览器端用户所感受到的响应时间受很多因素影响,最主要的来的三个方面: 服务器端的内容生成时间,受服务器端硬件计算能力和服务器的应用程序性能影响 网络上传输数据的时间,受网络带宽和所传输数据的大小影响 客户端渲染时间,受客户端浏览器性能和客户端程序性能影响 服务器端和客户端的性能我们在本系列文章的其他部分中有讨论.本部分着重讨论如何减少网络传输时间 .用户与服务器的交互不可避免要在网络上传输数据.尤其是近年来 WEB2.0 等技术的采用,越来越多的交互 和渲染工作转移到浏览器端进

Android App调试内存泄露之Cursor篇_Android

最近在工作中处理了一些内存泄露的问题,在这个过程中我尤其发现了一些基本的问题反而忽略导致内存泄露,比如静态变量,cursor关闭,线程,定时器,反注册,bitmap等等,我稍微统计并总结了一下,当然了,这些问题这么说起来比较笼统,接下来我会根据问题,把一些实例代码贴出来,一步一步分析,在具体的场景下,用行之有效的方法,找出泄露的根本原因,并给出解决方案. 现在,就从cursor关闭的问题开始把,谁都知道cursor要关闭,但是往往相反,人们却常常忘记关闭,因为真正的应用场景可能并非理想化的简单.