1.Android稳定性测试

本文详细介绍了如何使用adbmonkey工具对Android应用进行稳定性测试,包括测试前提、具体操作步骤、monkey命令的参数说明以及日志分析方法,旨在通过模拟随机用户操作发现并复现应用的潜在问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • 工具

adb monkey

  • 测试前提

1)PC端已安装adb环境及做好配置

注:需要安装JDK、Android SDK并分别进行环境变量配置(此不为本次重点,不提供安装细则,可以参考本文档底部提供的参阅文件)

2)对adb命令和monkey有一定的了解

3)手机端已安装对应测试app,本文将以ownbank为例

4)测试前需要将android机(测试手机)的顶部状态栏进行屏蔽——目前通过开发隐藏或adb命令隐藏的还是可以同过下拉显示出来

当下前端开发未能实现客户端顶部状态栏永久隐藏。

  • 具体操作

1.将 Android 设备和 adb 主机(PC)连接到同一个 WiFi 网络

是否设置代理为可选操作,当前设置代理是为了方便抓包查看接口的请求情况)。

2.Android 设备需要把开发者工具-允许调试功能打开

3.使用USB数据线连接Android 设备和 adb 主机(PC)

建议使用USB,稳定性测试掉电速度很快、方便充电,同时方便不通过其他配置打开Android Studio就可以捕获日志。如果只是短时间操作,均可以选择远程连接设备。

4.打开cmd窗口或PowerShell命令窗口并确认调试包

当前使用PowerShell:

> adb devices      #查看已连接的设备

List of devices attached

R5CR205QY8R     device

> adb shell pm list packages -3 | findstr xxx      #查询包名包含“xxx”字符的第三方安装包/对应测试包,当前没有安装

> adb install -r -t D:\download\XXX_V1.1.90_20230215-common-stability_test.apk      #安装测试包

Performing Streamed Install

Success

> adb shell pm list packages -3 | findstr ownbank      #再次查询,确认包名

package:com.finance.ownbank.dev

>

5.monkey命令执行

> adb shell monkey -p com.xxx.dev -v -v -v --throttle 3 -s 1000 --ignore-crashes --ignore-timeouts --ignore-native-crashes 10000000 1>C:\Users\panpj\2023022021_info.txt

当前操作说明:

指令

说明

-p com.xxx.dev

对包名为com.finance.ownbank.dev的app应用进行测试,如需要指定多个包,使用命令:

adb shell monkey -p com.finance.ownbank.dev -p 其他包名

-v -v -v

指定日志的级别(即日志详细程度)

--throttle 3
延时3毫秒,单位是毫秒
-s 1000
随机数种子,用于指定伪随机数生成的seed值,如果seed值相同则两次monkey测试所生成的时间序列也相同,建议使用,方便复现和回归测试
--ignore-crashes
忽略闪退或崩溃,继续发送执行事件、直到事件数执行完成
--ignore-timeouts
忽略超时导致的异常(如ANR),继续发送执行事件、直到事件数执行完成
--ignore-native-crashes
忽略native-code引起的崩溃,继续发送执行事件、直到事件数执行完成
10000000
执行10000000次事件
1>C:\Users\panpj\2023022021_info.txt

把level 1的日志保存到C:\Users\panpj\2023022021_info.txt

2>C:\Users\panpj\2023022021_info.txt
把level 2的日志保存到C:\Users\panpj\2023022021_info.txt

monkey参数说明:

——参数说明
基本参数-p <allowed-package-name>指定一个或多个包
-s <seed>指定一个随机数生成器的seed值
--throttle <milliseconds>指定事件之间的固定延迟(ms)
-v

指定反馈信息级别(信息级别就是日志的详细程度),最多3个级别:

-v //缺省值,仅提供启动提示、测试完成和最终结果等的少量信息

-v  -v //较为详细的日志,包含每个Activity的事件信息

-v  -v  -v //最详细的日志

-c <main-category>指定一个或多个类别名
-f <scriptfile>运行指定的monkey脚本
事件参数--pct-touch <percent>指定触摸事件百分比
--pct-motion <percent>指定动作事件百分比
--pct-trackball <percent>指定轨迹事件百分比
--pct-syskeys <percent>指定系统按键事件百分比
--pct-nav <percent>指定基本导航事件百分比
--pct-majornav <percent>指定主要导航事件百分比
--pct-appswitch <percent>指定应用启动事件百分比
--pct-flip <percent>指定flip(弹)事件的百分比
--pct-anyevent <percent>指定其他类型事件百分比
--pct-pinchzoom <percent>指定缩放(捏)事件百分比
--pct-permission <percent>指定permission事件百分比,默认是0
调试参数--ignore-crashes忽略因崩溃或异常引起的停止运行
--ignore-timeouts忽略应用发生超时错误(ANR)
--ignore-security-exceptions忽略应用发生任何权限错误
--monitor-native-crashes监视并报告monkey运行时native code的崩溃事件
--ignore-native-crashes忽略因native code的崩溃事件
--kill-process-after-error在应用出错后通知系统杀死发生错误的进程
--hprof在事件序列前后立即生成profilfing报告
--dbg-no-events监视应用程序所调用的包之间的转换
--wait-dbg暂停执行中的monkey,直到有调试器与它连接

  • 日志分析

