Giter Club home page Giter Club logo

maxim's Introduction

Maxim

An efficient Android Monkey Tester, available for emulators and real devices 基于遍历规则的高性能Android Monkey,适用于真机/模拟器的APP UI压力测试

https://testerhome.com/topics/11719

环境预备

  • 支持 Android 5,6,7,8,9、10、11真机及模拟器;
  • 将 framework.jar , monkey.jar push 到手机上某个目录中,建议/sdcard
adb push framework.jar /sdcard
adb push monkey.jar /sdcard

图形化界面

下载 AppetizerIOAPP测试->UI压力测试,支持多种模式,黑白名单,所有配置文件(自动json语法查错),测试开始前自动push配置文件

测试过程log实时更新  一键错误log上报作者

命令行模式

cmd 命令 : adb shell CLASSPATH=/sdcard/monkey.jar:/sdcard/framework.jar exec app_process /system/bin tv.panda.test.monkey.Monkey -p com.panda.videoliveplatform --uiautomatormix --running-minutes 60 -v -v

  • tv.panda.test.monkey.Monkey: monkey入口类,不要修改
  • com.panda.videoliveplatform: 被测app包名,需要修改
  • --uiautomatormix: 遍历策略

策略

  1. 模式 Mix (基于事件概率的压力测试)

    --uiautomatormix
    直接使用底层accessibiltyserver获取界面接口 解析各控件,随机选取一个控件执行touch操作。
      同时与原monkey 其他操作按比例混合使用
      默认accessibilityserver action占比50%,其余各action分剩余的50%
      accessibilityserver action占比可配置 --pct-uiautomatormix n
    
  2. 模式 DFS

--uiautomatordfs
深度遍历算法
  1. 模式Troy
--uiautomatortroy
控件选择策略按max.xpath.selector配置的高低优先级来进行深度遍历
  1. 保留原始monkey

  2. 总运行时长 --running-minutes 3 运行3分钟

  3. --act-whitelist-file /sdcard/awl.strings 定义白名单 --act-blacklist-file

其他参数与原始monkey一致

changelog

20180112 增加防跳出及切回、防误点状态栏及下拉状态栏

20180115 增加防睡眠及睡眠唤醒、防假死及自拉活机制

20180116 增加随机输入

随机输入 需要提前安装adbkeyboard https://github.com/senzhk/ADBKeyBoard 随机输入默认随机输入字符,内容可自定义配置,格式如ape.strings文件,每行为随机输入项。

20180118 增加Activity黑白名单 格式如awl.strings,可对跳转做更细粒度控制,比如控制仅在几个特定Activity中跑monkey

20180119 framework兼容 Android5, 6, 7, 8.0

Android5 不支持dfs 模式,因5的accessibiltyserver缺少一个api。故不支持 增加 APP崩溃时自动保存堆栈信息到 /sdcard/crash-dump.log 注 追加保存

20180211增加max.config项

max.startAfterNSecondsofsleep = 6000 启动后sleep 6秒,可自定义 max.wakeupAfterNSecondsofsleep = 4000 唤醒后

20180223 增加特殊事件

配置 max.xpath.actions, 案例

[
{
    "prob": 1,
    "activity":"tv.panda.account.activity.WebLoginActivity",
    "actions": [
        {
            "xpath": "//*[@class='android.widget.EditText']",
            "action": "INPUTTEXT",
            "text": "13810751000",
            "index": 0,
            "throttle": 300
        },
        {
            "xpath": "//*[@class='android.widget.EditText']",
            "action": "INPUTTEXT",
            "text": "123400",
            "index": 1,
            "throttle": 300
        },
        {
            "xpath": "//*[@content-desc='登录' and @class='android.view.View']",
            "index": 0,
            "action": "CLICK",
            "throttle": 1000
        }]
},
{
     "prob": 1,
     "actions": [
     {
             "xpath": "//*[@class='android.view.View']",
             "index": 0,
             "action": "SWIPE",
             "args": "10,1000,800,1000,100",
             "throttle": 3000
         }]
 },
{
     "prob": 1,
     "actions": [
     {
             "xpath": "//*[@class='android.view.View']",
             "index": 0,
             "action": "TOUCH",
             "args": "500,1000",
             "throttle": 1000
         }]
},
{
     "prob": 1,
     "actions": [
     {
             "xpath": "//*[@class='android.view.View']",
             "index": 0,
             "action": "KEYEVENT",
             "keycode": 4,
             "throttle": 1000
         }]
}
]

