我想使用 appnium 或者 airtest 做个小的辅助工具,就是写一段脚本,然后它自动帮你在手机上点点点,但是这两个东西都依赖 adb,他们都是调用 adb 去操作手机的.
现在问题是我想让我的脚本直接在手机上运行(我会安装一个 termux),也就是说在手机的 linux 环境下需要与手机的安卓环境建立一个 adb 连接才行.
所以我的问题就是,有没有什么方法可以建立这个连接,我不希望使用 wifi 或者 usb 中的任意一种连接方式,最终我想把我写好的脚本,直接安装到手机上运行.
有什么方法可以实现吗,或者有没有什么 workround 都可以.
无障碍服务我试过了不行,因为获取不到页面上的信息,目标应用好像是 flutter 写的,只能拿到一个 layout.什么有用的信息都拿不到,所以感觉无障碍服务可以 pass 了.
1
yfugibr 2023-07-13 13:47:43 +08:00 via Android
shiziku https://shizuku.rikka.app/
|
2
Asakijz 2023-07-13 13:48:44 +08:00
auto.js 可能符合你的要求?
|
4
Supplied 2023-07-13 13:49:52 +08:00 via Android
shizuku
|
5
hicdn 2023-07-13 14:35:27 +08:00 via Android
termux 里安装 adb ,手机开 wifi adb ,termux 里 adb connect
|
6
qiaofanxing 2023-07-13 15:24:53 +08:00 via Android
shizuku 很好用
|
7
yangyuhan12138 OP @hicdn 我先前试了这个方案,显示的连接成功,但是我 adb devices 没有东西我不知道为啥,可能是我用的 adb 不对?我先前用的是 pkg install adb,然后我现在看到 termux 好像专门有个 adb 那个好像权限不太一样?我准备待会儿试试
|
8
huangminzone 2023-07-13 15:29:36 +08:00
开 5555 端口或者 root 就可以实现单机
|
9
Masoud2023 2023-07-13 15:47:24 +08:00
只为了解决 adb:
1. 能 root 的话改 build.prop 就行 2. 不能 root 的 11 以上能开 adb over wifi 3. 11 以下的话 shizuku |
10
jiager 2023-07-13 16:07:00 +08:00
看下这个帖子,因为我用的是 python ,其实这个方法无论什么语言都可行,因为最终实现方式是调用 adb
https://www.v2ex.com/t/956266 |
11
yangyuhan12138 OP @yfugibr
@Supplied @qiaofanxing @Masoud2023 shizuku 好像是要我先有 adb 吧,而且我没看到他可以干啥,看起来像是给普通的应用程序提供了一些 api 可以调用 adb?但是我是想在 termux 运行 appium,我需要达到的目的可能是 termux 中 使用 adb devices 能看到我当前这个手机;先前我试了在 termux 中用 wifi 连接 adbd,连接是连接成功了 但是我输入 adb devices 没有东西出来;这个问题应该可以解决,我还在尝试中...但是他好像依赖了"WIFI",要是我没有局域网怎么办,我想的是 termux 用 adb 连接当前的安卓手机 使用 localhost...他们本来就在一个设备上..但是无线调试如果我没有 WiFi 的话他甚至不让我打开这个选项.... |
12
forQ 2023-07-13 16:16:00 +08:00
开启手机无线调试,配对成功后,再 connect
|
13
yangyuhan12138 OP @jiager 这个确实是实现了 termux 里边使用 adb,但是最终还是依赖了 WiFi 呀有没有可能连 wifi 都不要,或者说 这个方案 如果 WiFi 断开连接之后 termux 还能操作手机吗?
|
14
qiaofanxing 2023-07-13 16:26:17 +08:00
@yangyuhan12138 #11 “安装”是什么意思呀,你手机上都没有 adb 权限的话,当用户应用装上去权限也不够的。
|
15
cairnechen 2023-07-13 16:28:25 +08:00
回想起了以前玩家国梦的时候用 UIAutomator2 刷金币的时光
|
16
azhangbing 2023-07-13 16:34:42 +08:00
手机开启无线调试后 可以调用 adb 就是 1 楼说的 shizuku 的方式
|
17
yangyuhan12138 OP @qiaofanxing 就是 appium 那种脚本 直接放到 termux 上去运行,相当于 appium 的服务端,adb 的服务端客户端,还有 appium 的脚本都放在 termux 上运行.
|
18
yangyuhan12138 OP @forQ 确实 我之前 adb pair 完了 没有 connect,所以没有 devices
|
19
LykorisR 2023-07-13 16:58:59 +08:00
可以利用无线调试,让程序内置一个魔改的 adb 就行,然后引导用户开启无线 adb ,还有 adb 无线的话是需要配对的
无线连接上之后就可以有权限了,但是无论如何都一定需要一次 adb ,不管你是电脑还是什么,shizuku 也是需要一次开启权限的 |
20
yangyuhan12138 OP @LykorisR 第一次怎么样设置都可以,我想要的时候边不用 WIFI 也能用 adb
|
21
yangyuhan12138 OP @jiager 你这个也可以优化一线 不需要 shiziku 了
直接 termux 里执行: pkg install android-tools adb pair ip:port 分屏输入 code adb connect ip:port (这里是固定 port) |
22
LykorisR 2023-07-13 17:15:43 +08:00
@yangyuhan12138 那就需要大量魔改 adb 然后让其在设备上能够被以 USB 形式检测出来
|
23
hicdn 2023-07-13 18:13:02 +08:00 via Android
root 后有各种方式开启 adb over ip ,
adb connect 127.0.0.1 |
24
jiangwei2222 2023-07-13 18:55:48 +08:00 via Android
https://github.com/Jinnrry/RobotHelper/tree/master
你看下我写的这个项目,你想用 adb 命令执行的话你翻一下我早期的代码历史。早期我就是用 adb 命令点击的。但是性能太差,后面我废弃掉了。现在提供 root ,xposed ,无障碍三种方式提权完成点击 |
25
jiangwei2222 2023-07-13 19:13:36 +08:00
你当前如果有很多脚本不方便迁移,或者你不会 Android 开发,那你基于 linux 开发就行了。linux 输入文件位于/dev/input/event*,你找到你手机触摸屏对应的那个设备文件,直接往里面写入点击命令就行了。比如你要点击 1,1 这个位置,就写入
``` EV_ABS, ABS_MT_TRACKING_ID, 0x000021e7 EV_KEY, BTN_TOUCH, DOWN EV_ABS, ABS_MT_WIDTH_MAJOR, 0x00000009 EV_ABS, ABS_MT_POSITION_X, 1 EV_ABS, ABS_MT_POSITION_Y, 1 EV_SYN, SYN_REPORT, 0x00000000 ``` 具体实现你参考我 https://github.com/Jinnrry/RobotHelper/blob/master/Android/app/src/main/java/cn/xjiangwei/RobotHelper/Tools/InputImp/RootInput.java 这个文件 或者 android 源码中的 sendevent 代码 https://android.googlesource.com/platform/system/core/+/android-5.0.2_r3/toolbox/sendevent.c 如果你没有很多脚本需要迁移,或者会 android 开发,基于我这个框架写就完事了。我还封装了很多图像处理的工具,比如找点、找图啥的。而且纯 android 开发,导入 tensorflow 啥的也方便,遇到各种反作弊,或者某些策略,上机器学习就完事了 |
26
jiangwei2222 2023-07-13 19:19:18 +08:00
对了,我也提供了 http api ,你装一个我这个程序,然后就能在手机上开启 http api ,用 http api 也能实现那需要的点击那些操作
https://github.com/Jinnrry/RobotHelper/wiki/%E5%9F%BA%E4%BA%8EWEB%E6%8E%A5%E5%8F%A3%E7%9A%84%E5%BC%80%E5%8F%91%E6%8C%87%E5%8D%97 http api 我当初设计出来是为了大批量群控的,但是后面实际没用上。后续没怎么维护,可能有问题,遇到问题的话你提 issuse |
27
zpp0196 2023-07-13 21:01:44 +08:00 via Android 1
Android 11 及以上用上面说的方式连接 wifi adb ,用 termux 执行 adb tcpip 5555 ,执行成功后就可以断开 wifi 了,再执行 adb connect localhost 就可以连接本机了,不重启手机就可以一直用 adb connect localhost 连接本机,重启了需要再执行一次 adb tcpip 5555 ,公共 wifi 或手机热点都行,只需要开机连一次 wifi 。
|
28
yangyuhan12138 OP @zpp0196 牛啊牛啊,这基本能解决我目前的问题,只要不关机就不用重连,目前你这个方案最好!我没想到 pair 完了 连接好了还能 tcpip,还能混着用?牛逼...
|
29
yangyuhan12138 OP @zpp0196 我以为 Android11 只能用 pair 这种方式来连了呢
|
30
yangyuhan12138 OP @jiangwei2222 你是真的大佬...但是我也是真不懂安卓,我是做后端的,只是最近遇到一个需求想搞一搞,学习成本太高的话就没啥必要了,linux 那个方案对我来说可能是更好的,但是他需要 root,而且可以想象坑应该不少;所以我选 adb
@zpp0196 老哥解决了本地 adb 的问题,而且不需要开 wifi,目前来看这个方案还挺不错了,明天吧 airtest 放上去跑跑看,如果能用的话就太 nice 了. linux 那个方案如果要点击屏幕上特定的元素 只能截图+图像识别+点击坐标是吧 by the way.. |
31
jiangwei2222 2023-07-14 10:29:11 +08:00
@yangyuhan12138 #30 我也是后端开发。你用 adb 操作应该也是`adb shell sendevent xxx` 这样操作的吧。你可以看我贴的 sendevent 源码,对一些游戏操作的时候,需要高频点击,sendevent 操作会有延迟,导致问题。我是重写了 sendevent 工具解决的。
另外,你如果用 sendevent ,你直在程序里面调用就行了,不需要 adb |
32
yangyuhan12138 OP @jiangwei2222 大佬 再请教一个问题,airtest 本来是可以实现我的需求的,但是他的图片识别太慢了,我在网上去找了飞浆,她有个 android 的 demo,所以我又回到了写无障碍服务这条路上来,但是我的目标 app 他好像不识别无障碍服务的模拟点击,我用的是 dispatchGesture 方法,点他没反应,点其他的应用就可以,这个有啥解决方法没,最好不要 root...root 他也会检测
|
33
jiangwei2222 2023-07-24 16:27:13 +08:00
@yangyuhan12138 #32 1 、图像识别慢,我很久以前看过 airtest 的代码,我记得他是用的 adb 截图和传数据,慢主要卡在截图和传输上面。
2 、无障碍被检测很正常啊,安卓允许程序针对无障碍操作做出不同的响应,国内大部分 app 和游戏都会区分处理,用来反爬 |
34
jiangwei2222 2023-07-24 16:38:24 +08:00
@yangyuhan12138 #32 另外,你这真是完完全全把我当年的路全部重走了一遍啊,我当年为了搞这个,把 android 输入部分的源码全看了一遍,把 airtest 、autojs 等框架源码也看了一遍。还反编译了按键精灵,研究了按键精灵的实现。你都写安卓代码了,直接把我那个框架拿来用呗,坑我都帮你踩完了。你再继续研究下去,跟我那框架写的没啥区别了
我目测,模拟点击、图像识别只是你第一个坑,你好不容易点击和识别处理完了,你还会遇到文本输入,防爬验证码,文本输入我是自己实现了一个输入法模拟输入,防爬我是引入了 tf ,自己训练 ai 模型处理的。 如果你是操作游戏的话,游戏厂商还会使用 ai 判断你的操作轨迹是否符合人类习惯,到这一步的话,你又需要录制你的手动操作进行回放。 |
35
yangyuhan12138 OP @jiangwei2222 我这个没有那些坑了,目前就是最后一个坑了,只要在无障碍里点击能生效就 ok;
另外我 airtest 的图像识别慢我是说在手机上执行,我是把 airtest 安装到 userLand 里边执行的,用的全是手机的算力,不单是 airtest 的识别慢,我还试了 easyocr,也慢 基本都是 2s 左右,实在是不满足我的需求.飞浆这个 lite 版本在移动端的效果很好模型只有 3.5M,识别只要 80ms 左右 |