Android sendevent is really slow - how to speed it up?

adb, android, automation, user-interface

Solution

The handler for touch is implemented differently across devices. You should `cat /proc/bus/input/devices` to see where the touch handler is implemented.

You can also do `adb shell getevent`, interact with the device and see the output for the interface name.

The reason why your replay takes a long time is because the sendevent binary opens the interface file, writes data to it and closes it for every call to sendevent. So in theory, if you have a bunch of sendevent commands, the binary is opening the interface file, writing data and closing it for every command.

The way I've solved this issue is by re-writing the sendevent.c file under /system/core/toolbox to open the file only once during replay, writing all the data and closing it at the end of the replay. It works perfectly for me!

Problem

I am doing some ui automation, and I am able to store screen touches using getevent, but when I try to send this using sendevent, it takes a really long time, making it hard to actually replay the inputs. I have already trying loading the script onto the device and running the script locally on the device (a script with a bunch of sendevent commands). But this only imporved this slightly. Is there some other way to inject these commands in a quicker way?

Original source