阅读 50

Android调试App之性能测试

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

嗟叹职业技能
从事软件测试已8年有余,时至今日自认为可以称得上是全栈,对测试、运维、开发等领域亦有所了解,
随着工作经验在不同的行业切换,所接触的测试/开发技术栈,也越来越多,比之以往更是难以琢磨,
好在有一颗自强不息的心,仍然坚持不断学习,再说性能测试领域:app性能及后台服务性能,各有不同。

令人唏嘘大好光阴飞逝~~~

复制代码
Android性能测试之adb命令
优先介绍一些adb基本命令,安装步骤略。

复制代码
  • 获取被测app的包名及avtivity
获取当前打开应用的包名和Actively:adb shell dumpsys window | findstr mCurrentFocus

获取后台运行应用的包名和Actively:adb shell dumpsys activity |findstr "MainActivity"

列出手机应用的所有包名|findstr 过滤关键字""
adb shell pm list packages |findstr "yasibro"

复制代码
  • 获取app启动耗时,方式一:
冷启动:adb shell am start -W -n packageName/ActivityName(绝对路径,首个Activity)

示例:
adb shell am start -W -n com.chutzpah.yasibro.test/com.chutzpah.yasibro.main.view.MainActivity

结果如下:
C:\Users\qguan>adb shell am start -W -n com.chutzpah.yasibro.test/com.chutzpah.yasibro.main.view.MainActivity
Starting: Intent { cmp=com.chutzpah.yasibro.test/com.chutzpah.yasibro.main.view.MainActivity }
Warning: Activity not started, its current task has been brought to the front
Status: ok
Activity: com.chutzpah.yasibro.test/com.chutzpah.yasibro.main.view.MainActivity
ThisTime: 148
TotalTime: 148
WaitTime: 157
Complete

WaitTime:表示从startActivity到应用第一帧完全显示这段时间. 就是总的耗时,包括前一个应用Activity pause的时间和新应用启动的时间;
ThisTime:表示一连串启动 Activity 的最后一个 Activity 的启动耗时;
TotalTime:表示新应用启动的耗时,包括新进程的启动和 Activity 的启动,但不包括前一个应用Activity pause的耗时。

返回后台运行,同样的命令表示热启动:
adb shell am start -W -n com.chutzpah.yasibro.test/com.chutzpah.yasibro.main.view.MainActivity

tips:冷启动停止APP:adb shell am force-stop packname
热启动停止app:adb shell input keyevent 3

测试标准:冷启动时间不超过1.5s, 热启动不超过1s.
完全启动,无网启动,有网启动都可以通过charles抓包来获取启动的时间

复制代码
  • 获取App启动耗时,方式二:
通过过滤关键字“Displayed”获得启动应用的时间,单位ms级
adb logcat -s ActivityManager:I | find Displayed

tips:日志两个时间之和,表示启动app的时间
每次启动结果如下:
12-24 18:16:49.919  2023  2057 I ActivityManager: Displayed com.chutzpah.yasibro.test/com.chutzpah.yasibro.main.view.SplashActivity: +899ms
12-24 18:16:51.844  2023  2057 I ActivityManager: Displayed com.chutzpah.yasibro.test/com.chutzpah.yasibro.main.view.MainActivity: +938ms

复制代码
  • 获取app流量使用
获取被测app的进程pid:adb shell ps -ef |find  "com.chutzpah.yasibro.test"

计算进程的流量:adb shell cat /proc/$pid/net/dev

receive是指当前进程接收的数据,transmit是指当前进程发出请求的数据,流量是这两者之和

Android系统的目录文件/proc/uid_stat/uid/下一般会有两个文件tcp_snd和tcp_rcv。通过adb shell cat/proc/uid_stat/10194/tcp_snd和adb shell cat/proc/uid_stat/10194/tcp_rcv即可分别获得上行流量和下行流量。


复制代码
  • 获取app使用内存
mem:adb shell top |find com.chutzpah.ya

内存说明
VSS - Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
RSS - Resident Set Size 实际使用物理内存(包含共享库占用的内存)
PSS - Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)
USS - Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)
一般来说内存占用大小有如下规律:VSS >= RSS >= PSS >= USS

命令如下:
adb shell dumpsys meminfo -s <pakagename | pid>

process 以进程的PSS从大到小依次排序显示,每行显示一个进程;
OOM adjustment 分别显示每类的进程情况
category 以Dalvik/Native/.art mmap/.dex map等划分的各类进程的总PSS情况
total 总内存、剩余内存、可用内存、其他内存


复制代码
  • 获取CPU占用率
CPU: adb shell dumpsys cpuinfo |find packageName

tips:adb shell top -d 1 | find packagename
-n 指定执行次数
-d 每一秒一次

复制代码
  • 获取app耗电量
首先需要将手机切换到非充电状态,使用命令:adb shell dumpsys battery set status 1
(adb shell dumpsys battery set status 2:是将手机切回充电状态)
然后使用命令:adb shell dumpsys battery 获取手机电池信息
耗电量:adb shell dumpsys batterystats |grep packageName

复制代码
  • adb fps(每秒帧数,计算流畅度)数据采集
FPS (应用的使用流畅度):adb shell dumpsys gfxinfo <packageName | pid>

复制代码
  • 注意事项,这是性能测试吗?一次当然不是,多次而求平均则就是app专项性能测试
1、windows下执行命令过滤关键字使用find或findstr,进入adb shell终端执行则使用grep
2、所有dumpsys命令获取性能数据,如果adb shell进入终端执行,均要求执行有shell权限,如果PC端进入终端执行,则无此要求

复制代码
文章分类
后端
文章标签