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

简介: 1、 前言移动互联网发展到现在,虽然用户的联网方式已经完成了3G/4G网络依赖到Wifi依赖的转变,但是过多以及没有经过处理的网络请求,会消耗用户的网络流量,造成用户流量费用(金钱)的损失,高流量的消耗必然导致非WIFI场景用户的流失,流量测试在性能评测中势必会占较大的权重。

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深度对比》

目录
相关文章
|
13天前
|
开发工具 Android开发 Swift
安卓与iOS开发环境对比分析
在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统无疑是主角。它们各自拥有独特的特点和优势,为开发者提供了不同的开发环境和工具。本文将深入浅出地探讨安卓和iOS开发环境的主要差异,包括开发工具、编程语言、用户界面设计、性能优化以及市场覆盖等方面,旨在帮助初学者更好地理解两大平台的开发特点,并为他们选择合适的开发路径提供参考。通过比较分析,我们将揭示不同环境下的开发实践,以及如何根据项目需求和目标受众来选择最合适的开发平台。
28 2
|
8天前
|
Java 数据库 Android开发
一个Android App最少有几个线程?实现多线程的方式有哪些?
本文介绍了Android多线程编程的重要性及其实现方法,涵盖了基本概念、常见线程类型(如主线程、工作线程)以及多种多线程实现方式(如`Thread`、`HandlerThread`、`Executors`、Kotlin协程等)。通过合理的多线程管理,可大幅提升应用性能和用户体验。
25 15
一个Android App最少有几个线程?实现多线程的方式有哪些?
|
1天前
|
安全 Linux Android开发
探索安卓与iOS的安全性差异:技术深度分析
本文深入探讨了安卓(Android)和iOS两个主流操作系统平台在安全性方面的不同之处。通过比较它们在架构设计、系统更新机制、应用程序生态和隐私保护策略等方面的差异,揭示了每个平台独特的安全优势及潜在风险。此外,文章还讨论了用户在使用这些设备时可以采取的一些最佳实践,以增强个人数据的安全。
|
10天前
|
Java 数据库 Android开发
一个Android App最少有几个线程?实现多线程的方式有哪些?
本文介绍了Android应用开发中的多线程编程,涵盖基本概念、常见实现方式及最佳实践。主要内容包括主线程与工作线程的作用、多线程的多种实现方法(如 `Thread`、`HandlerThread`、`Executors` 和 Kotlin 协程),以及如何避免内存泄漏和合理使用线程池。通过有效的多线程管理,可以显著提升应用性能和用户体验。
30 10
|
18天前
|
IDE 开发工具 Android开发
安卓与iOS开发环境对比分析
本文将探讨安卓和iOS这两大移动操作系统在开发环境上的差异,从工具、语言、框架到生态系统等多个角度进行比较。我们将深入了解各自的优势和劣势,并尝试为开发者提供一些实用的建议,以帮助他们根据自己的需求选择最适合的开发平台。
24 1
|
24天前
|
API Android开发
Android P 性能优化:创建APP进程白名单,杀死白名单之外的进程
本文介绍了在Android P系统中通过创建应用进程白名单并杀死白名单之外的进程来优化性能的方法,包括设置权限、获取运行中的APP列表、配置白名单以及在应用启动时杀死非白名单进程的代码实现。
42 1
|
7天前
|
云安全 安全 网络安全
探索云计算与网络安全的共生之道在数字化浪潮席卷全球的今天,云计算作为信息技术的一大革新,正重塑着企业的运营模式与服务交付。然而,随着云服务的普及,网络安全与信息安全的挑战也日益凸显,成为制约其发展的关键因素。本文旨在深入探讨云计算环境下的网络安全问题,分析云服务、网络安全及信息安全之间的相互关系,并提出相应的解决策略,以期为构建一个更安全、可靠的云计算生态系统提供参考。
本文聚焦于云计算环境中的网络安全议题,首先界定了云服务的基本概念及其广泛应用领域,随后剖析了当前网络安全面临的主要威胁,如数据泄露、身份盗用等,并强调了信息安全在维护网络空间秩序中的核心地位。通过对现有安全技术和策略的评估,包括加密技术、访问控制、安全审计等,文章指出了这些措施在应对复杂网络攻击时的局限性。最后,提出了一系列加强云计算安全的建议,如采用零信任架构、实施持续的安全监控与自动化响应机制、提升员工的安全意识教育以及制定严格的合规性标准等,旨在为云计算的安全可持续发展提供实践指南。
26 0
|
20天前
|
存储 安全 算法
取证分析在网络安全中的关键作用
【8月更文挑战第31天】
24 0
|
20天前
|
机器学习/深度学习 运维 监控
|
20天前
|
Android开发 iOS开发 C#
Xamarin:用C#打造跨平台移动应用的终极利器——从零开始构建你的第一个iOS与Android通用App,体验前所未有的高效与便捷开发之旅
【8月更文挑战第31天】Xamarin 是一个强大的框架,允许开发者使用单一的 C# 代码库构建高性能的原生移动应用,支持 iOS、Android 和 Windows 平台。作为微软的一部分,Xamarin 充分利用了 .NET 框架的强大功能,提供了丰富的 API 和工具集,简化了跨平台移动应用开发。本文通过一个简单的示例应用介绍了如何使用 Xamarin.Forms 快速创建跨平台应用,包括设置开发环境、定义用户界面和实现按钮点击事件处理逻辑。这个示例展示了 Xamarin.Forms 的基本功能,帮助开发者提高开发效率并实现一致的用户体验。
47 0