ADB:拖动与滑动/通过事件手动拖动

ADB: drag vs. swipe / manual drag via events

我想通过 ADB 以编程方式控制 Android 设备。

因为我必须滚动列表,所以我尝试通过如下命令滚动:

adb shell input touchscreen swipe 935 500 789 500 1000

这可行,但问题是 Android 添加了 fling/rubber 带效应。因此,当滑动完成时,它仍然会滚动得更远。但是我需要 scoll pixel-perfect 所以这种方法不能按照我需要的方式工作。即使我将滑动持续时间增加到 3000 毫秒,它也会滚动更多像素。

是否有一个简单的技巧可以告诉 ADB/my 设备 'swipe but hold down the finger after moving for ~500ms before releasing the finger in order to prevent the fling effect'?

我也尝试过手动控制事件。 因此我 运行 adb getevent,在设备上执行了滑动并收集了输出:

[...]
/dev/input/event6: 0000 0000 00000000
/dev/input/event6: 0003 0035 000000fb
/dev/input/event6: 0003 0030 0000000a
/dev/input/event6: 0000 0000 00000000
/dev/input/event6: 0003 0035 000000fa
/dev/input/event6: 0003 0030 0000000b
/dev/input/event6: 0000 0000 00000000
/dev/input/event6: 0003 0036 000001b6
/dev/input/event6: 0003 0030 0000000c
/dev/input/event6: 0000 0000 00000000
/dev/input/event6: 0003 0035 000000f9
/dev/input/event6: 0003 0030 0000000d
/dev/input/event6: 0000 0000 00000000
/dev/input/event6: 0003 0035 000000f8
/dev/input/event6: 0003 0030 0000000e
/dev/input/event6: 0000 0000 00000000
/dev/input/event6: 0003 0035 000000f7
/dev/input/event6: 0003 0030 0000000f
/dev/input/event6: 0000 0000 00000000
/dev/input/event6: 0003 0030 00000000
/dev/input/event6: 0003 0039 ffffffff
/dev/input/event6: 0000 0000 00000000
/dev/input/event6: 0003 002f 0000000c
/dev/input/event6: 0003 0039 0000000c
/dev/input/event6: 0003 0035 000000f7
/dev/input/event6: 0003 0036 000001b6
/dev/input/event6: 0000 0000 00000000

我想这应该告诉我我的事件是 /dev/input/event6,我假设我需要的事件代码是 003500360039

所以我尝试了一下,想出了一个方法:

adb shell sendevent /dev/input/event6 3 53 935
adb shell sendevent /dev/input/event6  0 0 0
adb shell sendevent /dev/input/event6 3 54 500
adb shell sendevent /dev/input/event6  0 0 0
adb shell sendevent /dev/input/event6 3 57 1
adb shell sendevent /dev/input/event6  0 0 0
adb shell sendevent /dev/input/event6 3 53 789
adb shell sendevent /dev/input/event6  0 0 0
adb shell sendevent /dev/input/event6 3 54 500
adb shell sendevent /dev/input/event6  0 0 0
adb shell sendevent /dev/input/event6 3 57 0
adb shell sendevent /dev/input/event6  0 0 0

这也是类似的做法here。但它根本不起作用,设备上没有任何变化。由于我不知道下一步该怎么做,或者我的做法是否正确,所以我想请教您是否可以告诉我我的错误所在。

谢谢!

问题是 sendevent 命令之间的延迟。如果查看sendevent源代码,每次都是打开文件写入然后关闭。加上两个 adb shell 命令之间的延迟。这使得连续 sendevent 如此缓慢,并且您记录的内容不会被复制。

你需要做的是获取 sendevent source code,修改它以获取尽可能多的参数,并在你打开文件一次后,解析 3 ints一次并写入直到所有参数都被解析,关闭文件。你可以看到你录制的内容很有魅力。

default sendevent

sendevent /dev/input/event1 3 47 0
sendevent /dev/input/event1 3 57 13578
sendevent /dev/input/event1 1 330 1
sendevent /dev/input/event1 1 325 1

Modified sendevent

/data/local/tmp/mysendevent /dev/input/event1 3 47 0 3 57 13578 1 330 1 1 325 1

我以前做过同样的事情,你可以在这里参考完整的工作-https://github.com/rils/ARP/wiki

耶 - 我终于知道怎么做了!

我写了一个小脚本,将 adb shell getevent 转换为十进制值,并用 this article 中的已知名称替换代码。

这给了我这样的输出:

/dev/input/event6: 3 - TRACKING_ID [4294967295]
/dev/input/event6: 0 - SYN_REPORT [0]
/dev/input/event6: 3 - 47 [0]
/dev/input/event6: 3 - POSITION_X [415]
/dev/input/event6: 3 - POSITION_Y [428]
/dev/input/event6: 3 - TOUCH_MAJOR [5]
/dev/input/event6: 3 - TRACKING_ID [0]
/dev/input/event6: 0 - SYN_REPORT [0]

然后我能够弄清楚事件是如何工作的,并且可以复制行为。我只需要更改 X 和 Y 坐标。

adb shell sendevent /dev/input/event6 3 57 88
adb shell sendevent /dev/input/event6 3 53 935
adb shell sendevent /dev/input/event6 3 54 500
adb shell sendevent /dev/input/event6 3 48 5
adb shell sendevent /dev/input/event6 0 0 0
adb shell sendevent /dev/input/event6 3 53 906
adb shell sendevent /dev/input/event6 3 54 500
adb shell sendevent /dev/input/event6 3 48 16
adb shell sendevent /dev/input/event6 0 0 0
adb shell sendevent /dev/input/event6 3 53 877
adb shell sendevent /dev/input/event6 3 54 500
adb shell sendevent /dev/input/event6 3 48 16
adb shell sendevent /dev/input/event6 0 0 0
adb shell sendevent /dev/input/event6 3 53 847
adb shell sendevent /dev/input/event6 3 54 500
adb shell sendevent /dev/input/event6 3 48 16
adb shell sendevent /dev/input/event6 0 0 0
adb shell sendevent /dev/input/event6 3 53 818
adb shell sendevent /dev/input/event6 3 54 500
adb shell sendevent /dev/input/event6 3 48 16
adb shell sendevent /dev/input/event6 0 0 0
adb shell sendevent /dev/input/event6 3 53 789
adb shell sendevent /dev/input/event6 3 54 500
adb shell sendevent /dev/input/event6 3 48 16
adb shell sendevent /dev/input/event6 0 0 0
adb shell sendevent /dev/input/event6 3 57 -1
adb shell sendevent /dev/input/event6 0 0 0