转载自http://bbs.51testing.com/thread-1199231-1-2.html
我之前的APP性能测试是基于服务端的,这里收藏一个基于手机的专项测试。

Android篇

  1. 性能测试
    Android性能测试分为两类:1、一类为rom版本(系统)的性能测试
    2、一类为应用app的性能测试
    Android的app性能测试包括的测试项比如:
    1、资源消耗
    2、内存泄露
    3、电量功耗
    4、耗时
    5、网络流量消耗
    6、移动终端相关资源利用率
    7、帧率
    8、渲染等等…

工具:
(工具的原理都是基于调用android底层的一些api来获取到测试所用到的值)GT等

测试方法:
1、设计场景 :手工或自动化场景
2、获取数据:可获取的数据包括:内存、cpu、电量功耗、hprof(内存泄露分析文件)、响应时间等等。。。。配合手工或自动化场景来获取数据(最好多取几次而且每次配合不同的设备看平均值)作为最后的对比分析
3、结果分析 :拿到数据后分析哪些模块的数据异常再去Check code定位问题的原因

Android系统的几种场景状态:
1、空闲状态: 指打开应用后,点击home键让应用后台运行,此时应用处于的状态叫做空闲
2、中等规格和满规格状态:中等规格和满规格指的是对应用的操作时间的间隔长短不一,中等规格时间较长,满规格时间较短

1.1 内存篇
背景知识:
C/C++申请的内存空间在native heap中,而java申请的内存空间则在dalvik heap中。这个是因为Android系统对dalvik的vmheapsize作了硬性限制,当java进程申请的java空间超过阈值时,就会抛出OOM异常(这个阈值可以是48M、24M、16M等,视机型而定),可以通过adb shell getprop | grep dalvik.vm.heapgrowthlimit查看此值。也就是说,程序发生OMM并不表示RAM不足,而是因为程序申请的java heap对象超过了dalvik vmheapgrowthlimit。也就是说,在RAM充足的情况下,也可能发生OOM。

这样的设计似乎有些不合理,但是Google为什么这样做呢?这样设计的目的是为了让Android系统能同时让比较多的进程常驻内存,这样程序启动时就不用每次都重新加载到内存,能够给用户更快的响应。迫使每个应用程序使用较小的内存,移动设备非常有限的RAM就能使比较多的app常驻其中。但是有一些大型应用程序是无法忍受vmheapgrowthlimit的限制的

实际上dalvik.vm.heapgrowthlimit和dalvik.vm.heapsize都是java虚拟机的最大内存限制,应用如果不想在dalvikheap达到heapgrowthlimit限制的时候出现OOM,需要在Manifest中的application标签中声明android:largeHeap=“true”,声明后应用dalvik heap达到heapsize的时候才会出现OOM

内存测试中的测试子项:
1)空闲状态下的应用内存消耗情况
2)中等规格状态下的应用内存消耗情况
3)满规格状态下的应用内存消耗情况
4)应用内存峰值情况
5)应用内存泄露情况
6)应用是否常驻内存
7)压力测试后的内存使用情况

内存问题现象:
1)内存抖动
2)大内存对象被分配
3)内存不断增长
4)频繁GC

内存数据获取:
1、各种linux命令(top、free、meminfo…)
2、通过dumpsys
adb shell dumpsys meminfo [pakagename | pid]
3、通过/system/xbin/procrank工具

adb shell procrank
说明:
VSS – Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
RSS – Resident Set Size 实际使用物理内存(包含共享库占用的内存)
PSS – Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
USS – Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存) USS 是针对某个进程开始有可疑内存泄露的情况,是一个程序启动了会产生的虚拟内存,一旦这个程序进程杀掉就会释放。不过USS需要通过root的手机。一般没有root的手机我们可以获取PSS。而PSS通过如下命令来获取:adb shell dumpsys meminfo |grep TOTAL

4、通过android提供的procrank
1)首先去google获取procrank、procmem、libpagemap.so三个文件
2)然后push文件,执行 adb push procrank /system/xbin adb push procmem
/system/xbin adb push libpagemap.so /system/lib
3)赋权 adb shell chmod 6755 /system/xbin/procrank adb shell chmod 6755 /system/xbin/procmem adb shell chmod 6755 /system/lib/libpagemap.so ,
4)在开启工具记录 adb shell procrank |grep packagename >/address/procrank.txt

5、通过android提供的ActivityManager的getMemoryInfo(ActivityManager.MemoryInfo outInfo)(这个方法是写一个简单的app去监控的时候用到的,轻便简单)

