Android APP专项测试之ADB命令

2023-11-01

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命令使用大全)

非常感谢博主的分享

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android APP专项测试之ADB命令 的相关文章

随机推荐

  • Java 窗口透明化(无边框)

    这几天我在写一个记事本程序 为了方便记事本记事 我准备将记事本界面透明化 于是上网查了一下资料 然后将透明化界面做了出来 可是在做的过程中我还是遇到了一些小小的问题 所以就把它记录了下来 问题1 奇怪的错误 访问限制 Access rest
  • 考研数学自整理,弥补知识漏洞(强化、冲刺)

    本次分享的是博主在考研时整理的最后一份数学知识 也是上考场前对知识最后的强化 因为博主是二战上岸 第一年考数三 第二年考数一 虽然这份笔记总结的内容不多 但这里浓缩了2020前历年数三 数的一真题与模拟题易错的考点和难点 链接 https
  • Java 正则表达式匹配规则

    表示捕获分组 会把每个分组里的匹配的值保存起来 使用 n n是一个数字 表示第n个捕获组的内容 表示非捕获分组 和捕获分组唯一的区别在于 非捕获分组匹配的值不会保存起来 0次或者多次 匹配前面的子表式零次或多次 1次或者多次 匹配前面的子表
  • 给一非空的单词列表,返回前 k 个出现次数最多的单词。旧键盘上坏了几个键,于是在敲一段文字的时候,对应的字符就不会出现。 现在给出应该输入的一段文字、以及实际被输入的文字,请你列出肯定坏掉的那些键。

    Arrays sort是针对数组排顺序 也可以通过第二个参数指定比较规则 Collection sort是针对集合类排序 给一非空的单词列表 返回前 k 个出现次数最多的单词 旧键盘上坏了几个键 于是在敲一段文字的时候 对应的字符就不会出现
  • [蓝帽杯 2022 初赛]之Misc篇(NSSCTF)刷题记录(复现)

    NSSCTF Misc篇 蓝帽杯 2022 初赛 domainhacker 蓝帽杯 2022 初赛 domainhacker1 蓝帽杯 2022 初赛 domainhacker2 计算机取证 蓝帽杯 2022 初赛 计算机取证 1 蓝帽杯
  • Centos卸载gcc

    1 查看安装的gcc版本 y localhost Desktop rpm q gcc gcc 4 4 7 23 el6 x86 64 2 执行卸载命令 rpm e y localhost Desktop rpm e gcc 4 4 7 23
  • Algorithm Accumulation

    目标检测 DPM HOG SIFT 最优匹配 DTW HMM 优化入门 爬山算法 退火算法 遗传算法 多目标优化 ILP 复杂度 NP完全问题 这篇博客就用来积累学过的一些比较好的算法 现开始觉得算法真是一个宝啊 目标检测 DPM 参考博客
  • Oracle中5中分区介绍

    一 范围分区 就是根据数据库表中某一字段的值的范围来划分分区 例如 Sql代码 create table graderecord sno varchar2 10 sname varchar2 20 dormitory varchar2 3
  • Srpingboot注解:@ConditionalOnProperty的用法

    在之前我就一直有一个想法 就是有的bean我不想注入 比如说有的时候用的是A的bean 可能换了一个不同的系统可能要用B的bean 我可不可以自己去配置什么时候注入A什么时候注入B 而不是我都注入 用到那个用哪个 实际 Conditiona
  • Tomcat

    一 Web资源的分类 Web资源分为两类 静态资源和动态资源 静态资源 html css js mp4视频 jpg图片 txt等 动态资源 jsp页面 servlet程序等 二 常用的web服务器 Web服务器 也可以叫javaweb容器
  • 驱动开发 day4 9/13

    head h ifndef HEAD H define HEAD H typedef struct unsigned int MODER unsigned int OTYPER unsigned int OSPEEDR unsigned i
  • JAVA中类的public class与class的区别详解

    1 类的访问权限 为了控制某个类的访问权限 修饰词必须出现在关键字class之前 例如 public class Student 在编写类的时候可以使用两种方式定义类 A public class定义类 B class定义类 2 publi
  • 2021-11-3 内核态和核心态

    1 什么是内核态 当一个进程进行系统调用而陷入内核代码中时 就称程序陷入了内核态 否则就是用户态 用户程序运行在用户态而操作系统运行在内核态 用户态只能执行非特权指令 而内核态可以执行全部指令 内核态可以执行的指令比如 执行I O 设置时钟
  • 拓数派荣获 “2023 年杭州市企业高新技术研究开发中心” 认定

    近日 拓数派上榜由杭州市科学技术局公布的 2023 年杭州市企业高新技术研究开发中心名单 通过专业的技术研发 成果转化和高新技术产业化成绩 获得 杭州市拓数派数据计算企业高新技术研究开发中心 认定 图为 杭州市拓数派数据计算企业高新技术研究
  • Lattice库联合ModelSim仿真FIFO

    Lattice联合ModelSim仿真FIFO 前言 一 添加IP 二 库文件添加 一 方式一 添加器件库到ModelSim 二 方法二 直接添加器件库到Libray 和tb v在同一个目录下仿真 三 仿真 一 仿真文件 二 仿真结果 前言
  • 计算机进制存在的意义

    发布本文的实际想法 是否想过为什么要有进制的存在 如二进制 十进制等 存在即合理 通过思考 得出以下结论 希望能在计算机基础方面给你带来一定的帮助 进制的意义 二进制是计算机看得懂的语言 我们在电脑上所写的一切东西 都需要转成二进制让电脑执
  • ctfshow web4

    提示日志注入 文件包含 还有一个get方式的参数url 有nginx 那就试试它的默认日志目录 日志默认路径 1 apache Linux 日志默认路径 etc httpd logs access log var log httpd acc
  • Window下编译PJSIP,不编译Media模块

    Windows系统下使用VS2017进行编译PJSIP 下载地址 PJSIP的地址 https github com pjsip pjproject 在线clone太慢的话 可以直接在这里下载比clone会快很多 https github
  • 用数组实现邻接表

    用数组实现邻接表 转载自 http blog csdn net wang2534499 article details 47750321 坐在马桶上看算法 算法8 巧妙的邻接表 数组实现 之前我们介绍过图的邻接矩阵存储法 它的空间和时间复杂
  • Android APP专项测试之ADB命令

    Android环境准备 Android APP专项测试需要使用adb命令 需要安装Android SDK参考 验证adb 数据线连接Android设备 或虚拟机 或使用无线连接参考 Android设备进入开发者模式 打开USB调试 USB安