1.日志开头

解析命令信息,包括被执行的测试包、指令操作次数及其他参数信息等。

2.日志结尾

指令操作次数、耗时,命令操作结束标识语“Monkey finished”。

3.日志内容分析

事件

关键字

备注

程序无响应ANRApplication Not Responding
程序崩溃CRASH

一般日志体现为“Exception”或“Error”,常见:

1)NullPointerException:空指针异常
2)SQLException:操作数据库异常类
3)ClassCastException:类型转换异常
4)NumberFormatException:数值转化异常
5)ClassNotFoundException:指定的类不存在
6)ArithmeticException:数学运算异常,如程序中出现了除以零等
7)ArrayIndexOutOfBoundsException:数组越界异常
8)IllegalArgumentException:方法的参数错误
9)IllegalAccessException:没有类访问权限
10)ArrayStoreException:错误对象存储到数组
11)FileNotFoundException:文件未找到
12)IndexOutOfBoundsException:下标越界异常
13)ActivityNotFoundException Activity:未找到异常
14)IllegalStateException:非法状态异常
15)SecurityException 安全异常
16)StackOverflowError:堆栈异常错误
17)OutOfMemoryError:内存溢出错误

其他问题

Exception

meninfo

同上可能导致崩溃的Exception,可以通过“Exception”关键字进行搜索,

meninfo关注是否存在OOM

Monkey执行的ActivitySwitch一般通过Switch确认异常所在的Activity位置

可以通过关键字对采集的日志进行搜索、通过PowerShell或cmd命令窗口或android studio的日志输出进行确认,可以结合抓包工具、kibana等日志进一步确认业务请求的情况。

注:Android Studio切换日志等级后,日志就会被清空,建议慎用该功能。

4.问题重现

1)通过日志确认出错前的事件操作、手动执行复现;

2)按照原来的操作场景重新执行对应含seed值的命令进行复现。

monkey复现之seed值

使用-s参数来指定命令执行的seed值

Monkey会根据seed值来生成对应事件流,同一个seed生成的事件流是完全相同的。这里指定了seed值,是为了测试发现问题时,便于进行问题复现。

用于指定伪随机数生成器的 seed 值,如果 seed 相同,则两次 monkey 测试所产生的事件序列也相同的。

monkey 测试1:adb shell monkey -p com.kaiyuan.developmentbusiness –s 10 100

monkey 测试2:adb shell monkey -p com.kaiyuan.developmentbusiness –s 10 100

两次测试的效果是相同的,因为模拟的用户操作序列(每次操作按照一定的先后顺序所组成的一系列操作,即一个序列)是一样的。操作序列虽然是随机生成的,但是只要我们指定了相同的Seed值,就可以保证两次测试产生的随机操作序列是完全相同的,所以这个操作序列伪随机的;

  • 测试准出

稳定性测试过程中APP端没有出现ANR、Crash和任意Exception及OOM等情况(含日志),以及不存在业务请求的异常、客户端操作的异常等。

  • 执行命令参考

         测试人员可以结合以上指令根据需要进行测试:

adb shell monkey -p com.xx.dev -v -v -v --throttle 3 -s 1 --ignore-crashes --ignore-timeouts --ignore-native-crashes 10000000 1>C:\Users\panpj\2023022021_info.txt

adb shell monkey -p com.xxx.dev -v -v -v --throttle 3 --ignore-crashes --ignore-timeouts --ignore-native-crashes 10000000 1>C:\Users\panpj\2023022021_info.txt

adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes  -v -v -v --pct-touch 20 --pct-motion 20 --pct-flip 20 --pct-pinchzoom 20  --pct-trackball  20 500000 1>C:\Users\panpj\20230222-info_02.txt

adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes  -v -v -v --pct-touch 20 --pct-motion 20 --pct-flip 20 --pct-pinchzoom 20  --pct-trackball  20  -s 100  500000 1>C:\Users\panpj\20230222-info_02.txt

adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes  -v -v -v --pct-touch 50 --pct-motion 50  50000 1>C:\Users\panpj\20230222-info_05.txt

adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes  -v -v -v --pct-touch 50 --pct-motion 50  50000 1>C:\Users\panpj\20230222-info_05.txt

adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes  -v -v -v --pct-touch 50 --pct-motion 50 -s 500000000 500000000 1>C:\Users\panpj\20230222-info.txt

adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes  -v -v -v --pct-touch 100 -s 50000 50000000 1>C:\Users\panpj\20230228-info.txt

adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes  -v -v -v --pct-touch 100 -s 50000 50000000 1>C:\Users\panpj\2023022819-info.txt

adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes  -v -v -v  -s 50000 50000000 1>C:\Users\panpj\20230301-info.txt

adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes  -v -v -v --pct-touch 100 -s 500 50000 2>C:\Users\panpj\2023030220-info.txt

-- 不同事件操作

# 触摸事件

adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes  -v -v -v --pct-touch 100 -s 500 5000 2>C:\Users\panpj\2023030709-touch-info.txt

# 动作事件

adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes  -v -v -v --pct-motion 100 -s 500 5000 2>C:\Users\panpj\2023030715-motion-info.txt

# 轨迹事件

adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes  -v -v -v --pct-trackball 100 -s 500 5000 2>C:\Users\panpj\202303071501-trackball-info.txt

# 系统按键事件(音量调节等)

adb shell monkey -p com.xxx.dev--ignore-crashes --ignore-timeouts --ignore-native-crashes  -v -v -v --pct-syskeys 100 -s 500 5000 2>C:\Users\panpj\202303071502-syskeys-info.txt

# 基本导航事件

adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes  -v -v -v --pct-nav 100 -s 500 5000 2>C:\Users\panpj\202303071507-nav-info.txt

# 主要导航事件

adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes  -v -v -v --pct-majornav 100 -s 500 5000 2>C:\Users\panpj\202303071514-majornav-info.txt

# 应用启动事件

adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes  -v -v -v --pct-appswitch 100 -s 500 5000 2>C:\Users\panpj\202303071515-appswitch-info.txt

# flip(弹)事件

adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes  -v -v -v --pct-flip 100 -s 500 5000 2>C:\Users\panpj\202303071516-flip-info.txt

# 其他类型事件

adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes  -v -v -v --pct-anyevent 100 -s 500 5000 2>C:\Users\panpj\202303071516-anyevent-info.txt

# 缩放(捏)事件(含有输入)

adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes  -v -v -v --pct-pinchzoom 100 -s 500 5000 2>C:\Users\panpj\2023030719-pinchzoom-info.txt

# permission事件(没看到什么操作)

adb shell monkey -p com.xxx.dev --ignore-crashes --ignore-timeouts --ignore-native-crashes  -v -v -v --pct-permission 100 -s 500 5000 2>C:\Users\panpj\202303071527-permission-info.txt

  • 已知问题参考

firebase监控到的异常:----这个平台监控的数据不够精准,有发现顶部统计数据不对齐的情况以及客户端获取到崩溃但是这里没有捕获到的情况

  • 拓展

1.adb命令--远程连接设备

> adb devices      #查看已连接的设备,当前没有连接设备

List of devices attached

> adb tcpip 5555      #打开adb连接设备的端口,需要先使用数据线将PC跟测试手机进行连接

restarting in TCP mode port: 5555

> adb connect 10.10.24.73      #连接手机ip地址(关于手机-状态信息-IP地址 或 连接-WiFi-已连接的wifi-IP地址),无线连接

connected to 10.10.24.73:5555

> adb devices      #再次查看已连接的设备,设备连接成功,以下两个都是同一个手机设备,一个是数据线连接的、一个是无线连接,此时可以把PC跟测试手机连接的数据线断开,避免因不能识别命令具体是针对哪个设备进行而影响后面操作

List of devices attached

R5CR205QY8R     device

10.10.24.73:5555        device

> adb devices      #拔掉数据线后,再次查看已连接的设备,当前断开数据线是为了方便在暴力操作情况下的耗电情况,如果稳定性测试的时间很长、不建议通过ip+端口进行连接

List of devices attached

10.10.24.73:5555        device

2.adb命令--隐藏状态栏相关

> adb shell settings put global policy_control immersive.full=*      #隐藏状态栏和虚拟键

> adb shell settings put global policy_control immersive.status=*      #仅隐藏状态栏

> adb shell settings put global policy_control immersive.navigation=*      #仅隐藏虚拟键

> adb shell settings put global policy_control null      #恢复状态栏和虚拟键

> adb shell

o1q:/ $ service call statusbar 1      //下拉显示命令行

Result: Parcel(00000000    '....')

o1q:/ $ service call statusbar 2      //收缩状态栏

Result: Parcel(00000000    '....')

3.Android studio的性能分析面板

APP性能测试时可以结合该监控进行相关指标确认,有兴趣可以拓展学习下Android studio相关功能。

可参阅文档:

1、adb基本介绍:Android 调试桥 (adb)

2、adb环境安装:adb环境配置详细

3、monkey的基本介绍和用法:UI/Application Exerciser Monkey

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值