上述包含3个特殊事件 发生概率prob =1 为100%发生 仅当 当前activity 为 tv.panda.account.activity.WebLoginActivity 时或无activity配置时做事件查找 xpath 为待查找控件的xpath 支持复杂型xpath,支持 index 索引选择 throttle 为该特殊步骤执行完后sleep n 毫秒 Action 支持

  1. Click 点击匹配到的xpath控件
  2. INPUTTEXT 在匹配到的xpath控件中输入 text 指定字符,输入需要提前安装adbkeyboard
  3. TOUCH 点击指定坐标 args = (x,y)
  4. SWIPE 按执行路径滑动 args = (x1,y1,x2,y2,step)
  5. KEYEVENT 执行键盘事件 keycode

注 配置完成后请贴在 json.cn 检查格式,注意” : , 非中文 将该文件 push 到 /sdcard/max.xpath.actions

20180228 增加黑控件 黑区域屏蔽

配置max.widget.black 案例

[
{
    "activity":"com.panda.videoliveplatform.activity.MainFragmentActivity",
    "xpath": "//*[@class='android.widget.TextView' and @text='我的校园' and @resource-id='com.panda.videoliveplatform:id/tv_title']"
},
{
    "activity":"com.panda.videoliveplatform.activity.MainFragmentActivity",
    "xpath": "//*[@class='android.widget.TextView' and @text='车队' and @resource-id='com.panda.videoliveplatform:id/tv_title']",
    "index": 0,
    "bounds": "[0,633][900,789]"
},
{
    "activity":"com.panda.videoliveplatform.activity.MainFragmentActivity",
    "bounds": "[0,1107][900,1263]"
}
]

当且仅当 当前activity == 所配activity 或未配activity时 做黑检查 三种方式:

  1. 仅配置bounds 屏蔽某个区域,在该区域内的控件或坐标不会被点击。
  2. 配置xpath 查找匹配的控件,屏蔽点击该控件。
  3. xpath+bounds 查找匹配的控件,当控件存在时屏蔽指定的区域。

注 配置完成后请贴在 json.cn 检查格式,注意” : , 非中文 将该文件 push 到 /sdcard/max.widget.black

20180308 截图及dump xml

配置max.config

max.takeScreenShot   开启截图
max.savePageSource  保存xml 

截图的生效条件: throttle > 200 && max.takeScreenShot = true

案例: adb shell CLASSPATH=/sdcard/monkey.jar:/sdcard/framework.jar exec app_process /system/bin tv.panda.test.monkey.Monkey -p com.panda.videoliveplatform --uiautomatormix --running-minutes 6 -v -v --throttle 400 --output-directory /sdcard/max1/

备注:每分钟100-200截图,故因大量截图对手机空间要求较高,仅为复现崩溃时建议开启截图

20180322 增加TROY模式

adb shell CLASSPATH=/sdcard/monkey.jar:/sdcard/framework.jar exec app_process /system/bin tv.panda.test.monkey.Monkey -p com.panda.videoliveplatform --uiautomatortroy --running-minutes 15 -v -v

配置max.xpath.selector 控件优先级

[
{
    "firstList":
    [
        {  "xpath": "//*[contains(@text,'绝地求生')]" }
    ],
    "selectList":
    [
        {  "xpath": "//*[@clickable='true']" },
        {  "xpath": "//*[@clickable='true']//*[contains(name(),'Text')]" },
        {  "xpath": "//*[@clickable='true']//*[contains(name(),'Button')]" },
        {  "xpath": "//*[@clickable='true']//*[contains(name(),'Image')]" }
    ],
    "lastList":
    [
        {  "xpath": "//*[../*[@selected='true']]" },
        {  "xpath": "//*[../../*/*[@selected='true']]" },
        {  "xpath": "//*[../../*/*[@selected='true'] and contains(@resource-id,'tab_')]" },
        {  "xpath": "//*[contains(@resource-id,'HorizontalScrollView')]" }
    ],
    "blackList":
    [
        {  "xpath": "//*[contains(@resource-id,'wrapper_in_custom_title_bar')]//*[contains(@resource-id,'right_button')]" },
        {  "xpath": "//*[contains(@resource-id,'share')]" }
    ]
}
]

控件选择策略会按 1first 2select 3last 并屏蔽black来执行遍历

max.xpath.selector 需要push 到/sdcard/

##20180517 增加随机测试多个app

adb shell CLASSPATH=/sdcard/monkey.jar:/sdcard/framework.jar exec app_process /system/bin tv.panda.test.monkey.Monkey --uiautomatormix --running-minutes 150 -v -v --system  /sdcard/apps.strings

apps.strings格式如下:
com.panda.videoliveplatform
com.google.android.calculator
com.android.chrome

其中每个app随机跑5-15分钟

20180725 增加崩溃回溯截图

运行时shell增加 --imagepolling 参数 , 开启崩溃回溯截图、关闭原截图逻辑
当崩溃发生时 进行截图保存,实现可回溯崩溃场景,默认会在 /sdcard/crash_$timestamp/图

配置max.config