private void GetMemory()
{
final ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
ActivityManager.MemoryInfo info = new ActivityManager.MemoryInfo();
activityManager.getMemoryInfo(info);
Log.i(tag,“系统剩余内存:”+(info.availMem >> 10)+“k”);
Log.i(tag,“系统是否处于低内存运行:”+info.lowMemory);
Log.i(tag,“当系统剩余内存低于”+info.threshold+“时就看成低内存运行”);
}
MemTotal: 所有可用RAM大小。 MemFree: LowFree与HighFree的总和,被系统留着未使用的内存。
Buffers: 用来给文件做缓冲大小。 Cached: 被高速缓冲存储器(cache memory)用的内存的大小(等于diskcache
minus SwapCache)。 SwapCached:被高速缓冲存储器(cache
memory)用的交换空间的大小。已经被交换出来的内存,仍然被存放在swapfile中,用来在需要的时候很快的被替换而不需要再次打开I/O端口。
Active: 在活跃使用中的缓冲或高速缓冲存储器页面文件的大小,除非非常必要,否则不会被移作他用。 Inactive:

在不经常使用中的缓冲或高速缓冲存储器页面文件的大小,可能被用于其他途径。 SwapTotal: 交换空间的总大小。 SwapFree:

未被使用交换空间的大小。 Dirty: 等待被写回到磁盘的内存大小。 Writeback: 正在被写回到磁盘的内存大小。
AnonPages:未映射页的内存大小。 Mapped: 设备和文件等映射的大小。 Slab:

内核数据结构缓存的大小,可以减少申请和释放内存带来的消耗。 SReclaimable:可收回Slab的大小。
SUnreclaim:不可收回Slab的大小(SUnreclaim+SReclaimable=Slab)。
PageTables:管理内存分页页面的索引表的大小。 NFS_Unstable:不稳定页表的大小。

1、运行Monkey进行压力测试:
adb shell monkey -p cn.microinvestment.weitou --pct-touch 100 --ingore-crashes --throttle 1000 -s 100 -v -v 50

2、监控内存值,如果出现过大等递增异常则保存HPROF文件(hprof文件是Java 虚拟机的Heap快照)用于分析查看应用内存的命令:
adb shell dumpsys meminfo cn.microinvestment.weitou(进程名)
如果发现内存过大,则保存HPROF文件:adb shell am dumpheap <进程名> <保存路径>

3、分析hprof文件
用工具MAT来查看,首先还要这个HPROF文件转换成MAT可读的文件
在Android SDK tool里面有个hprof-conv命令:
hprof-conv <原HPROF文件路径> <转换后的HPROF路径>
hprof-conv a.hprof b.hprof

4、用MAT工具打开转换后的HPROF文件
一般选择Leak Suspects Report(通过SQL语句来查询对象有没有被释放掉,如果有多个相同的对象,则会存在内存泄露的问题)

1.2 CPU篇
CPU测试中的测试子项:
1)空闲状态下的应用CPU消耗情况
2)中等规格状态下的应用CPU消耗情况
3)满规格状态下的应用CPU消耗情况
4)应用CPU峰值情况
CPU数据获取:
1)adb shell dumpsys cpuinfo | grep packagename
2)top命令
adb shell top -m 10 -s cpu #查看占用cpu最高的前10个程序(-t 显示进程名称,-s 按指定行排序,-n 在退出前刷新几次,-d 刷新间隔,-m 显示最大数量)
adb shell top | grep PackageName > /address/cpu.txt

1.3 流量篇
概念:
中等负荷:应用正常操作
高负荷:应用极限操作
流量测试中的测试子项:
1、应用首次启动流量值
2、应用后台连续运行 2 小时的流量值
3、应用高负荷运行的流量峰值
4、应用中等负荷运行时的流量均值

获取流量数据:
1、tcpdump+wireshark
2、/proc/net/目录下相关文件
cat /proc/net/dev 获取系统的流量信息
3、查询应用的pid: adb shell ps | grep tataufo #如:31002
通过PID获取该应用的流量数据: adb shell cat /proc/31002/net/dev
(wlan0代表wifi上传下载量标识, 单位是字节可以/1024换算成KB, 打开手机飞行模式再关掉就可以将wlan0中的值初始化0)
4、查询应用的pid: adb shell ps | grep tataufo #如:31002
通过PID获取UID:adb shell cat /proc//status
通过UID获取:adb shell cat /proc/net/xt_qtaguid/stats | grep 31002
5、通过adb shell dumpsys package来获取应用的uid信息,然后在未操作应用之前,通过查看 :
adb shell cat /proc/uid_stat/uid/tcp_rcv
adb shell cat /proc/uid_stat/uid/tcp_snd
获取到应用的起始的接收及发送的流量,然后我们再操作应用,再次通过上述2条命令可以获取到应用的结束的接收及发送的流量,通过相减及得到应用的整体流量消耗
6、Android代码:Android的TrafficStats类

