1、内存
在android系统中,每个APP进程除了同其他进程共享(shared dirty)外,还独用私有内存(private dirty),通常我们使用PSS(=私有内存+比例分配共享内存)来衡量一个APP的内存开销
测试方法:adb shell dumpsys meminfo 应用包名
备注:adb shell dumpsys meminfo列出了所有应用占用的内存大小
adb shell procrank |grep packagename 也可以查看应用的内存使用情况
2、CPU
adb shell cat "/sys/class/thermal/thermal_zone7/temp"
测试方法:adb shell top命令
@echo off for /l %%a in (1,1,10) do adb shell top -m 5 -t>>E: op.txt
备注:腾讯有个APT工具可以方便的用来测试CPU和内存,用起来很简单,使用教程http://www.csdn.net/article/2014-04-23/2819366-tencent-APT-open-source-tool-guide
3、流量
adb shell cat /proc/net/xt_qtaguid/stats中有流量的使用情况
用法:
首先需求获取应用的UID
adb shell dumpsys package com.android.mms |findstr userId=
然后...
adb shell cat /proc/net/xt_qtaguid/stats | findstr userId
48 wlan0 0x0 10127 0 316574 2279 472562 3651 316574 2279 0 0 0 0 472562 3651 0 0 0 0
49 wlan0 0x0 10127 1 6172960 4936 415951 5215 6172960 4936 0 0 0 0 415951 5215 0 0 0 0
50 wlan0 0x3792d5b400000000 10127 0 29678 208 32168 296 29678 208 0 0 0 0 32168 296 0 0 0 0
51 wlan0 0x3792d5b400000000 10127 1 226170 222 25745 265 226170 222 0 0 0 0 25745 265 0 0 0 0
56 wlan0 0xfa1dcc4b00000000 10127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
57 wlan0 0xfa1dcc4b00000000 10127 1 3014885 2127 139857 2117 3014885 2127 0 0 0 0 139857 2117 0 0 0 0
其中第6和8列为 rx_bytes(接收数据)和tx_bytes(传输数据)包含tcp,udp等所有网络流量传输的统计。
备注:脚本页http://www.cnblogs.com/penghong2014/p/4530875.html
另外一种方法:
流量数据分为接收流量(tcp_rcv)和发送流量(tcp_snd)两部分,这两个状态数值我们可以通过读取/proc/uid_stat/<UID>
目录下的两个文件得到。
shell@hammerhead:/ $ cat /proc/uid_stat/10084/tcp_rcv
3446837
shell@hammerhead:/ $ cat /proc/uid_stat/10084/tcp_snd
134366
通过这种方式,我们就可以读取得到指定apk在当前时刻的累计流量数值。
备注:获取应用的UID root@hammerhead:/ # cat /data/system/packages.list | grep com.UCMobile.trunk
另:在/sys/class/net/下可以找到相关类别(如rmnet0)的目录.在其子目录statistics下游rxbytes和txbytes记录收发流量.
关于流量测试的详细帖子http://tmq.qq.com/2016/05/android_traffic_statistics/
tcpdump抓包
下载 一个tcpdump工具 ,然后push到/data/local/tmp下面,然后进入到此目录下,运行即可:
1|shell@hammerhead:/ $ tcpdump -v -i any -s 0 -c 2000 -w /sdcard/us.pcap tcpdump: listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes 2000 packets captured 2024 packets received by filter 0 packets dropped by kernel
参数解释:
tcpdump命令支持许多参数,常见的有:
-i
指定网卡(interface),any
表示不限网卡;-c
指定接收的packets数量,接收完成后自动停止抓包;-w
指定输出文件,输出文件的格式为pcap;-s
(--snapshot-length
)指定在每个packet中最多截取的字节数,设置为0时表示截取上限取默认值262144;-v
/-vv
/-vvv
,指定输出的详细程度,针对流量测试,我们不需要非常详尽的输出数据,取-v
即可。
再用wireshark打开统计流量值,筛选ip.host=
4、电量
android的很多特性都比较耗电(如屏幕,GPS,sensor传感器,唤醒机制,CPU,连网等的使用)
1)灭屏待机最省电
2)WiFi比蜂窝数据,包括2G(GPRS)、3G更省电
当用户按power键,使得手机进入灭屏休眠状态,Android系统其实是做了前面说的一些工作:关闭屏幕、触摸屏、传感器、dump当前用户态和内核态程序运行上下文到内存或者硬盘、关闭CPU供电
应减小应用对CPU的唤醒,才能省电
测试方法:
把此APK反编译后找到power_profile.xm文件,而系统的 设置->电池->使用情况中,统计的能耗使用情况也是以power_profile.xml的value作为基础参数的
另adb shell dumpsys batteryinfoatterystat 查看各部件耗时
备注:电量测试工具itest http://soft.shouji.com.cn/down/29068.html
GT:http://gt.tencent.com/download.html
GSam Battery Monitor Pro APP测试实战上推荐的工具
5、启动速度
备注:还可以通过adb logcat |findstr Displayed来获取activity的启动时间
这个还是不太准,原因:
冷启和热启的性能数据可不是这么来获取的,精确程度和适用性很弱。以下几点原因:
1、启动方式并不是am,而是点击。这就涉及从按下屏幕响应,硬件上报,软件层响应到指定页面显示整个流程。
2、APP的形式并不只有独立存在的方式,还有组件形式集成,由其他app的指定操作唤起
3、对用户而言完整的启动流程是:点击到显示app首屏画面,至于之后的加载等处理就是app的流程了。
实际性能测试中是严格录像计时的,按下到首帧响应时间。而冷启和热启在这里的区别是首次无数据启动,和完成过初始化流程后的再次启动。
冷启动:无数据的首次启动。
热启动:非首测启动情况,无初始化欢迎界面和首次初始化过程。
从脚本来模拟最好还是实际流程模拟,发送touch事件响应后到指定activity显示。即:
1、在发送touch事件后记录起始时间,精度到ms
2、当SurfaceFlinger的数据中有指定activity,记录结束时间精度ms (dumpsys SurfaceFlinger|grep -c "指定activity";非零则存在)
3、两者做差就是所需时间。
6、滑动速度、界面切换速度
动画帧率
图片处理器每秒刷新的帧数(FPS),可用来指示页面是否平滑的渲染。高的帧率可以得到更流畅,更逼真的动画,不过帧率达到60fps以上,人眼主观感受到的差别就不大了。所以以60fps作为衡量标准,即要求每一帧刷新的时间小于16ms,这样才能保证滑动中平滑的流畅度。
FPS测试方法:
Android4.1引入gfxinfo,用于监控分析GPU profiling信息,Draw+Process+Execute是一帧的绘制渲染时间,如果持续超过16ms,用户会明显感知卡顿:
a: "Draw" : 创建显示列表(display lists,记录所有view对象的绘制指令)的时间开销。
b: "Process" : 执行显示列表中绘制指令的时间。UI视窗中的View数量越多,需要执行的绘画命令就越多。
c: "Execute" : 将一帧图像交给合成器compostior的时间。这部分占用的时间通常比较少
1) 打开android手机 “设置->开发者选项->GPU呈现模式分析"
启用该选项后,系统会保留每个界面最后128帧绘制的时间信息。目前在使用该工具前,您需要先干掉要分析的应用
2) 执行测试场景(比如滑动页面)后,执行adb shell dumpsys gfxinfo packageName
在显示的结果中,会看到一个标题为 “ Profile data in ms ”的区域,下面包含了3列数字。 为了图形化显示,您可以把这些数据复制到Excel表格中,来显示一个累积柱状图
Draw 是在Java中创建显示列表所需要的时间。这个值显示了运行绘图函数用了多长时间,比如View.onDraw(Canvas)。
Process 是Android 2D引擎渲染显示列表所需要的时间。在界面中View数目越多,则有越多的绘制命令需要执行。
Execute 是把一帧数据送到屏幕上排版显示的时间,这个时间通常比较小。
备注:详细的文章介绍http://www.tuicool.com/articles/ZzmYFf
3) 找到"Profile data in ms"的Draw Process Exceute这三列数据,Excel做出表格,sum出每列的总GPU时间
4) 针对时间大不幅度>16ms,可以使用systrace进行分析定位瓶颈
7、与服务器交互的网络速度
8.弱网络