【ADB基础】ADB及Monkey测试

news/2025/1/6 22:22:29/文章来源:https://www.cnblogs.com/upstudy/p/18653178

什么是monkey

Monkey 是Android SDK提供的一个命令行工具,可以简单方便的发送伪随机的用户事件流,对Android APP做压力(稳定性)测试。主要是为了测试app是否存在无响应和崩溃的情况。

monkey命令说明

monkey 测试命令使用及详细说明

常用命令

语法:adb shell monkey -p 包名 (-s 种子数) 事件 调试选项 -v 执行次数 >日志路径-p                            # 包名
-v                            # 反馈信息的级别,共三级(-v -v -v)
-s(seed)                    # 随机数种子(随机种子数seed值是一个用于生成伪随机数的起始值)
"""
seed的作用和重要性
Seed值在Monkey测试中起着至关重要的作用。它决定了随机事件生成的顺序和结果。如果两次Monkey测试使用相同的seed值,那么它们生成的事件序列将会完全相同。这意味着,通过使用相同的seed值,可以复现之前测试的结果,这对于调试和验证软件的稳定性非常有用‌
"""
--throttle 300                # 延时300ms(实际用户操作的最快300毫秒左右一个动作事件,所以可以设置为300毫秒)
--randomize-throttle 300      # 随机延时300ms
--ignore-crashes              # 忽略崩溃
--ignore-timeouts             # 忽略反应时间过长(忽略超时 系统ANR时,继续发送事件)
--ignore-native-crashes       # 忽略本地代码导致的崩溃
--ignore-security-exceptions  # 忽略安全异常--pct-touch         # 触摸事件百分比
--pct-motion        # 滑动事件百分比(在屏幕某处按下、随机移动、抬起的操作)
192000              # 事件数量
> 1.txt             # // 输出日志

其他命令

--pct-pinchzoom     # 缩放事件百分比
--pct-trackball     # 轨迹球事件百分比(滚动球事件---不常使用参数,现在手机基本没有滚动球)    
--pct-rotation      # 屏幕旋转事件百分比        
--pct-nav           # 基本导航事件百分比(点击键盘上下左右按键的操作---不常使用参数,现在手机基本没有方向键)
--pct-majornav      # 主要导航事件百分比(5-way 键中的KEYCODE_DPAD_CENTER、KEYCODE_MENU键---不常使用参数,现在手机基本没有这几个实体键)
--pct-syskeys       # 系统事件百分比(Home、Back、startCall、endCall、volumeControl)
--pct-appswitch     # Activity启动事件百分比(appswitch 切换Activity事件:执行一个startActivity()操作)
--pct-flip          # 键盘翻转事件百分比       
--pct-anyevent      # 其他事件百分比(除了上述事件之外的其他事件)

实例:(touch事件及motion事件各执行10000次)

adb shell monkey -p  com.IGRS.shtmeeting --throttle 300 --pct-touch 50 --pct-motion 50 --ignore-crashes --ignore-timeouts --ignore-native-crashes --ignore-security-exceptions  -v -v -v 200000 >D:\Log\monkey_log\2020_09_28.txt

Monkey终止命令

在命令执行过程中,按 Ctrl+C 可以退出,但不代表monkey停止 (包括运行monkey时拔掉数据线,仍然未停止),如果需要停止monkey可以杀死该进程 id,如下命令:

# 停止前先查看当前系统,monkey在跑的 进程id
adb shell ps | findstr monkey

执行结果:

# 强制杀死在跑的monkey进程
adb shell kill <进程pid>

执行结果:

monkey的日志分析

在文件中查找failed失败 error错误 crashes崩溃 timeouts超时 exception异常 ANR等字段

  • 正常:
    monkey测试顺利执行完成,在log的最后,会打印当前执行时间的次数和所花费的时间。Monkey finished代表执行完成
  • 异常:(日志内搜索异常关键字)
    • 无响应-Anr问题:在日志中搜索“ANR”
    • 在日志中搜索“CRASH”
    • 其他问题:在日志中搜索”Exception”

日志中异常实例

ANR:程序无响应