max.takeScreenShot =True  开启截图  
max.flushImagesThreshold  =50 回溯区间大小xx张  

截图的生效条件: throttle > 200 && max.takeScreenShot = true && --imagepolling

2019.08.16 支持更多事件

mix 增加 back event 默认事件占比10%

  --pct-back 5 (设置占比5)

mix 增加 重启app event 默认事件占比0.3%

  --pct-reset 0 (关闭重启 事件)

mix 增加 null intent event 默认事件占比0.2% 该事件探测app中exported组件,随机发null intent

 --pct-nullintent 0 (关闭null intent 事件)

增加monkey api

  如何使用:
  1)先启动monkey
  adb shell CLASSPATH=/sdcard/monkey.jar:/sdcard/framework.jar exec app_process /system/bin tv.panda.test.monkey.Monkey -p com.panda.videoliveplatform --uiautomatorapi --running-minutes 100 -v -v -v -v
  2)adb shell netcfg 查看ip
  3) 结合Monkeyapi.py编写自己的test.py

  目前提供了如下接口
  1)dumptree
  getXml()
  2) 点击
  click(500,550)
  3)back
  back()
  4) 截屏base64
  getScreenShotBase64()


  demo
  https://github.com/zhangzhao4444/Maxim/blob/master/MonkeyApi.py 无须修改
  https://github.com/zhangzhao4444/Maxim/blob/master/test.py

2020.12.09 支持11

兼容 Android11

下线dfs code

2020.12.21

恢复dfs mode

2021.05.30

Android11 兼容 bugfix

mix 优化允许切出app,增加FUZZ切回app

mix 优化获取和设置输入法的反射

2021.06.12

mix 增加 自定义启动activity

--intent-action  设置intent的action

--intent-data    设置intent的data ,Uri.parse(data)

--intent-extraKey  设置intent额外的bundle key

--intent-extraValue  设置intent额外的bundle key对应的value

1. Requirements

  • Android 5/6/7/8/9/10/11

2. Installation

adb push framework.jar /sdcard
adb push monkey.jar /sdcard

Optionally, push configuration file(s)

adb push ape.strings /sdcard
adb push awl.strings /sdcard

3. Usage

Maxim is started from adb shell

adb shell CLASSPATH=/sdcard/monkey.jar:/sdcard/framework.jar exec app_process /system/bin tv.panda.test.monkey.Monkey -p com.panda.videoliveplatform --uiautomatordfs 5000

Modes

  • mix mode: --uiautomatormix use AccessibilityService to resolve view tree and mix vanilla monkey events with view clicks. About 10-20 actions per second.
    • --pct-uiautomatormix ratio (percentage number)

Timing control

  • --running-minutes n run for n minutes

Optional configuration (rules)

  • --act-whitelist-file e.g., /sdcard/awl.strings white list for activities
  • --act-blacklist-file
  • max.xpath.actions to specify special event, see example

maxim's People

Contributors

mingyuan-xia avatar zhangzhao4444 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

maxim's Issues

(使用帮助)如何查看调试信息

使用 -v 参数
-v 1级log
-v -v 2级log

例如:
adb shell CLASSPATH=/sdcard/monkey.jar:/sdcard/framework.jar exec app_process /system/bin tv.panda.test.monkey.Monkey -p com.panda.videoliveplatform --uiautomatormix --running-minutes 60 -v -v

三星6.0.1版本上执行时,monkey卡停了

在三星手机上出现了这种情况,即应用界面没有变化了,然后等了段时间,monkey也自动停止了C:\Users\panxr33970>adb shell ps | findstr tv.panda.test.monkey
shell 30226 23413 1802800 105564 hrtimer_na b6d39b1c S tv.panda.test.monkey

mac 上调试Android手机,无法启动Maxim

sh-wangsf:~ wangshufeng$ adb shell CLASSPATH=/sdcard/monkey.jar:/sdcard/framework.jar exec app_process /system/bin tv.panda.test.monkey.Monkey -p com.snda.wifilocating --uiautomatormix --running-minutes 3
sh-wangsf:~ wangshufeng$

两个jar包已经push到手机的sdcard文件夹中

小米手机在fast_android模式下跑的时候出现输入服务崩溃

java.lang.SecurityException: Injecting to another application requires INJECT_EVENTS permission
at android.os.Parcel.createException(Parcel.java:2074)
at android.os.Parcel.readException(Parcel.java:2042)
at android.os.Parcel.readException(Parcel.java:1990)
at android.hardware.input.IInputManager$Stub$Proxy.injectInputEvent(IInputManager.java:925)
at android.hardware.input.InputManager.injectInputEvent(InputManager.java:886)
at com.android.commands.monkey.p.a(SourceFile:132)
at com.android.commands.monkey.Monkey.f(SourceFile:1863)
at com.android.commands.monkey.Monkey.a(SourceFile:1105)
at com.android.commands.monkey.Monkey.main(SourceFile:827)
at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:380)
Caused by: android.os.RemoteException: Remote stack trace:
at com.android.server.input.InputManagerService.injectInputEventInternal(InputManagerService.java:733)
at com.android.server.input.InputManagerService.injectInputEvent(InputManagerService.java:707)
at android.hardware.input.IInputManager$Stub.onTransact(IInputManager.java:422)
at android.os.Binder.execTransactInternal(Binder.java:1021)
at android.os.Binder.execTransact(Binder.java:994)

