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
,我假设我需要的事件代码是 0035
、0036
和 0039
。
所以我尝试了一下,想出了一个方法:
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 int
s一次并写入直到所有参数都被解析,关闭文件。你可以看到你录制的内容很有魅力。
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
我想通过 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
,我假设我需要的事件代码是 0035
、0036
和 0039
。
所以我尝试了一下,想出了一个方法:
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 int
s一次并写入直到所有参数都被解析,关闭文件。你可以看到你录制的内容很有魅力。
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