emulate touch event from adb
来源:互联网 发布:windows pro是啥 编辑:程序博客网 时间:2024/05/24 05:36
::
it is for android, of course!
if you'd prefer to emulate user behavior directly but not write test cases like MonkeyRunner, it is best to just repeat all user touch/click motions directly.
android just provide tools to send/recv event directly for input systems.
by typing below cmd you are able to get all input devices and its functions, and dump all the events received.
adb shell geteventadd device 1: /dev/input/event5name: "msm8974-taiko-mtp-snd-card Headset Jack"add device 2: /dev/input/event4name: "msm8974-taiko-mtp-snd-card Button Jack"add device 3: /dev/input/event3name: "hs_detect"add device 4: /dev/input/event1name: "touch_dev"add device 5: /dev/input/event0name: "qpnp_pon"add device 6: /dev/input/event2name: "gpio-keys"you can find that "/dev/input/event1" stands for the touch device.
if click on the screen once, it would dump like
/dev/input/event1: 0003 0035 000003cd/dev/input/event1: 0003 0036 00000377/dev/input/event1: 0003 0039 000000fa/dev/input/event1: 0001 014a 00000001/dev/input/event1: 0000 0000 00000000/dev/input/event1: 0003 0039 ffffffff/dev/input/event1: 0001 014a 00000000/dev/input/event1: 0000 0000 00000000add "-l" param would show the results more readable
/dev/input/event1: EV_ABS ABS_MT_TOUCH_MAJOR 00000018 /dev/input/event1: EV_ABS ABS_MT_WIDTH_MAJOR 00000018 /dev/input/event1: EV_ABS ABS_MT_PRESSURE 00000018 /dev/input/event1: EV_ABS ABS_MT_POSITION_X 00000207 /dev/input/event1: EV_ABS ABS_MT_POSITION_Y 0000057d /dev/input/event1: EV_ABS ABS_MT_TRACKING_ID 0000010a /dev/input/event1: EV_KEY BTN_TOUCH DOWN /dev/input/event1: EV_SYN SYN_REPORT 00000000 /dev/input/event1: EV_ABS ABS_MT_TRACKING_ID ffffffff /dev/input/event1: EV_KEY BTN_TOUCH UP /dev/input/event1: EV_SYN SYN_REPORT 00000000different HW and android version may contains more or less events, and the order of the may also differ, while position/touch/syn events would be all kept.
and to send, just type like below:
adb shell sendevent /dev/input/event1 0x0003 0x0035 0x000003cdthe three digital params meanings are the same as the one that you dumpped by "getevent".
one problem is that "getevent" dump the digitals as hex format while "sendevent" only accept decimal format. so apply the cmd above directly would not work at all.
to make it easy to input, you can patch the sendevent utils:
//system/core/toolbox/sendevent.c
diff --git a/toolbox/sendevent.c b/toolbox/sendevent.cindex 4d0ca17..6e4b0fa 100644--- a/toolbox/sendevent.c+++ b/toolbox/sendevent.c@@ -30,9 +30,14 @@ int sendevent_main(int argc, char *argv[]) return 1; } memset(&event, 0, sizeof(event));+ /* //[NET] make it has ability to parse hex string event.type = atoi(argv[2]); event.code = atoi(argv[3]); event.value = atoi(argv[4]);+ // */+ event.type = (int)strtol(argv[2], NULL, 0);+ event.code = (int)strtol(argv[3], NULL, 0);+ event.value = (int)strtol(argv[4], NULL, 0); ret = write(fd, &event, sizeof(event)); if(ret < (ssize_t) sizeof(event)) { fprintf(stderr, "write event failed, %s\n", strerror(errno));Notice: you have to have a copy of android source code to modify and build the modules. and have right to replace that into your device. btw, the target module is "toolbox" but not "sendevent".
you can also emulate some key input like BACK/HOME and others by input cmd too:
adb shell input keyevent 4above is for click back button, others are all the same.
to input text, just type:
adb shell "input text here"you can check "input" cmd for more details if interested, most input behavior is able to be emulated by this cmd.
::
by above all preparations, nearly all user behaviors is able to be emulated now.
just try one test case from the beginning and dump all the inputs, then translate these dumped events into cmd for send.
remember to sleep for a while and check status while there are UI change and there are different UI behavior depending on some other parts' executing result. and the result maybe out of control by simply rotating your device.
and, it sounds simple, but an perfect impl may be far more than this.
REF:
http://kenji-chao.logdown.com/posts/2013/11/12/android-use-adb-commands-to-perform-the-app-and-send-keyevent
http://azard.me/blog/2015/06/13/android-cross-app-touch-event-injection/
http://c.biancheng.net/cpp/html/129.html
- emulate touch event from adb
- 批处理中使用adb input event实现touch解锁
- android touch event summary
- Capture UITableView Touch Event
- Sencha touch titleBar event
- [Unity3D]Touch&Event
- adb shell input event
- adb key event
- Android adb获取event
- 捕获Activity中的Touch Event
- iPhone Multi-touch Event Handling
- Input touch event 输入流程
- Android Touch Event 超出范围
- Touch Event事件分发流程
- school emulate
- adb shell input 及event
- 批处理发送adb input event
- input string from adb
- oracle查看表、字段属性和说明sql
- C/C++网络通讯编程(一)
- 记录andorid打印输出看不见的问题的探索
- 解决listview和 gridview 单行显示的方法
- *Leetcode 368. Largest Divisible Subset
- emulate touch event from adb
- C++中的协程
- 使用SWIG Python动态绑定C++对象
- 很多人找不到 idea persistence窗口 分享给大家
- Reverse Integer Leetcode 每日一题 ↖(^ω^)↗
- Error和Exception的区别
- 自编码算法与稀疏性(KL散度诱导稀疏)
- login 阻止冒泡事件
- Java NIO 详解(一)