不支持安卓11吗?

adb shell CLASSPATH=/sdcard/monkey.jar:/sdcard/framework.jar exec app_process /system/bin tv.panda.test.monkey.Monkey -p com.android.dazhihui --throttle 200 --imagepolling --pct-touch 40 --pct-motion 20 --pct-pinchzoom 5 --pct-nav 5 --pct-majornav 5 --pct-rotation 1 --uiautomatormix --running-minutes 120 -v -v -v -v --output-directory /sdcard/maximlog

---------------------------------log---------------------------------------------------------------------------
.....
[Maxim] // Find ADBKeybaord.
[Maxim] // Device Info: Google-Pixel 4, Android Version: 11
[Maxim] strategy : uiautomator-Mix.

Cannot resolve m0: getPermissionInfo

maxism截图未生成

已将加了配置的:max.takeScreenShot = true配置文件max.config推送到sdcard,并且在命令行执行成功,在指定的文件夹下未生成对应的单步截图。

怎么编写max.xpath.selector让底部Tab界面从左到右遍历,并且底部Tab界面里的头部Tab界面也从左到右遍历

1、主界面有多个底部Tab,每个底部Tab界面有多个头部Tab,怎么编写max.xpath.selector让maxim底部Tab界面从左到右遍历,并且底部Tab界面里的头部Tab界面也从左到右遍历,头部Tab界面里的元素就从上到下遍历;
2、如何控制遍历的深度;
3、编写多个firstList、selectList、lastList的xpath,同个界面同时存在符合的多个元素,遍历的优先级是怎样的呢
[
{
"firstList": [
{
"xpath": "//[contains(@text,'发现')]"
},
{
"xpath": "//
[contains(@text,'X友')]"
},
{
"xpath": "//[contains(@text,'小X')]"
},
{
"xpath": "//
[contains(@text,'服务')]"
},
{
"xpath": "//[contains(@text,'我')]"
}
],
"selectList": [
{
"xpath": "//
[@enabled='true']"
},
{
"xpath": "//[@enabled='true']//[contains(name(),'Text')]"
},
{
"xpath": "//[@enabled='true']//[contains(name(),'Button')]"
},
{
"xpath": "//[@enabled='true']//[contains(name(),'Image')]"
}
],
"lastList": [
{
"xpath": "//[../[@enabled='true']]"
},
{
"xpath": "//[../..//[@enabled='true']]"
},
{
"xpath": "//
[../..//[@enabled='true'] and contains(@resource-id,'tab_')]"
},
{
"xpath": "//[../..//[@enabled='true'] and contains(@resource-id,'iv_tab_')]"
},
{
"xpath": "//
[contains(@resource-id,'HorizontalScrollView')]"
},
{
"xpath": "//[@enabled='true']//[contains(name(),'Image')]"
}
],
"blackList": [
{
"xpath": "//[contains(@resource-id,'wrapper_in_custom_title_bar')]//[contains(@resource-id,'right_button')]"
},
{
"xpath": "//[contains(@resource-id,'share')]"
},
{
"xpath": "//
[@resource-id='com.XXX.XXXX:id/fly_progress']"
}
]
}
]

一个Android Go机型跑过程抛出error:java.lang.Exception: Stack trace

系统:Android Go(8.1)
MTK平台

java.lang.Exception: Stack trace
at java.lang.Thread.dumpStack(Thread.java:1348)
at android.graphics.Bitmap.recycle(Bitmap.java:346)
at android.app.UiAutomation.takeScreenshot(UiAutomation.java:748)
at tv.panda.test.monkey.MonkeySourceRandomUiAutomatorMix.takeScreenshot(MonkeySourceRandomUiAutomatorMix.kt:1079)
at tv.panda.test.monkey.MonkeySourceRandomUiAutomatorMix.executeScreenshotTask(MonkeySourceRandomUiAutomatorMix.kt:1059)
at tv.panda.test.monkey.MonkeySourceRandomUiAutomatorMix.generateEvents(MonkeySourceRandomUiAutomatorMix.kt:483)
at tv.panda.test.monkey.MonkeySourceRandomUiAutomatorMix.getNextEvent(MonkeySourceRandomUiAutomatorMix.kt:76)
at tv.panda.test.monkey.Monkey.runMonkeyCycles(Monkey.kt:1078)
at tv.panda.test.monkey.Monkey.run(Monkey.kt:580)
at tv.panda.test.monkey.Monkey$Companion.main(Monkey.kt:1299)
at tv.panda.test.monkey.Monkey.main(Unknown Source:7)
at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:285)
java.lang.Exception: Stack trace
at java.lang.Thread.dumpStack(Thread.java:1348)
at android.graphics.Bitmap.recycle(Bitmap.java:346)
at android.app.UiAutomation.takeScreenshot(UiAutomation.java:748)
at tv.panda.test.monkey.MonkeySourceRandomUiAutomatorMix.takeScreenshot(MonkeySourceRandomUiAutomatorMix.kt:1079)
at tv.panda.test.monkey.MonkeySourceRandomUiAutomatorMix.executeScreenshotTask(MonkeySourceRandomUiAutomatorMix.kt:1059)
at tv.panda.test.monkey.MonkeySourceRandomUiAutomatorMix.generateEvents(MonkeySourceRandomUiAutomatorMix.kt:509)
at tv.panda.test.monkey.MonkeySourceRandomUiAutomatorMix.getNextEvent(MonkeySourceRandomUiAutomatorMix.kt:76)
at tv.panda.test.monkey.Monkey.runMonkeyCycles(Monkey.kt:1078)
at tv.panda.test.monkey.Monkey.run(Monkey.kt:580)
at tv.panda.test.monkey.Monkey$Companion.main(Monkey.kt:1299)
at tv.panda.test.monkey.Monkey.main(Unknown Source:7)
at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:285)
java.lang.Exception: Stack trace
at java.lang.Thread.dumpStack(Thread.java:1348)
at android.graphics.Bitmap.recycle(Bitmap.java:346)
at android.app.UiAutomation.takeScreenshot(UiAutomation.java:748)
at tv.panda.test.monkey.MonkeySourceRandomUiAutomatorMix.takeScreenshot(MonkeySourceRandomUiAutomatorMix.kt:1079)
at tv.panda.test.monkey.MonkeySourceRandomUiAutomatorMix.executeScreenshotTask(MonkeySourceRandomUiAutomatorMix.kt:1059)
at tv.panda.test.monkey.MonkeySourceRandomUiAutomatorMix.generateEvents(MonkeySourceRandomUiAutomatorMix.kt:509)
at tv.panda.test.monkey.MonkeySourceRandomUiAutomatorMix.getNextEvent(MonkeySourceRandomUiAutomatorMix.kt:76)
at tv.panda.test.monkey.Monkey.runMonkeyCycles(Monkey.kt:1078)
at tv.panda.test.monkey.Monkey.run(Monkey.kt:580)
at tv.panda.test.monkey.Monkey$Companion.main(Monkey.kt:1299)
at tv.panda.test.monkey.Monkey.main(Unknown Source:7)
at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:285)