1.4 功耗篇
功耗测试中的测试子项:
1、手机安装目标APK前后待机功耗无明显差异
2、常见使用场景中能够正常进入待机,待机电流在正常范围内
3、长时间连续使用应用无异常耗电现象

功耗测试方法:
方法一:软件
1、采用市场上提供的第三方工具,如金山电池管家之类的。
2、就是自写工具进行,这里一般会使用3种方法:
1)基于android提供的PowerManager.WakeLock来进行
2)比较复杂一点,功耗的计算=CPU消耗+Wake lock消耗+数据传输消耗+GPS消耗+Wi-Fi连接消耗
3)通过 adb shell dumpsys battery来获取
3、battery-historian(google开源工具)

方法二:硬件
一般使用万用表或者功耗仪安捷伦进行测试,使用功耗仪测试的时候,需要制作假电池来进行的,有些不能拔插电池的手机还需要焊接才能进行功耗测试

1.5 GPU篇(FPS)
概念:
过度绘制: 界面显示的activity套接了多层而导致
帧率:屏幕滑动帧速率
帧方差: 屏幕滑动平滑度
**FPS:**Frames Per Second 每秒显示的帧数 根据人眼的生理结构,帧率高于24时就被认为是连贯的。对于游戏画面30fps是最低能接受的,60fps逼真感,如果帧率高于屏幕刷新频率就是浪费。要达到30fps,每帧所占用的时间要小于33毫秒

GPU测试中的测试子项:
1、界面过度绘制
2、屏幕滑动帧速率
3、屏幕滑动平滑度
过度绘制测试:(人工进行测试)
打开开发者选项中的显示GPU过度绘制(Debug GPU overdraw)

验收的标准:
1、不允许出现黑色像素
2、不允许存在4x过度绘制
3、不允许存在面积超过屏幕1/4区域的3x过度绘制(淡红色区域)

屏幕滑动帧速率测试:
方法一:
1.手机端打开开发者选项中的启用跟踪后勾选Graphics和View
2.启动SDK工具Systrace,勾选被测应用,点击Systrace,在弹出的对话框中设置持续抓取时间,在trace taps下面勾选gfx及view选项
3.手工滑动界面可以通过节拍来进行滑动或者扫动,帧率数据会保存到默认路径下,默认名称为trace.html
4.将trace.html文件拷贝到linux系统下通过命令进行转换,生成trace.csv文件
grep ‘postFramebuffer’ trace.html | sed -e ‘s/.]\W//g’ -e ‘s/:.*$//g’ -e ‘s/.//g’ > trace.csv
5.用excel打开文件计算得到帧率

方法二:
硬件的方法,打开高速相机,开启摄像模式,录制手工滑动或者扫动被测应用的视频,再通过人工或者程序数帧的方法对结果进行计算得到帧率
屏幕滑动平滑度的测试:
方法如同帧率测试,唯一的差异就是最后的结果计算公式的差异

捕获app帧率(android流畅度FPS测试):
1、打开手机开发者选项,勾选GPU显示配置文件(系统会记录保留每个界面最后128帧图像绘制的相关时间信息)
2、adb shell dumpsys gfxinfo com.xxx.xxx > zinfo.txt

3、结果数据分析
Profile data in ms部分:
Draw: 创建显示列表的时间(DisplayList),所有View对象OnDraw方法占用的时间
Process: Android 2D渲染引擎执行显示列表所花的时间,View越多时间越长
Execute:将一帧图像交给合成器(compsitor)的时间,较小

其他工具:
GameBench 测试android app的FPS工具
Gfxinfo 查看app绘制性能工具

