Notice: this requires that you have root access in your phone
A while I go I started playing one of those non-stoppable clicker games on my android phone, in which all you have to do is tap on the screen to acquire resources and make your tapping even more profitable. Seeing how boring it is to keep tapping your screen the whole time, I wondered if there was some way do to that automatically without requiring me to install a 3rd party app into my phone, and the first thing that came to my mind was ADB. Here I’ll show you how I did it.
Connecting to your phone
One thing that I did was to enable ADB over the network, so as to free myself from having to have an USB cable plugged the whole time. Connecting to my phone wirelessly was easy as running
adb connect PHONE_IP_ADDRESS:5555 in the terminal (remember to replace PHONE_IP_ADDRESS with your phone’s actual IP address or hostname).
adb shell and you’ll be greeted with… yes, you’ve guessed it! Your phone’s shell! Now acquire root privileges with
su and you’re good to go.
Actually sending touch events
After making the best use of my Google-fu, I came to this neat Stack Overflow question. Now all I had to do was to find the coordinates on the screen where I wanted the touch event to happen; this can be done by running
getevent -l, which will output something like:
add device 1: /dev/input/event6 name: "uinput-fpc" add device 2: /dev/input/event5 name: "msm8920-sku7-snd-card Button Jack" add device 3: /dev/input/event4 name: "msm8920-sku7-snd-card Headset Jack" add device 4: /dev/input/event2 name: "gf3208" add device 5: /dev/input/event0 name: "qpnp_pon" could not get driver version for /dev/input/mice, Not a typewriter add device 6: /dev/input/event3 name: "gpio-keys" add device 7: /dev/input/event1 name: "ft5x06_720p"
Then I proceeded to tap on my phone’s screen where I wanted the simulated taps to occur, and that’s what I got:
/dev/input/event1: EV_ABS ABS_MT_TRACKING_ID 00006943 /dev/input/event1: EV_ABS ABS_MT_POSITION_X 00000166 /dev/input/event1: EV_ABS ABS_MT_POSITION_Y 0000031f /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
Don’t forget to press Ctrl+C to stop it from listening to your touches.
Take notice of the values taken from
ABS_MT_POSITION_Y, those are the coordinates for your X and Y axis in hexadecimal. 0x168 and 0x320 in my case, which translate to 360 and 800 in decimal.
Now that you have the coordinates, you can simply run
input tap X Y, replacing X and Y with the decimal values that you got in the last step.
You should’ve noticed that it only simulates a single touch on your screen, to get around it I’ve made the following simple one liner:
while : ; do input tap 360 800; done
Don’t forget to replace the coordinates with your own ones!
And hey, it works! But it’s too frecking slow.
Speeding it up
You should be wondering why it’s slow, and this happens because
input tap is a java application, and that delay is actually the time required to spawn then run it (at least according to the answer that I took from here).
So, how do we get around it?
After a little bit more of googling around, I’ve come around this. Writing straight to the touch interface, why didn’t I think of it before?
And then I blindly copy pasted the solution presented in that link and, to my surprise, it simply didn’t work at all.
After scratching my head for a while, I noticed something: remember the output that you got to determine tap coordinates? Take a closer look at it, right in the beginning we have something along the lines of
/dev/input/event1, and that was my actual touch input device location.
Since the current working directory that we’re running at is probably the root of you device, which is read-only, we need to navigate to a read-write folder before continuing.
After getting into a read-write folder, you should be able to run the following (replacing
eventX with your actual input device`:
dd if=/dev/input/eventX of=record1
Proceed to tap or swipe whatever you want there, it’ll record everything and save it to a file. Press Ctrl+C after you’re finished.
To test you recording, run:
dd if=./record1 of=/dev/input/eventX
If everything worked smoothly, you should be able to run it in an endless loop with:
while : ; do dd if=./record1 of=/dev/input/eventX ; done
And that’s it! Now you should be able to cheat in those clicker games or even automatize some tests and events on your phone.