如何可以点击到权限框允许权限?

[Maxim] // Rejecting start of Intent { act=android.content.pm.action.REQUEST_PERMISSIONS pkg=com.google.android.packageinstaller cmp=com.google.android.packageinstaller/com.android.packageinstaller.permission.ui.GrantPermissionsActivity } in package com.google.android.packageinstaller

如何能点到权限框?

执行命令,控制台显示执行random hit touch,但是被测试应用一直无法继续执行

执行的设备有pixel 3a 安卓10、三星s8 安卓8、小米8 安卓9、华为Mate9 安卓9
命令如下
adb -s 设备id shell CLASSPATH=/sdcard/monkey.jar:/sdcard/framework.jar exec app_process /system/bin tv.panda.test.monkey.Monkey -p 被测试应用--uiautomatormix --running-minutes 10 --imagepolling --throttle 680 -v -v -v -v -v -v --output-directory /sdcard/max-output
报错的logcat如下

12-18 11:14:11.356 32460 32622 E NetworkScheduler: Invalid component specified.
12-18 11:14:11.411 32460 32486 E NetworkScheduler: Invalid component specified.
12-18 11:14:12.523 32460 32622 E GCM     : Missing checkin config file
12-18 11:14:12.525 32689 32725 E FirebaseInstanceId: Token retrieval failed: AUTHENTICATION_FAILED
12-18 11:14:19.388   628   652 E DnsProxyListener: block dns query from uid = 10221
12-18 11:14:19.404 32460 32486 E NetworkScheduler: Invalid component specified.
12-18 11:14:19.627   755  2427 E AudioFlinger: open /proc/32689/cmdline error
12-18 11:14:22.806   682   682 E soundtrigger: audio_extn_sound_trigger_update_stream_status: invalid input device 0x0, for event 2
12-18 11:14:39.584   755 29035 E AudioFlinger: open /proc/32689/cmdline error
12-18 11:14:42.655   682   682 E soundtrigger: audio_extn_sound_trigger_update_stream_status: invalid input device 0x0, for event 2
12-18 11:14:45.386   959  1058 E storaged: getDiskStats failed with result NOT_SUPPORTED and size 0