###########操作无响应的问题,主要表现在Monkey运行过程中,出现某功能无响应,提示是否“强制关闭“或“等待“##########
// NOT RESPONDING: com.android.soundrecorder (pid 1931)
ANR in process: com.android.soundrecorder (last in com.android.soundrecorder)
Annotation: keyDispatchingTimedOut
CPU usage:
Load: 8.24 / 8.41 / 8.25
CPU usage from 35911ms to 83ms ago:com.android.soundrecorder: 4% = 3% user + 0% kernel / faults: 997 minor 43 maj
ormediaserver: 2% = 2% user + 0% kernel / faults: 267 minor 3 majorandroid.process.media: 2% = 0% user + 1% kernel / faults: 563 minor 194 majorsystem_server: 1% = 1% user + 0% kernel / faults: 1279 minor 5 majorcom.cootek.touchpal: 0% = 0% user + 0% kernel / faults: 180 minor 1 majorsensorserver_ya: 0% = 0% user + 0% kernel / faults: 47 minor 1 majormmcqd: 0% = 0% user + 0% kernelapp_process: 0% = 0% user + 0% kernel / faults: 203 minor 1 majorcom.fihtdc.brservice: 0% = 0% user + 0% kernel / faults: 29 minorkswapd0: 0% = 0% user + 0% kernelcom.android.settings: 0% = 0% user + 0% kernel / faults: 266 minorport-bridge: 0% = 0% user + 0% kernel / faults: 19 minorrpcrouter: 0% = 0% user + 0% kernelcom.android.mms: 0% = 0% user + 0% kernel / faults: 135 minor 8 major
TOTAL: 13% = 8% user + 4% kernel + 0% iowaitprocrank:PID      Vss      Rss      Pss      Uss  cmdline1209   35368K   25376K   15283K   14036K  system_server1342   32788K   24596K   14899K   14136K  android.process.acore……
// procrank status was 0
anr traces:
// meminfo status was 0
** System appears to have crashed at event 59034 of 5000000 using seed 0

CRASH:程序崩溃闪退

NullPointerException

**************************************************************************
// CRASH: android.process.acore (pid 1339)
// Short Msg: java.lang.NullPointerException
// Long Msg: java.lang.NullPointerException
// Build Label: android:FIH/msm7627_surf/msm7627_surf/F0X:1.6/DONUT/0001_0_020:e
ng/release-keys
// Build Changelist: -1
// Build Time: 1271397239
// ID:
// Tag: AndroidRuntime
// java.lang.NullPointerException:
//   at com.android.launcher.LauncherAnimator.ScrollAnimate3dRotate.drawFrame(ScrollAnimate3dRotate.java:275)
//   at com.android.launcher.Workspace.dispatchDraw(Workspace.java:605)
//   at android.view.ViewGroup.drawChild(ViewGroup.java:1524)
//   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
//   at com.android.launcher.DragLayer.dispatchDraw(DragLayer.java:258)
//   at android.view.ViewGroup.drawChild(ViewGroup.java:1524)
//   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
//   at android.view.View.draw(View.java:6329)
//   at android.widget.FrameLayout.draw(FrameLayout.java:352)
//   at android.view.ViewGroup.drawChild(ViewGroup.java:1526)
//   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
//   at android.view.View.draw(View.java:6329)
//   at android.widget.FrameLayout.draw(FrameLayout.java:352)
//   at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1901)
//   at android.view.ViewRoot.draw(ViewRoot.java:1333)
//   at android.view.ViewRoot.performTraversals(ViewRoot.java:1098)
//   at android.view.ViewRoot.handleMessage(ViewRoot.java:1618)
//   at android.os.Handler.dispatchMessage(Handler.java:99)
//   at android.os.Looper.loop(Looper.java:123)
//   at android.app.ActivityThread.main(ActivityThread.java:4203)
//   at java.lang.reflect.Method.invokeNative(Method.java:-2)
//   at java.lang.reflect.Method.invoke(Method.java:521)
//   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:799)
//   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
//   at dalvik.system.NativeStart.main(NativeStart.java:-2)
** System appears to have crashed at event 7908 of 5000000 using seed 0

OutOfMemoryError

#####低内存异常,抛出OutOfMemoryError异常或者是通过kill process 来杀掉部分进程以释放内存空间,当然如果被kill点关键的进程的话,也就可能导致部分应用会自动的退出。出现该情况时,主要是在进行频繁的进行大量的操作导致的#############
// CRASH: com.android.elastos.backup (pid 1581)
// Short Msg: bitmap size exceeds VM budget
// Long Msg: java.lang.OutOfMemoryError: bitmap size exceeds VM budget
// Build Label: android:FIH/msm7627_surf/msm7627_surf/F0X:1.6/DONUT/0001_0_020:eng/release-keys
// Build Changelist: -1
// Build Time: 1271397239
// ID:
// Tag: AndroidRuntime
// java.lang.OutOfMemoryError: bitmap size exceeds VM budget
//   at android.graphics.Bitmap.nativeCreate(Bitmap.java:-2)
//   at android.graphics.Bitmap.createBitmap(Bitmap.java:464)
//   at android.graphics.Bitmap.createBitmap(Bitmap.java:431)
//   at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:336)
//   at android.widget.AbsListView.preScaleBitmapBG(AbsListView.java:2354)
//   at android.widget.AbsListView.draw(AbsListView.java:2365)
//   at android.view.ViewGroup.drawChild(ViewGroup.java:1526)
//   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
//   at android.view.View.draw(View.java:6329)
//   at android.view.ViewGroup.drawChild(ViewGroup.java:1526)
//   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
//   at android.view.View.draw(View.java:6329)
//   at android.widget.FrameLayout.draw(FrameLayout.java:352)
//   at android.view.ViewGroup.drawChild(ViewGroup.java:1526)
//   at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1256)
//   at android.view.View.draw(View.java:6329)
//   at android.widget.FrameLayout.draw(FrameLayout.java:352)
//   at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1901)
//   at android.view.ViewRoot.draw(ViewRoot.java:1333)
//   at android.view.ViewRoot.performTraversals(ViewRoot.java:1098)
//   at android.view.ViewRoot.handleMessage(ViewRoot.java:1618)
//   at android.os.Handler.dispatchMessage(Handler.java:99)
//   at android.os.Looper.loop(Looper.java:123)
//   at android.app.ActivityThread.main(ActivityThread.java:4203)
//   at java.lang.reflect.Method.invokeNative(Method.java:-2)
//   at java.lang.reflect.Method.invoke(Method.java:521)
//   at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:799)
//   at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:557)
//   at dalvik.system.NativeStart.main(NativeStart.java:-2)
** System appears to have crashed at event 143290 of 100000000 using seed 0#

monkey测试顺利完成,日志最后会有monkey finished标识

Monkey测试pass或fail判断1)Monkey finished打开LOG,查看log的最下端,是否有类似以下字段

日志搜索”CRASH”字段,如果搜索到有结果,则表明有进程出现问题,测试不通过。

CRASH: com.onekchi.downloadmanager (pid 12919)

ANR

在Log中搜素该字段,如果有搜索有结果,则表示测试过程中,测试对象出现了无响应的现象,因此测试不通过。--throttle <毫秒>值建议为500

Exception

崩溃问题:在日志中搜索“Exception”,快速定位到关键事件信息。

屏蔽设备功能

// 隐藏手机的状态栏
adb shell settings put global policy_control immersive.full=* 
// 开启手机状态栏
adb shell settings put global policy_control null 
// 屏蔽音量键
--pct-syskeys 0

adb logcat的日志和monkey命令日志的区别

  • adb monkey日志是记录monkey命令在手机APP操作的事件。
  • adb logcat日志是记录手机系统在运行app时有什么异常的事件。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/864419.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

20241314 《计算机基础与程序设计》课程总结

20241314 《计算机基础与程序设计》课程总结每周作业链接汇总第一周课程概论 工业革命与浪潮之巅 信息与信息安全 计算机系统概论 计算机安全 计算的限制思维作业第二周课程概论 数字化与信息安全第三周课程概论 数字逻辑门 数据类型 冯诺依曼体系第四周课程概论 计算机系统 计…

同硕计算机专业:统考+课程+源码学习资料全部免费送!

考研之路,道阻且长。对于计算机专业的学子来说,备考之路更是充满挑战。为了帮助广大考生高效备战,我在此精心整理了一套同硕计算机专业统考历年真题和复习重点、专业课程学习和相关源码资料,并免费分享给大家!我的全部学习资料都放在那里,后续我还会增加资料分享放在那里…

20241316 《计算机基础与程序设计》课程总结

20241316 《计算机基础与程序设计》课程总结第一周作业:浏览教材并提出问题第二周作业: 自学教材计算机科学概论(第七版)第1章并完成云班课测试 《C语言程序设计》第1章并完成云班课测试第三周作业:计算机科学概论(第七版)第2章,第3章 并完成云班课测试第四周作业:学习…

Windows环境下反弹shell各类姿势

在渗透测试过程中我们有时候需要通过Windows平台来反弹shell到我们的VPS主机以及CS端,那么这个过程中我们就需要借助Windows平台内置的可执行程序来执行命令,其中首选的就是powershell,本篇文章我们主要介绍如何通过Windows平台中如何通过powershell来反弹shell操作。 power…

集成运算放大器的简单介绍

集成运算放大器是一种具有很高放大倍数的多级直接耦合放大电路。是发展最早、应用最广泛的一种模拟电路。 集成电路是把整个电路的各个元件以及相互之间的连接同时制造在一块半导体芯片上,组成一个不可分点整体。 集成电路的特点:体积小,重量轻、功耗低、可靠性高、成本低、…

利用huggingface尝试的第一个简单的文本分类任务

` 这是一个简单的文本分类任务,基本的流程步骤还是挺清晰完整的,和之前那个简单的cnn差不多, 用到了transformers包,还需用到huggingface的模型rbt3, 但是好像连接不上``遇到的问题: 1.导入的包不可用,从AutoModelForTokenClassification换成了AutoModelForSequenceC…

【嵌入式编程】内存分布

一、内存分布图在操作系统中,内存被组织和管理以支持进程的运行。以下是一些常见的内存分布概念: 【内核空间】:操作系统内核使用的内存区域,用于存储内核代码、数据结构和进程控制块(PCB)。【用户空间】:存储用户的代码。未初始化变量区(.bss):存放未初始化的全局变量…

北京健康证(立水桥地铁站附近)

体检:记得带身份证就可以,最好自带一支笔,用他的笔要排队,我买的是96的,带培训证的。 下面这个表只填:身份证号,手机号,姓名就可以,类别、是否培训以交钱时候前台登记的为准,照片也不采集,直接用身份证上的相片

北京健康证

体检:记得带身份证就可以,我买的是96的,带培训证的。 下面这个表只填:身份证号,手机号,姓名就可以,类别以交钱时候前台登记的为准,照片也不采集,直接用身份证上的相片

anaconda安装与环境配置

一、Anaconda简介 ​ Anaconda 是专门为了方便使用 Python 进行数据科学研究而建立的一组软件包,涵盖了数据科学领域常见的 Python 库,并且自带了专门用来解决软件环境依赖问题的 conda 包管理系统。主要是提供了包管理与环境管理的功能,可以很方便地解决多版本python并存、…

java学习报告

Java学习报告 目录 第一章 初识java与面向对象程序设计 1 第二章 java编程基础 3 第三章 面向对象程序设计(基础) 13 第四章 面向对象程序设计(进阶) 15 第五章 异常 17 第六章 java常用类 1720 初识java与面向对象程序设计Java概述计算机编程语言发展史“计算机之父”冯诺…

PyTorch Geometric框架下图神经网络的可解释性机制:原理、实现与评估

在机器学习领域存在一个普遍的认知误区,即可解释性与准确性存在对立关系。这种观点认为可解释模型在复杂度上存在固有限制,因此无法达到最优性能水平,神经网络之所以能够在各个领域占据主导地位,正是因为其超越了人类可理解的范畴。 其实这种观点存在根本性的谬误。研究表明…