APP性能测试——基于手机的专项测试相关推荐

  1. 摄像头防水性能测试软件,手机摄像头防水测试/手机摄像头气密性检测方法分享...

    原标题:手机摄像头防水测试/手机摄像头气密性检测方法分享 手机作为通讯消费产品,已成为了人们日常生活的必须品,伴随着光电及科学技术的发展,手机在原有通讯功能的基础上又新增多种功能,例如数码照相.看电视 ...

  2. android下的app性能测试应主要针对那些方面,如何开展?

    如何开展安卓手机下的App性能测试,对于优秀的测试人员而言,除了要懂得性能测试的步骤流程外,还应该懂的性能测试的一些其他知识,比如性能测试指标.各指标的意义,常用的性能测试工具.如何查看结果分析等等知 ...

  3. Android app 性能测试以及专项测试

    1. 性能测试 Android性能测试分为两类: 1.一类为rom版本(系统)的性能测试 2.一类为应用app的性能测试 Android的app性能测试包括的测试项比如: 1.资源消耗 2.内存泄露 ...

  4. 功能测试(八)—— APP之专项测试、性能测试、性能测试工具SoloPi

    目录 APP测试要点 目标 一.APP专项测试 1.1 兼容性 1.2 安装 1.3 卸载 1.4 升级 1.5 干扰测试(交叉事件测试) 1.6 Push推送 1.7 用户体验 二. 性能测试工具 ...

  5. 手机APP测试之专项测试

    前言 说到专项测试,大家的第一反应可能是流量测试.电量测试.弱网络测试等及其对应的专项测试工具.除了以上,关于专项测试我们还要知道: 1) 我应该在什么阶段去做专项测试. 2) 每个阶段做什么. 3) ...

  6. app常见的专项测试以及面试题

    1.为什么进行专项测试? 手工测试之后,自动化测试之后,接口测试,性能测试之后,线下环境.预发布环境都没有问题了,测试工作看似完整,但是到了用户生产环境,安装使用过程中还是有很多之前没有预料的问题被反 ...

  7. 移动App测试实战—专项测试

    转自:http://www.51testing.com/html/58/n-3713758.html 我们在进行了手工的功能测试之后,也开发了一些自动化测试用例,并且做了性能测试之后,测试工作看似比较 ...

  8. APP性能测试的6项关键指标及测试获取手段

    如何把rom测试和手机预装APP测试得更好,用户体验.流畅度.功耗.启动时长等指标是中兴努比亚手机产品线最关注的层面.本文将从APP性能维度.性能测试平台等维度全面讲解中兴努比亚APP专项性能测试和监 ...

  9. python自动化(四)app自动化:7.专项测试讲解

    一.常见的测试手段 二.专项测试的种类 三.APP的启动性能 1.启动性能介绍 启动分为冷启动和热启动,首页启动. 冷启动:应用程序首次启动,进程首次创建并加载资源的过程: 热启动:应用程序启动后点& ...

最新文章

  1. 使用 Pandas、Jinja 和 WeasyPrint,轻松创建一个 PDF 报表
  2. html手机端全屏显示和溢出问题
  3. 【MyBatis】学习纪要六:动态SQL
  4. echarts柱状图间距调整_Excel每天学个统计图(1)-折线柱状图
  5. windos手工扩展分区
  6. Android系统(245)---SystemServer进程的创建流程
  7. POJ 1716 Integer Intervals【差分约束】
  8. nodejs(koajs)设置中文cookie无效
  9. 2060年未来人KFK的问答
  10. 计算机病毒的危害有,电脑病毒有什么危害
  11. 外文文献翻译一条龙 -对于毕设翻译贼有用
  12. 计算机科学与因果关系,因果关系,概率和时间
  13. 第12课:如何理解技术管理者(上)
  14. html 百度网盘的布局,百度网盘披露5G布局:打造个人云操作系统!
  15. Oracle数据库如何干净的删除
  16. gs 标准不变的前提应变
  17. 盛迈坤电商:自然流量怎么样打造爆款
  18. vs2008 控制台程序在win2000上无法运行的 提示缺少dll等问题
  19. 关于蓝牙DIY设计+18个详细案例
  20. Centos7下安装Seafile实现私有网盘

热门文章

  1. 网络协议-DNS与Hosts
  2. 冒泡算法java代码实现
  3. Android混淆篇 small-video-record(ffmpeg)视频压缩框架混淆
  4. mysql中where语句的不等于操作
  5. uniapp登录授权获取微信手机号组件封装
  6. 多项式分解 java
  7. iOS 加载GIF图片
  8. android graphview使用
  9. 单8通道数字控制模拟电子开关CD4051
  10. 2021年质量员-装饰方向-岗位技能(质量员)最新解析及质量员-装饰方向-岗位技能(质量员)试题及解析