执行monkey之后,拔掉数据线monkey也停止了

楼主你好,想请问一下,使用楼主这种方式启动monkey只能连接数据线进行操作,一旦拔掉数据线之后monkey就停止了,试过不用楼主这种方式是不会停止的,请问这种怎么解决呢?

log如何输出?

adb shell CLASSPATH=/sdcard/monkey.jar:/sdcard/framework.jar exec app_process /system/bin tv.panda.test.monkey.Monkey -p com.autonavi.minimap --uiautomatormix --running-minutes 5 -v -v 后面如何加参数进行log输出

试过:adb shell CLASSPATH=/sdcard/monkey.jar:/sdcard/framework.jar exec app_process /system/bin tv.panda.test.monkey.Monkey -p com.autonavi.minimap --uiautomatormix --running-minutes 5 -v -v 2>CLASSPAT=/sdcard/error.txt 1>CLASSPATH=/sdcard/info.txt 没报错,但也没 log 输出

用的是插桩包,为啥还是不能用

可能运行的APP不是插桩包或者APP运行在Android<4.4上却没有SD读写权限Error: ENOENT, no such file or directory '/sdcard/io.appetizer/com.example.geeguarddemo.log'

(使用帮助)关于如何使用Activity白名单

使用acitivity白名单可做更细粒度场景控制。如仅想monkey部分页面场景

白名单:
参数 --act-whitelist-file  /sdcard/awl.strings

awl.strings 格式如:
tv.panda.xxx.anchor.LiveRecorderActivity
tv.panda.xxx.list.view.activity.HistoryActivity

黑名单:
--act-blacklist-file xxx

实现原理:
hook startActivityLocked() api,非白则拒绝start

(使用帮助)小米设备需开启模拟点击

当运行monkey命令 几秒后monkey退出运行。
log如下:

......
:Switch: #Intent;action=android.intent.action.MAIN;category=android.intent.category.LAUNCHER;launchFlags=0x10200000;component=com.shiyin/.Splash_MainActivity;end
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.shiyin/.Splash_MainActivity } in package com.shiyin
// Allowing start of Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.shiyin/.Splash_MainActivity } in package com.shiyin
Sleeping for 300 milliseconds
:Sending Touch (ACTION_DOWN): 0:(292.0,224.0)
:Sending rotation degree=0, persist=false

请尝试 开启 “开发者选项” -> "USB调试(安全设置) 允许通过usb调试修改权限或模拟点击"

(使用帮助)关于monkey卡停

当monkey运行过程中出现卡停时(卡停表现为无后续注入事件),需分情况考虑:

1 卡停时如果monkey命令没退出说明 系统资源打满了,app或系统即将可能会崩溃。 所以Monkey卡住也是正常的。这种情况多等会儿会有结果.

2 如果卡停时 monkey命令退出了 才是monkey自身有问题。这种情况请qq上联系我

小米NOTE 不能运行

MI NOTE LTE
4.4.4

看不出log

sanbo [~]$ adb shell CLASSPATH=/sdcard/monkey.jar:/sdcard/framework.jar exec app_process /system/bin tv.panda.test.monkey.Monkey -p com.mixpanel.example.hello --uiautomatormix --running-minutes 60
sanbo [~]$

Mate30执行时报异常,麻烦看一下

