作为 Android 开发,我们平时接触最多的工具之一非 ADB 莫属。不过平日里开发的时候,我们都是通过 AS 间接试用 ADB. 实际上,除了作为调试的中间桥梁,ADB 还有许多强大的功能。这篇文章,我通过 ADB 在实况手游中自动比赛的应用展示下 ADB 在开发之外的应用。
这个实现比较交单。因为实况手游中存在一种比赛模式叫天梯赛,其实就是作为教练的形式参与比赛。玩家需要做的是在每次比赛结束之后点击下一步就可以了。实况手游中下一步的按钮处于一个固定的位置。这就给我们通过自动化技术自动点击和继续游戏提供了方便。
实现的效果如下,
ADB 中提供了 input
指令,input 命令的完整 help 信息如下:
Usage: input [<source>] <command> [<arg>...]
The sources are:
mouse
keyboard
joystick
touchnavigation
touchpad
trackball
stylus
dpad
gesture
touchscreen
gamepad
The commands and default sources are:
text <string> (Default: touchscreen)
keyevent [--longpress] <key code number or name> ... (Default: keyboard)
tap <x> <y> (Default: touchscreen)
swipe <x1> <y1> <x2> <y2> [duration(ms)] (Default: touchscreen)
press (Default: trackball)
roll <dx> <dy> (Default: trackball)
这里的 tap 即可以实现屏幕的自动点击。比如,点击屏幕上面的 (400, 300) 只需要使用如下指令即可,
adb shell input tap 400 300
那么,具体某个点在屏幕上面处于什么位置呢?这里有一个办法来准确获取某个点的位置:进入开发者选项,在“输入”中打开“指针位置”,然后触摸屏幕某个位置的时候就可以展示触摸的位置了。
不过 tap 并不好用,因为诸如游戏等对触摸事件做了自己的处理,可能需要按下一定的时间才能被判断为点击。那么此时怎么做呢?
我们可以通过 swipe 来实现这个操作。swipe 也就是滑动的意思。这个操作允许传入一个滑动的时间,如果在一个位置上面滑动了 2 秒,那么就可能会被游戏判定为按下了 2 秒。所以,最终只需要使用下面的脚本就可以实现自动上分了,
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import os, time
if __name__ == "__main__":
while True:
time.sleep(1)
print(str(int(time.time())), end='\r')
os.system("adb -s 61e22ff2 shell input swipe 2000 1000 2000 1000 100")
以上只是 ADB 的一个简单的使用。了解了 ADB 的这个功能之后我们就可以使用 ADB 来实现更多有趣的功能,即各种自动化操作等等。
上面自动化操作也只是 ADB 众多功能中的一个。此外,ADB 还支持通过 adb shell dumpsys activity top
获取当前显示的 Activity 的信息,包括布局控件的各种信息等。我在自己的开源库中简化封装了一些 ADB 操作,完成了一部分,后面有时间可以考虑加一些 GUI. 这个库的地址是:
https://github.com/Shouheng88/AndroidTools
此外,我在逛 Github 时也遇到过对 ADB 总结的开源库,还算比较全面。这个库的地址如下,感兴趣的可以自己看下: