移动端-Android客户端性能测试常见指标
rom版本的性能测试
⼀般关注功耗(不过 rom 版本的功耗测试跟应⽤的功耗测试会有所差异,当然只是⽤例设计⽅⾯的差异,⼯具仍然采⽤安捷伦电源仪进⾏)应⽤的性能测试
包括很多测试项,如启动时间、内存、CPU、GPU、功耗、流量等。
对于启动时间、内存、cpu ⼀般都使⽤外部提供的第三⽅⼯具来辅助测试,如GT、安测试,这些⼯具的原理都是基于调⽤ android 底层的⼀些 api 来获取到测试所⽤到的值,当然我们也可以采⽤其他⽅法,如使⽤ android 本⾝提供的⼀套 adb 即可完成上述测试。
对于 GPU、功耗等测试来说,⽤第三⽅⼯具测试得到的数值⼀般都不是很准确,这个时候我们需要引⼊硬件来进⾏测试了,GPU 可以采⽤⾼速相机来进⾏测试,功耗可以使⽤万⽤表或安捷伦电源仪来进⾏测试(ps:有硬件动⼿能⼒的可以DIY⼀个⼩板进⾏)
⼀、内存
关于内存测试需要引⼊空闲状态、中等规格、满规格的概念。
1、空闲状态
指打开应⽤后,点击home键让应⽤后台运⾏,此时应⽤处于的状态叫做空闲。
2、中等规格和满规格
指的是对应⽤的操作时间的间隔长短不⼀,中等规格时间较长,满规格时间较短。
接下来我们说说在内存测试中,存在很多测试⼦项,如下清单所⽰
1)空闲状态下的应⽤内存消耗情况
2)中等规格状态下的应⽤内存消耗情况
3)满规格状态下的应⽤内存消耗情况
4)应⽤内存峰值情况
5)应⽤内存泄露情况
6)应⽤是否常驻内存
7)压⼒测试后的内存使⽤情况
3、如何使⽤adb查看内存信息
1)查看所有内存信息
命令:dumpsys meminfo
例:
C:\Users\yijiayi>adb shell
shell@android:/ $ dumpsys meminfo
2)查看某个包的内存信息
命令:dumpsys meminfo pkg_name or pid
注:pid可以通过 adb shell top | grep app_name 来查
例:
C:\Users\yijiayi>adb shell
shell@android:/ $ dumpsys t.mobileqq
或
shell@android:/ $ dumpsys meminfo 1034(注:1034是pid)
重点关注如下⼏个字段:
(1) Native/Dalvik 的 Heap 信息
具体在上⾯的第⼀⾏和第⼆⾏,它分别给出的是JNI层和Java层的内存分配情况,如果发现这个值⼀直增长,则代表程序可能出现了内存泄漏。
(2) Total 的 PSS 信息
这个值就是你的应⽤真正占据的内存⼤⼩,通过这个信息,你可以轻松判别⼿机中哪些程序占内存⽐较⼤了。
查询内存
其他参数含义: dalvik : dalvik使⽤的内存 native : native堆上的内存,指C\C++堆的内存(android 3.0以后bitmap就是放在这⼉) other : 除了dalvik和native的内存,包含C\C++⾮堆内存······ Pss : 该内存指将共享内存按⽐例分配到使⽤了共享内存的进程 allocated : 已使⽤的内存free : 空闲的内存 private dirty : ⾮共享,⼜不能被换页出去的内存(⽐如linux系统中为了提⾼分配内存速度⽽缓冲的⼩对象,即使你的进程已经退出,该内存也不会被释放) share dirty : 共享,但有不能被换页出去的内存
⼆、CPU
1)CPU频率设置过⾼时会导致过热,过热导致耗电更严重,CPU频率设置过低导致⼿机滞后,应⽤处理缓慢同样会导致耗电。更多时候,⽤户
解决CPU超载问题只能关闭甚⾄卸载App,App就被Kill了!
注意:程序持续运⾏及操作过程中,内存不能⼀直增加,不然系统会⾃动kill掉该进程。
(1)空闲状态下的应⽤CPU消耗情况
(2)中等规格状态下的应⽤CPU消耗情况
(3)满规格状态下的应⽤CPU消耗情况
(4)应⽤CPU峰值情况
2)CPU的测试⽅法分为⼏类(使⽤adbshell脚本进⾏测试,查看Log数据):
1.使⽤android提供的adb shell dumpsys cpuinfo | grep packagename >D:\(获取指定进程使⽤cpu的详细信息)
2.使⽤top命令 adb shell top -n 1 | grep packagename>/ (获取指定进程使⽤cpu的详细信息,且只刷新⼀次)
3. cat /proc/cpuinfo 获取cpu 硬件信息
6. cat /proc/stat
例:查询QQ的CPU使⽤情况
三、流量
可以借⽤⽹易的开源⼯具:Emmagee,或者腾讯开发的⼯具:GT
流量测试,同样需要引⼊⼏个名词
中等负荷:应⽤正常操作
⾼负荷:应⽤极限操作
流量测试包括以下测试项:
应⽤⾸次启动流量提⽰
应⽤后台连续运⾏ 2 ⼩时的流量值
应⽤⾼负荷运⾏的流量峰值
应⽤中等负荷运⾏时的流量均值
流量测试⼀般都是⽤软件来进⾏的,这⾥我们⼀般分为2类:
1. 采⽤市场提供的第三⽅⼯具来进⾏测试,如流量宝之类的
2. ⾃研⼯具进⾏测试
⾃研⼯具进⾏测试⼀般包含 2 类⽅法,
龙门石窟位于哪个省
1. 通过 tcpdump 抓包,再通过 wireshake 直接读取包信息来获得流量
2. ⾸先获得被测应⽤的 uid 信息,可以通过 adb shell dumpsys package 来获取然后在未操作应⽤之前,我们可以通过查看 adb shell
cat /proc/uid_stat/uid/tcp_rcv adb shell cat /proc/uid_stat/uid/tcp_snd 获取到应⽤的起始的接收及发送的流量,然后我们再操作应⽤,再次通过上述 2 条命令可以获取到应⽤的结束的接收及发送的流量,通过相减及得到应⽤的整体流量消耗
四、电量
和竞品做对⽐测试,同⼀机型的测试机在不同时间,不同⽹络条件,不同功能使⽤的情况下分别测试电量使⽤情况。
命令:dumpsys battery
五、启动速度和滑动、界⾯切换速度
编写测试代码(AndroidInstrumentation),打桩到源码中,运⾏后通过log数据进⾏分析。
六、与服务器交互的⽹络速度
七、启动时间
关于应⽤的启动时间的测试,分为三类:
1. ⾸次启动
应⽤⾸次启动所花费的时间
2. ⾮⾸次启动
应⽤⾮⾸次启动所花费的时间
3. 应⽤界⾯切换
应⽤界⾯内切换所花费的时间
4、如何测试启动时间?
⽅法分为2类,⼀类为使⽤软件来测试,⼀类为使⽤硬件来测试。
1)使⽤ android 提供的 DisplayManager 来获取 activity 的启动时间吧,在这⾥我简单说下如何通过批处理来 DIY
商务签证通过⽇志过滤关键字 Displayed 来过滤所有 activity 所打印的,记录⽇志通过 adb logcat>/
然后使⽤find “Displayed” />/
通过 activity 名来过滤获取所测应⽤ find “ActivityName” />/
通过计算 activity 最后剩余的时间之和即可
人民的名义全集 下载2)除了 DisplayManager 的打印时间⽅法后,还有通过关注 am 的启动时间及 DisplayManager 打印的结束时间,通过两者时间之间想减也能得到应⽤的启动时间,还有可以通过 PowerManager 来计算打印时间,在应⽤启动的时候,我们可以关注 ActivityManager-Launch 的变化来计算应⽤的启动时间,还有可以通过截图统计启动时间,对于⾃研应⽤,最效率的莫过于直接在程序中插⼊打印时间的节点了
3)硬件测试⽅法,这⾥我们可以使⽤⾼速相机或者⼿机,采⽤录像的⽅法把应⽤启动过程给录制下来,然后通过⼈⼯数帧或者程序数帧的⽅式计算启动时间
查看页⾯启动时间:⼿机需要root
以启动camera为例
adb shell am start -diatek.camera/com.android.camera.CameraActivity
ubuntu@ubuntu:/media/disk/work/core$ adb shell am start -diatek.camera/com.android.camera.CameraActivity
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER]
diatek.camera/com.android.camera.CameraActivity }
Status: ok
Activity: diatek.camera/com.android.camera.CameraActivity
ThisTime: 2871
TotalTime: 2871
WaitTime: 2949
Complete
格式为adb shell am start -W 包名/全类名或叫activity名
打印的结果为
苹果手机nfc怎么复制门禁卡ThisTime 该activity启动耗时
TotalTime 应⽤⾃⾝启动耗时=ThisTime+应⽤application等资源启动时间
WaitTime 系统启动应⽤耗时=TotalTime+系统资源启动时间
在测试该启动时间时需要理解两个概念
冷启动:应⽤第⼀次启动
热启动:按back按键后再启动或⾮第⼀次启动切没有清除该应⽤后台或缓存数据
上⾯的数据为冷启动打印的数据,下⾯运⾏热启动的测试结果:
ubuntu@ubuntu:/media/disk/work/core$ adb shell am start -diatek.camera/com.android.camera.CameraActivity
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER]
diatek.camera/com.android.camera.CameraActivity }
Status: ok
Activity: diatek.camera/com.android.camera.CameraActivity
ThisTime: 1848
TotalTime: 1848
WaitTime: 1895
Complete
该命令具体实现在/frameworks/base/cmds/am/src/com/android/commands/am/Am.java,原理是跨Binder调⽤ActivityManagerService.startActivityAndWait() 接⼝,其中返回数据分别调⽤对应
startTime:调⽤startActivityAndWait()的时间点
endTime:调⽤startActivityAndWait()函数调⽤返回的时间点
WaitTime:调⽤startActivityAndWait()调⽤耗时。
再通过之间的计算得到
4)另外⼀种⽅法:
命令:
adb logcat -c && adb logcat -f /mnt/ -s tag
选项说明
-c 清屏
-f 指定运⾏结果输出⽂件,默认输出到标准设备(⼀般是显⽰器
-s 设置默认的过滤级别为Silent
tag 仅显⽰priority/tag
更多信息烦请参考 adb logcat -help
例:
先启动app,然后执⾏如下命令
C:\Users\laiyu>adb logcat -c && adb logcat -f /mnt/ -s ActivityMana
ger
⼋、GPU性能测试
关于GPU的⼏个名词,过度绘制、帧率、帧⽅差(过度绘制是指界⾯显⽰的 activity 套接了多层⽽导致。帧率是指屏幕刷新率。帧⽅差是指屏幕刷新帧间隔⽅差。)
对于 GPU 的测试主要包括以下⼏个测试⼦项
1)界⾯过度绘制:对于过度绘制的测试主要通过⼈⼯进⾏测试,通过打开开发者选项中的显⽰GPU过度绘制来进⾏测试(PS:只有android4.2及以上的版本才具备此功能),验收的标准为:
具有教育意义的电影1. 不允许出现⿊⾊像素
2. 不允许存在4x过度绘制
3. 不允许存在⾯积超过屏幕1/4区域的3x过度绘制(淡红⾊区域)
2)屏幕滑动帧速率:对于屏幕滑动帧速率主要有 2 种⽅法。
先说说软件测试的⽅法:
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打开⽂件计算得到帧率
接下来我们说说硬件的⽅法,这⾥需要引⼊⾼速相机,打开⾼速相机,开启摄像模式,录制⼈滑动或者扫动被测应⽤的视频,再通过⼈⼯或者程序数帧的⽅法对结果进⾏计算得到帧率
3)屏幕滑动平滑度:
对于屏幕滑动平滑度的测试,⽅法如同帧率测试,唯⼀的差异就是最后的结果计算公式的差异
GPU的测试⽬前业界使⽤的均为硬件来进⾏,软件测试的数据相较硬件差异较⼤,对于帧率及帧⽅差的测试标准⽽⾔,需对待不同机型设定不同的标准
九、功耗测试
功耗测试主要从以下⼏个⽅⾯⼊⼿进⾏测试
测试⼿机安装⽬标APK前后待机功耗⽆明显差异
常见使⽤场景中能够正常进⼊待机,待机电流在正常范围内.
长时间连续使⽤应⽤⽆异常耗电现象
功耗测试的⽅法分为两类,⼀类为软件测试,⼀类为硬件测试
我们先说说软件测试,这⾥我们会聊聊⼀些DIY的思路,软件测试⼀般分为2类,
第⼀种采⽤市场上提供的第三⽅⼯具,如⾦⼭电池管家之类的。
第⼆种就是⾃写⼯具进⾏,这⾥⼀般会使⽤3种⽅法
第⼀种基于android提供的PowerManager.WakeLock来进⾏,
第⼆种⽐较复杂⼀点,功耗的计算=CPU消耗+Wake lock消耗+数据传输消耗+GPS消耗+Wi-Fi连接消耗,
第三种通过 adb shell dumpsys battery来获取
接着说硬件测试,在这⾥我们⼀般使⽤万⽤表或者功耗仪进⾏测试,使⽤功耗仪测试的时候,需要制作假电池来进⾏的,有些不能拔插电池的⼿机还需要焊接才能进⾏功耗测试。
移动端相关功耗测试杂谈:
1、为什么要测功耗?测功耗的实际意义有哪些?
ROM级别的,测功耗(包括其⾃带的应⽤)是必然的(毕竟rom的耗电决定待机时间长短,这是⼿机的很重要卖点之⼀,也是⽤户⽐较关⼼的⼀个指标)。⼀般官⽅宣传的⼿机资料时,⾥⾯写的待机时间多少分钟、2G/3G通话/上⽹多少分钟、wifi上⽹/听⾳乐/播放视频的最⼤时长,就是测耗电量再经过计算得来的。
单个App级别的,⼤家都知道,耗电量的增加,也就意味着内存/CPU占⽤的增加。正所谓,透过现象
看本质,如果增幅较之前版本过⼤,那很有可能是代码出问题了(即便不影响功能使⽤,这种问题即便不修正不优化,但最好能做到知道哪有问题);⽐之前版本过⼩,时间精⼒够的话最好去导致差异过⼤的原因。
(PS:像ROM级别的功耗测试这肯定是各个⼚商都会做的,咱们普通⼩⽼百姓基本⽆需操⼼这些。⾮系统⾃带的App,尤其是安卓平台,在海量的ROM下,⽤户量⽐较⼤的应⽤,可以去着重在各种ROM上看看耗电量还可以;⼀般的应⽤,我个⼈愚见,测耗电量的意义和回报不太⼤,还不如多关注UI设计、优化内存CPU的占⽤、优化各功能的响应时间的更有意义,因此测App的功耗视需求⽽定。)
养胃吃什么好2、测功耗⼤致过程是怎样?
测功耗,⼀般是选取(经过细致评估的App或ROM的功能性能)⽐较稳定的版本来做⼀耗测试,测时⽤两三个硬件没什么问题的⼿机、
刷个⼲净稳定的系统,让⼿机、假电池、电流表串联(即假电池连接到电流表的电流输出⼝,然后再安到⼿机上模拟⽇常⽤的电池来给⼿机供电,这样保证三者电流⼀致),和然后放上SIM卡(⼀般是移动的),然后去测各种功能下的耗电量。
⽐如,测理论上的⼿机2G通话的最⼤时长,打⼏个⼗分钟的电话,采集并计算这段时间系统的电流的平均值,然后再⽤该⼿机配备的电池的容量除以这个电流值即得出理论上的2G最⼤通话时间。测单个功能的功耗,只要减掉⼿机待机时的电流值即得到单个功能的功耗。(PS:上⾯有些理论是从别的博客摘抄记录下来的,但具体没有记录是哪些博客,所以这⾥就不贴原博客地址了,但实际的操作是⾃⼰做的)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论