AndroidViewClient的device.touch()比MonkeyRunner慢得多。可以修复吗?

时间:2015-05-27 19:48:46

标签: android androidviewclient

我已经放弃了MonkeyRunner for AndroidViewClient,以便从其增加的可靠性和简单的实现中受益(感谢上帝的纯Python)。

我需要尽快执行几个device.touch()事件,但是AndroidViewClient似乎比MonkeyRunner慢得多。

以下是我用来计算时间的代码:

for iteration in range(1,6):
    ts_start = datetime.datetime.now()
    device.touch(1,1,'DOWN_AND_UP')
    chrono = datetime.datetime.now() - ts_start
    print str(iteration)+': '+str(chrono)

这是MonkeyRunner的输出:

1: 0:00:00.003000
2: 0:00:00.002001
3: 0:00:00.002001
4: 0:00:00.002001
5: 0:00:00.002000

这是AVC的输出:

1: 0:00:00.460000
2: 0:00:00.515000
3: 0:00:00.499000
4: 0:00:00.508000
5: 0:00:00.456000

这平均慢了约200倍。

似乎可以将事件存储在二进制文件中,然后直接在手机上推送和运行它。但是,我想坚持使用纯粹的AVC方法。

这可能吗?

修改

由于现在不可能按照我想要的方式获得更好的性能,我必须像我提到的那样实现事件文件。

我使用了两种资源:

以下是其中一个文件的外观(截断):

#!/bin/sh
sendevent /dev/input/event1 3 57 0
sendevent /dev/input/event1 3 55 0
sendevent /dev/input/event1 3 53 640
sendevent /dev/input/event1 3 54 900
sendevent /dev/input/event1 3 58 1
sendevent /dev/input/event1 0 2 0
sendevent /dev/input/event1 0 0 0
sendevent /dev/input/event1 0 2 0
sendevent /dev/input/event1 0 0 0
sendevent /dev/input/event1 3 57 0
sendevent /dev/input/event1 3 55 0
sendevent /dev/input/event1 3 53 640
sendevent /dev/input/event1 3 54 730
sendevent /dev/input/event1 3 58 1
sendevent /dev/input/event1 0 2 0
sendevent /dev/input/event1 0 0 0
sendevent /dev/input/event1 0 2 0
sendevent /dev/input/event1 0 0 0
sendevent /dev/input/event1 3 57 0
sendevent /dev/input/event1 3 55 0
sendevent /dev/input/event1 3 53 500
sendevent /dev/input/event1 3 54 900
sendevent /dev/input/event1 3 58 1
sendevent /dev/input/event1 0 2 0
sendevent /dev/input/event1 0 0 0
sendevent /dev/input/event1 0 2 0
sendevent /dev/input/event1 0 0 0

性能方面,它的速度大约是MonkeyRunner实现速度的两倍。

2 个答案:

答案 0 :(得分:1)

你是绝对正确的,如果你看看AVC和MonkeyRunner的代码,我认为流程图如下所示,两者都使用套接字,但速度的差异是因为Monkeyrunner使用直接客户端套接字连接到猴子服务器在设备上发送命令,如点击,按一下猴子服务器在设备上启动。 AVC套接字与adb服务器通信以发送输入点击/按下,我不知道哪个"酱油"在adb输入中,我猜是Java会产生这么慢的响应时间。我认为AVC的所有者可以眨眼间实现Monkey服务器,但是有一个问题,Uiautomator和Monkey不能共存,所以我猜他应该在大多数用户的速度和稳定性之间进行权衡: / p>

AVC: client socket ---> ADB server ---> ADB daemon on device
MonkeyRunner: client socket ---> Monkey server on device

答案 1 :(得分:0)

您可以尝试的一个快速解决方法是

cmd = ''
for _ in range(6):
    cmd += 'input tap 1 1;'
ts_start = datetime.datetime.now()
device.shell(cmd)
chrono = datetime.datetime.now() - ts_start
print str(chrono)

它可能会对您有所帮助,但可能并不适合所有情况。