关于 adb 的问题,搞安卓的同学进来帮忙看看

2023-07-13 13:45:59 +08:00
 yangyuhan12138

我想使用 appnium 或者 airtest 做个小的辅助工具,就是写一段脚本,然后它自动帮你在手机上点点点,但是这两个东西都依赖 adb,他们都是调用 adb 去操作手机的.

现在问题是我想让我的脚本直接在手机上运行(我会安装一个 termux),也就是说在手机的 linux 环境下需要与手机的安卓环境建立一个 adb 连接才行.

所以我的问题就是,有没有什么方法可以建立这个连接,我不希望使用 wifi 或者 usb 中的任意一种连接方式,最终我想把我写好的脚本,直接安装到手机上运行.

有什么方法可以实现吗,或者有没有什么 workround 都可以.

无障碍服务我试过了不行,因为获取不到页面上的信息,目标应用好像是 flutter 写的,只能拿到一个 layout.什么有用的信息都拿不到,所以感觉无障碍服务可以 pass 了.

3591 次点击
所在节点    程序员
35 条回复
yangyuhan12138
2023-07-13 17:05:36 +08:00
@jiager 你这个也可以优化一线 不需要 shiziku 了

直接 termux 里执行:

pkg install android-tools

adb pair ip:port 分屏输入 code

adb connect ip:port (这里是固定 port)
LykorisR
2023-07-13 17:15:43 +08:00
@yangyuhan12138 那就需要大量魔改 adb 然后让其在设备上能够被以 USB 形式检测出来
hicdn
2023-07-13 18:13:02 +08:00
root 后有各种方式开启 adb over ip ,
adb connect 127.0.0.1
jiangwei2222
2023-07-13 18:55:48 +08:00
https://github.com/Jinnrry/RobotHelper/tree/master

你看下我写的这个项目,你想用 adb 命令执行的话你翻一下我早期的代码历史。早期我就是用 adb 命令点击的。但是性能太差,后面我废弃掉了。现在提供 root ,xposed ,无障碍三种方式提权完成点击
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 啥的也方便,遇到各种反作弊,或者某些策略,上机器学习就完事了
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
zpp0196
2023-07-13 21:01:44 +08:00
Android 11 及以上用上面说的方式连接 wifi adb ,用 termux 执行 adb tcpip 5555 ,执行成功后就可以断开 wifi 了,再执行 adb connect localhost 就可以连接本机了,不重启手机就可以一直用 adb connect localhost 连接本机,重启了需要再执行一次 adb tcpip 5555 ,公共 wifi 或手机热点都行,只需要开机连一次 wifi 。
yangyuhan12138
2023-07-13 22:51:17 +08:00
@zpp0196 牛啊牛啊,这基本能解决我目前的问题,只要不关机就不用重连,目前你这个方案最好!我没想到 pair 完了 连接好了还能 tcpip,还能混着用?牛逼...
yangyuhan12138
2023-07-13 22:52:01 +08:00
@zpp0196 我以为 Android11 只能用 pair 这种方式来连了呢
yangyuhan12138
2023-07-13 23:22:31 +08:00
@jiangwei2222 你是真的大佬...但是我也是真不懂安卓,我是做后端的,只是最近遇到一个需求想搞一搞,学习成本太高的话就没啥必要了,linux 那个方案对我来说可能是更好的,但是他需要 root,而且可以想象坑应该不少;所以我选 adb
@zpp0196 老哥解决了本地 adb 的问题,而且不需要开 wifi,目前来看这个方案还挺不错了,明天吧 airtest 放上去跑跑看,如果能用的话就太 nice 了.

linux 那个方案如果要点击屏幕上特定的元素 只能截图+图像识别+点击坐标是吧 by the way..
jiangwei2222
2023-07-14 10:29:11 +08:00
@yangyuhan12138 #30 我也是后端开发。你用 adb 操作应该也是`adb shell sendevent xxx` 这样操作的吧。你可以看我贴的 sendevent 源码,对一些游戏操作的时候,需要高频点击,sendevent 操作会有延迟,导致问题。我是重写了 sendevent 工具解决的。

另外,你如果用 sendevent ,你直在程序里面调用就行了,不需要 adb
yangyuhan12138
2023-07-24 09:31:56 +08:00
@jiangwei2222 大佬 再请教一个问题,airtest 本来是可以实现我的需求的,但是他的图片识别太慢了,我在网上去找了飞浆,她有个 android 的 demo,所以我又回到了写无障碍服务这条路上来,但是我的目标 app 他好像不识别无障碍服务的模拟点击,我用的是 dispatchGesture 方法,点他没反应,点其他的应用就可以,这个有啥解决方法没,最好不要 root...root 他也会检测
jiangwei2222
2023-07-24 16:27:13 +08:00
@yangyuhan12138 #32 1 、图像识别慢,我很久以前看过 airtest 的代码,我记得他是用的 adb 截图和传数据,慢主要卡在截图和传输上面。
2 、无障碍被检测很正常啊,安卓允许程序针对无障碍操作做出不同的响应,国内大部分 app 和游戏都会区分处理,用来反爬
jiangwei2222
2023-07-24 16:38:24 +08:00
@yangyuhan12138 #32 另外,你这真是完完全全把我当年的路全部重走了一遍啊,我当年为了搞这个,把 android 输入部分的源码全看了一遍,把 airtest 、autojs 等框架源码也看了一遍。还反编译了按键精灵,研究了按键精灵的实现。你都写安卓代码了,直接把我那个框架拿来用呗,坑我都帮你踩完了。你再继续研究下去,跟我那框架写的没啥区别了

我目测,模拟点击、图像识别只是你第一个坑,你好不容易点击和识别处理完了,你还会遇到文本输入,防爬验证码,文本输入我是自己实现了一个输入法模拟输入,防爬我是引入了 tf ,自己训练 ai 模型处理的。

如果你是操作游戏的话,游戏厂商还会使用 ai 判断你的操作轨迹是否符合人类习惯,到这一步的话,你又需要录制你的手动操作进行回放。
yangyuhan12138
2023-07-24 23:25:52 +08:00
@jiangwei2222 我这个没有那些坑了,目前就是最后一个坑了,只要在无障碍里点击能生效就 ok;
另外我 airtest 的图像识别慢我是说在手机上执行,我是把 airtest 安装到 userLand 里边执行的,用的全是手机的算力,不单是 airtest 的识别慢,我还试了 easyocr,也慢 基本都是 2s 左右,实在是不满足我的需求.飞浆这个 lite 版本在移动端的效果很好模型只有 3.5M,识别只要 80ms 左右

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/956452

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX