Android环境准备
Android APP专项测试需要使用adb命令
- 需要安装Android SDK参考,验证adb
- 数据线连接Android设备(或虚拟机),或使用无线连接参考
- Android设备进入开发者模式,打开USB调试、USB安装、USB调试(安全设置),修改GPU呈现模式分析为“在adb shell dumpsys gfxinfo中”(用于fps数据获取)
APP专项测试
小编根据Android ADB命令写的APP自动化专项测试见移动APP专项测试自动化
说明:
- 获取APP的Package和Activity请参考Android获取APP的Package和Activity
- 当一台计算机连接多个设备时,adb命令需要-s $deviceName(adb devices获取) 指定设备
- 命令中Windows使用findstr搜索,Linux和Mac使用grep搜索
1. 安装/卸载
1.1 安装APP
adb -s $deviceName install $apkPath # $apkPath计算机存放apk安装包的位置信息
1.2 卸载APP
adb -s $deviceName uninstall $appPackage
2. 冷/热启动
2.1 冷/热启动APP
adb -s $deviceName shell am start -W -n $appPackage/$appActivity
冷/热启动命令是一样的。冷/热启动的区别就是,冷启动为杀掉App后台启动,热启动为App从后台激活。冷启动时间是明显大于热启动的
2.2 冷启动停止App(杀掉后台)
adb -s $deviceName shell am force-stop $appPackage
2.3 热启动停止App(切换至后台运行)
adb -s $deviceName shell input keyevent 3
3. Monkey
Monkey测试请参考Android Monkey使用
4. CPU占用率
4.1 获取CPU占用比例
adb -s $deviceName shell top -n 1 | grep $appPackage # -n xx 刷新xx次,-d xx 刷新频率
第三列即为CPU占用情况
4.2 获取CPU详细占用情况
adb -s $deviceName shell dumpsys cpuinfo | grep $appPackage
第一个0%即为总的CPU占用情况,后面为详细的占用情况
5. 内存使用情况
5.1 手机总内存
adb -s $deviceName shell cat /proc/meminfo |grep MemTotal
5.2 APP运行内存
基本内存耗用分类:
VSS- Virtual Set Size 虚拟耗用内存(包含共享库占用的内存),表示一个进程可访问的全部内存地址空间的大小。这个大小包括了进程已经申请但尚未使用的内存空间。在实际中很少用这种方式来表示进程占用内存的情况,用它来表示单个进程的内存使用情况是不准确的。
RSS- Resident Set Size 实际使用物理内存(包含共享库占用的内存),表示一个进程在RAM中实际使用的空间地址大小,包括了全部共享库占用的内存,这种表示进程占用内存的情况也是不准确的。
PSS- Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存),表示一个进程在RAM中实际使用的空间地址大小,它按比例包含了共享库占用的内存。假如有3个进程使用同一个共享库,那么每个进程的PSS就包括了1/3大小的共享库内存。这种方式表示进程的内存使用情况较准确,但当只有一个进程使用共享库时,其情况和RSS一模一样。
USS- Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存),表示一个进程本身占用的内存空间大小,不包含其它任何成分,这是表示进程内存大小的最好方式!
说明:
a.一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS
b.实际在统计查看某个进程内存占用情况的时候,看PSS是比较客观的
-
获取VSS、RSS、PSS、USS(需要root)
adb -s $deviceName shell procrank | grep $appPackage
procrank需要手机root权限,适用于安卓7.0以下版本(7.0以上版本不再支持root)
-
获取VSS和RSS
adb -s $deviceName shell top -n 1 | grep $appPackage # -n xx 刷新xx次,-d xx 刷新频率
第6列即为VSS数据,第7列为RSS数据
-
获取PSS(推荐)
adb -s $deviceName shell dumpsys meminfo $appPackage
6. 流量数据
5个地方统计的流量异同点:
推荐使用顺序:D > E > C > A> B (推荐D、E)
6.1 获取App的PID、Uid
-
获取PID
adb -s $deviceName shell ps | grep $appPackage
结果第二列即为PID
-
获取Uid
adb -s $deviceName shell cat /proc/$PID/status | grep Uid
结果即为Uid
6.2 获取流量数据
-
/proc/uid_stat/$Uid方式
adb -s $deviceName shell cat /proc/uid_stat/$Uid/tcp_snd # 发送数据大小 adb -s $deviceName shell cat /proc/uid_stat/$Uid/tcp_rcv # 接收数据大小
-
/proc/net/xt_qtaguid/stats方式
adb -s $deviceName shell cat /proc/net/xt_qtaguid/stats | grep $Uid
wlan0代表WiFi,wlan0如何初始化0 只需打开手机飞行模式再关掉就清0了
7. FPS
adb -s $deviceName shell dumpsys gfxinfo $appPackage
主要通过结果中的Profile data in ms部分进行分析,计算方法参考
(方法仅适用于Android原生应用,不适用于游戏)
Draw: 是消耗在构建java显示列表DisplayList的时间。说白了就是执行每一个View的onDraw方法,创建或者更新每一个View的DisplayList对象的时间。
Prepare: 准备时间
Process: 表示是消耗在Android的2D渲染器执行显示列表的时间,view越多,要执行的绘图命令就越多,时间就越长
Execute: 表示把一帧数据发送到屏幕上排版显示实际花费的时间,其实是实际显示帧数据的后台缓存区(CPU)与前台缓冲区(GPU)交换后并将前台缓冲区的内容显示到屏幕上的时间
将上面的四个时间加起来就是绘制一帧所需要的时间,如果超过了16.67就表示掉帧了
说明
Android定义了流畅度的数据标准,以60FPS为标准(FPS为每秒绘制的帧数),帧数过小就会出现卡顿感
每一帧在安卓系统中分4个阶段,4个阶段的总和超过16.67(1秒60帧,算下来平均1帧的间隔就约是16.67ms)就认为丢帧
这个定义在Android6.0以前是一定的,但是现在已经没有固定的标准了,因为目前安卓系统有3层缓存机制,加上硬件上的进步,即使超过16.67,也不一定会出现卡顿感。所以这个数据在测试时作为一种对比和相对衡量标准,也可根据需求自定义标准。
计算说明
1. 计算总数据的行数 frame_count = row_num,
计算每行渲染时间render_time = Draw + Prepare+Process + Execute
当渲染时间>16.67ms(1000/60),按照垂直同步机制,该帧已经渲染超时
2. 一旦render_time>16.67 算一次jank(丢帧),一旦jank,需要用掉额外的vsync
vsync_overtime = 向上取整(render_time/16.67) - 1
(如:render_time = 66.68 vsync_overtime = 3, render_time = 67 vsync_overtime = 4)
3. 一次命令执行获得的fps = int( frame_count * 60 / (frame_count + vsync_overtime_sum))
8. 电量(耗能)
8.1 电池充电状态
-
获取电池充电状态
adb -s $deviceName shell dumpsys battery | grep status
1:未知状态 2:充电状态 3:放电状态 4:未充电 5:充电已满
-
设置电池充电状态,状态同上
adb -s $deviceNameshell dumpsys battery set status $status adb -s $deviceName shell dumpsys battery reset # 恢复设备电池状态
8.2 电量百分比
-
获取当前电量
adb -s $deviceName shel dumpsys battery | grep level
-
修改电池电量
adb -s $deviceName shell dumpsys battery set level 1 # 设置电量为1%,可做低电量测试 adb -s $deviceName shell dumpsys battery reset # 操作完成后,恢复设备电池状态
8.3 单个应用的耗电量信息
-
获取Uid
adb -s $deviceName shell ps | grep com.taobao.taobao
第一个数据即为Uid(与上面的Uid略微不同)
-
重置设备耗电量数据
adb -s $deviceName shell dumpsys batterystats --reset
-
使设备处于未充电状态,进行应用程序的操作(或者直接拔掉数据线,操作完成后插上数据线)
adb -s $deviceName shell dumpsys battery unplug # 设置断开充电(其实在充电) adb -s $deviceName shell dumpsys battery reset # 操作完成后,恢复设备电池状态
-
查看耗电信息
adb -s $deviceName shell dumpsys batterystats $appPackage | grep $Uid
此处Uid需要去除_(如上u0_a250,为u0a250),有详细的耗电使用情况
9. 温度
9.1 电池温度
adb -s $deviceName shell dumpsys battery | grep temperature
单位0.1摄氏度
9.2 CPU温度
-
判断类型
adb -s $deviceName shell cat /sys/class/thermal/thermal_zone*/type
-
获取cpu温度
adb -s $deviceName shell cat /sys/class/thermal/thermal_zone*/temp
温度是与前面类型对应的,单位0.1摄氏度
10. 网络设置
10.1 飞行模式
-
打开飞行模式
adb -s $deviceName shell settings put global airplane_mode_on 1
-
关闭飞行模式
adb -s $deviceName shell settings put global airplane_mode_on 0
10.2 数据连接(需要root权限)
-
打开数据连接
adb -s $deviceName shell svc data enable
-
关闭数据连接
adb -s $deviceName shell svc data disable
-
设置数据连接优于wifi
adb -s $deviceName shell svc data prefer
10.3 wifi连接(需要root权限)
-
打开wifi
adb -s $deviceName shell svc wifi enable
-
关闭wifi
adb -s $deviceName shell svc wifi disable
-
设置wifi连接优于数据
adb -s $deviceName shell svc wifi prefer
11. GPU使用率
以下方法目前支持高通GPU芯片(Qualcomm Adreno系列),Android studio有自带GPU测试
11.1 查看手机GPU信息
adb -s $deviceName shell dumpsys | grep GLES
Qualcomm即为高通,一般虚拟机都是Google
11.2 Gpu使用率
adb -s $deviceName shell cat /sys/class/kgsl/kgsl-3d0/gpubusy
结果为两个值,GPU使用率为(前一个/后一个)*100%
11.3 GPU工作频率
-
可用工作频率
adb -s $deviceName shell cat /sys/class/kgsl/kgsl-3d0/gpu_available_frequencies adb -s $deviceName shell cat /sys/class/kgsl/kgsl-3d0/devfreq/available_frequencies
两个结果是一样的
-
最大工作频率
adb -s $deviceName shell cat /sys/class/kgsl/kgsl-3d0/devfreq/max_freq
-
最小工作频率
adb -s $deviceName shell cat /sys/class/kgsl/kgsl-3d0/devfreq/min_freq
-
当前工作频率
adb -s $deviceName shell cat /sys/class/kgsl/kgsl-3d0/gpuclk adb -s $deviceName shell cat /sys/class/kgsl/kgsl-3d0/devfreq/cur_freq
两个结果是一样的
11.4 工作模式
-
可用工作模式
adb -s $deviceName shell cat /sys/class/kgsl/kgsl-3d0/devfreq/available_governors
-
当前工作模式
adb -s $deviceName shell cat /sys/class/kgsl/kgsl-3d0/devfreq/governor
参考:
浅谈Android App专项测试
adb命令查看设备内存
【Android】性能测试之获取Android流量数据
Android性能测试(内存、cpu、fps、流量、GPU、电量)——adb篇
专项测试-如何测试APP流畅度,基于adb shell dumpsys gfxinfo命令来获取fps和丢帧率
玩转ADB命令(ADB命令使用大全)
非常感谢博主的分享