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 00000000
add "-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           00000000  
different 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 0x000003cd
the 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 4
above 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


0 0
原创粉丝点击