[Maxim] *** ERROR // WATCHDOG: Blocked in monitor com.android.server.input.InputManagerServiceBridge on foreground thread (android.fg)
java.lang.reflect.InvocationTargetException
at java.lang.reflect.Method.invoke(Native Method)
at tv.panda.test.monkey.ape.utils.APIAdapter.j0(APIAdapter.java:121)
at tv.panda.test.monkey.ape.utils.APIAdapter.getTasks(APIAdapter.java:175)
at tv.panda.test.monkey.MonkeySourceRandomUiAutomatorMix.getTopActivityComponentName(MonkeySourceRandomUiAutomatorMix.kt:1254)
at tv.panda.test.monkey.MonkeySourceRandomUiAutomatorMix.checkActivity(MonkeySourceRandomUiAutomatorMix.kt:1326)
at tv.panda.test.monkey.MonkeySourceRandomUiAutomatorMix.getNextEvent(MonkeySourceRandomUiAutomatorMix.kt:90)
at tv.panda.test.monkey.Monkey.runMonkeyCycles(Monkey.kt:1173)
at tv.panda.test.monkey.Monkey.run(Monkey.kt:623)
at tv.panda.test.monkey.Monkey$Companion.main(Monkey.kt:1440)
at tv.panda.test.monkey.Monkey.main(Unknown Source:2)
at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:359)
Caused by: android.os.DeadObjectException
at android.os.BinderProxy.transactNative(Native Method)
at android.os.BinderProxy.transact(BinderProxy.java:532)
at android.app.IActivityManager$Stub$Proxy.getTasks(IActivityManager.java:4989)
... 12 more
android.os.DeadObjectException
at android.os.BinderProxy.transactNative(Native Method)
at android.os.BinderProxy.transact(BinderProxy.java:532)
at com.android.internal.view.IInputMethodManager$Stub$Proxy.getInputMethodWindowVisibleHeight(IInputMethodManager.java:827)
at tv.panda.test.monkey.MonkeySourceRandomUiAutomatorMix.checkVirtualKeyboard(MonkeySourceRandomUiAutomatorMix.kt:1430)
at tv.panda.test.monkey.MonkeySourceRandomUiAutomatorMix.generateEvents(MonkeySourceRandomUiAutomatorMix.kt:843)
at tv.panda.test.monkey.MonkeySourceRandomUiAutomatorMix.getNextEvent(MonkeySourceRandomUiAutomatorMix.kt:92)
at tv.panda.test.monkey.Monkey.runMonkeyCycles(Monkey.kt:1173)
at tv.panda.test.monkey.Monkey.run(Monkey.kt:623)
at tv.panda.test.monkey.Monkey$Companion.main(Monkey.kt:1440)
at tv.panda.test.monkey.Monkey.main(Unknown Source:2)
at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:359)
[Maxim] *** ERROR // Fail to getInputMethodWindowVisibleHeight
java.lang.RuntimeException: android.os.DeadSystemException
at android.hardware.display.DisplayManagerGlobal.getDisplayInfo(DisplayManagerGlobal.java:163)
at android.hardware.display.DisplayManagerGlobal.getCompatibleDisplay(DisplayManagerGlobal.java:220)
at android.hardware.display.DisplayManagerGlobal.getRealDisplay(DisplayManagerGlobal.java:253)
at tv.panda.test.monkey.MonkeySourceRandomUiAutomatorMix.generatePointerEvent(MonkeySourceRandomUiAutomatorMix.kt:451)
at tv.panda.test.monkey.MonkeySourceRandomUiAutomatorMix.generateEvents(MonkeySourceRandomUiAutomatorMix.kt:860)
at tv.panda.test.monkey.MonkeySourceRandomUiAutomatorMix.getNextEvent(MonkeySourceRandomUiAutomatorMix.kt:92)
at tv.panda.test.monkey.Monkey.runMonkeyCycles(Monkey.kt:1173)
at tv.panda.test.monkey.Monkey.run(Monkey.kt:623)
at tv.panda.test.monkey.Monkey$Companion.main(Monkey.kt:1440)
at tv.panda.test.monkey.Monkey.main(Unknown Source:2)
at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:359)
Caused by: android.os.DeadSystemException
... 12 more
java.util.NoSuchElementException
at java.util.LinkedList.getFirst(LinkedList.java:254)
at tv.panda.test.monkey.MonkeySourceRandomUiAutomatorMix.getNextEvent(MonkeySourceRandomUiAutomatorMix.kt:95)
at tv.panda.test.monkey.Monkey.runMonkeyCycles(Monkey.kt:1173)
at tv.panda.test.monkey.Monkey.run(Monkey.kt:623)
at tv.panda.test.monkey.Monkey$Companion.main(Monkey.kt:1440)
at tv.panda.test.monkey.Monkey.main(Unknown Source:2)
at com.android.internal.os.RuntimeInit.nativeFinishInit(Native Method)
at com.android.internal.os.RuntimeInit.main(RuntimeInit.java:359)

troy模式下执行过程中出现无法获取控件ERROR // : null root node returned by UiTestAutomationBridge(3 times), use default events generator.

影响:出现该问题后,将不遵循黑白名单设计规则,随机乱点

测试记录:

  1. 事件数1222个,从event 664开始出现这个错误,后续所有的时间都有这个问题
  2. 事件数1222个,从event 874开始出现这个错误,后续所有的时间都有这个问题
  3. 事件数1222个,从event 225开始出现这个错误,后续所有的时间都有这个问题
  4. 事件数1222个,从event 1015开始出现这个错误,后续所有的时间都有这个问题
  5. 事件数1222个,从event 154开始出现这个错误,后续所有的时间都有这个问题

测试手机:
三星s10 安卓9

完整日志:run.log

错误日志:
[2020-11-05 17:39:47,604]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] *** ERROR // : null root node returned by UiTestAutomationBridge(1 times), use default events generator.
[2020-11-05 17:39:47,604]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] // debug, in pointer event: mBlackWidgets is {}
[2020-11-05 17:39:47,604]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] start fix 2020-11-05 17:37:20.816
[2020-11-05 17:39:47,604]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] // PointF(947.0, 1723.0)
[2020-11-05 17:39:47,604]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] over fix event 2020-11-05 17:37:20.818
[2020-11-05 17:39:47,604]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] RANDOM NUMBER other= 0.035478413
[2020-11-05 17:39:47,604]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] random hit touch
[2020-11-05 17:39:47,604]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] // debug, in pointer event: mBlackWidgets is {}
[2020-11-05 17:39:47,604]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] start fix 2020-11-05 17:37:20.831
[2020-11-05 17:39:47,604]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] // PointF(71.0, 627.0)
[2020-11-05 17:39:47,605]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] over fix event 2020-11-05 17:37:20.832
[2020-11-05 17:39:47,605]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] // event664, 2020-11-05 17:37:20.835
[2020-11-05 17:39:47,605]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] :Sending Touch (ACTION_DOWN): 0:(947.0,1723.0)
[2020-11-05 17:39:47,605]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] // event665, 2020-11-05 17:37:20.909
[2020-11-05 17:39:47,605]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] :Sending Touch (ACTION_MOVE): 0:(947.86975,1715.9478)
[2020-11-05 17:39:47,605]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] // event666, 2020-11-05 17:37:20.975
[2020-11-05 17:39:47,605]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] :Sending Touch (ACTION_MOVE): 0:(951.8904,1713.0941)
[2020-11-05 17:39:47,605]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] // event667, 2020-11-05 17:37:21.043
[2020-11-05 17:39:47,606]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] :Sending Touch (ACTION_MOVE): 0:(952.4642,1710.8387)
[2020-11-05 17:39:47,606]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] // event668, 2020-11-05 17:37:21.112
[2020-11-05 17:39:47,606]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] :Sending Touch (ACTION_MOVE): 0:(953.97925,1707.7256)
[2020-11-05 17:39:47,606]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] // event669, 2020-11-05 17:37:21.201
[2020-11-05 17:39:47,606]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] :Sending Touch (ACTION_MOVE): 0:(958.44904,1702.0471)
[2020-11-05 17:39:47,609]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] // event670, 2020-11-05 17:37:21.263
[2020-11-05 17:39:47,609]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] :Sending Touch (ACTION_MOVE): 0:(958.73315,1695.6404)
[2020-11-05 17:39:47,610]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] // event671, 2020-11-05 17:37:21.333
[2020-11-05 17:39:47,610]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] :Sending Touch (ACTION_MOVE): 0:(960.30225,1691.1112)
[2020-11-05 17:39:47,610]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] // event672, 2020-11-05 17:37:21.405
[2020-11-05 17:39:47,613]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] :Sending Touch (ACTION_MOVE): 0:(961.75134,1680.4895)
[2020-11-05 17:39:47,614]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] // event673, 2020-11-05 17:37:21.492
[2020-11-05 17:39:47,614]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] :Sending Touch (ACTION_MOVE): 0:(964.0585,1673.2206)
[2020-11-05 17:39:47,614]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] // event674, 2020-11-05 17:37:21.549
[2020-11-05 17:39:47,614]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] :Sending Touch (ACTION_UP): 0:(965.5239,1661.756)
[2020-11-05 17:39:47,614]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] // event675, 2020-11-05 17:37:21.625
[2020-11-05 17:39:47,614]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] // Sleeping for 200 milliseconds
[2020-11-05 17:39:47,614]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] // event675, 2020-11-05 17:37:21.912
[2020-11-05 17:39:47,615]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] // Sleeping for 1000 milliseconds
[2020-11-05 17:39:47,615]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] // event675, 2020-11-05 17:37:22.977
[2020-11-05 17:39:47,615]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] // Sleeping for 200 milliseconds
[2020-11-05 17:39:47,615]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] // event675, 2020-11-05 17:37:23.244
[2020-11-05 17:39:47,616]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] :Sending Touch (ACTION_DOWN): 0:(71.0,627.0)
[2020-11-05 17:39:47,616]-[INFO]-[case.py]-[adb_shell:314]: [Maxim] // event676, 2020-11-05 17:37:23.314

拓展对原生monkey事件比例设置的能力

1、原生Monkey支持
image
from:https://blog.csdn.net/lemon_linaa/article/details/97777852
2、Maxim支持
image

期望Maxim支持:
1、pctrotation(优先级较高)
2、pctsyskeys
调整“系统”按键事件的百分比(这些按键通常被保留,由系统使用,如Home、Back、Start Call、End Call及音量控制键)
调整横竖屏切换事件的比例
3、pctmotion
调整滑动事件的百分比(动作事件由屏幕上某处的一个down事件、一系列的伪随机事件和一 个up事件组成)

 
感谢大佬

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.