V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
yangyuhan12138
V2EX  ›  程序员

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

  •  
  •   yangyuhan12138 · 2023-07-13 13:45:59 +08:00 · 3518 次点击
    这是一个创建于 497 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    第 1 条附言  ·  2023-07-13 16:59:18 +08:00
    update: 现在我已经成功在 termux 中直接连接到 adbd,当然 使用的是无线调试,所以我现在的疑问是有没有办法不打开这个 WIFI 我也能进行无线调试,因为我可能处于没有 WIFI 的环境或者公共 WiFi,在这种情况下 需要 WiFi 的这个条件就会变得比较苛刻,当然我也可以搞一个什么随身 WIFI?或者有没有办法搞个虚拟 WiFi 就在当前手机上,自己创建,自己连
    35 条回复    2023-07-24 23:25:52 +08:00
    yfugibr
        1
    yfugibr  
       2023-07-13 13:47:43 +08:00 via Android
    Asakijz
        2
    Asakijz  
       2023-07-13 13:48:44 +08:00
    auto.js 可能符合你的要求?
    Asakijz
        3
    Asakijz  
       2023-07-13 13:49:31 +08:00
    @Asakijz 没看到结尾,我的问题
    Supplied
        4
    Supplied  
       2023-07-13 13:49:52 +08:00 via Android
    shizuku
    hicdn
        5
    hicdn  
       2023-07-13 14:35:27 +08:00 via Android
    termux 里安装 adb ,手机开 wifi adb ,termux 里 adb connect
    qiaofanxing
        6
    qiaofanxing  
       2023-07-13 15:24:53 +08:00 via Android
    shizuku 很好用
    yangyuhan12138
        7
    yangyuhan12138  
    OP
       2023-07-13 15:28:18 +08:00
    @hicdn 我先前试了这个方案,显示的连接成功,但是我 adb devices 没有东西我不知道为啥,可能是我用的 adb 不对?我先前用的是 pkg install adb,然后我现在看到 termux 好像专门有个 adb 那个好像权限不太一样?我准备待会儿试试
    huangminzone
        8
    huangminzone  
       2023-07-13 15:29:36 +08:00
    开 5555 端口或者 root 就可以实现单机
    Masoud2023
        9
    Masoud2023  
       2023-07-13 15:47:24 +08:00
    只为了解决 adb:

    1. 能 root 的话改 build.prop 就行
    2. 不能 root 的 11 以上能开 adb over wifi
    3. 11 以下的话 shizuku
    jiager
        10
    jiager  
       2023-07-13 16:07:00 +08:00
    看下这个帖子,因为我用的是 python ,其实这个方法无论什么语言都可行,因为最终实现方式是调用 adb
    https://www.v2ex.com/t/956266
    yangyuhan12138
        11
    yangyuhan12138  
    OP
       2023-07-13 16:10:03 +08:00
    @yfugibr
    @Supplied
    @qiaofanxing
    @Masoud2023
    shizuku 好像是要我先有 adb 吧,而且我没看到他可以干啥,看起来像是给普通的应用程序提供了一些 api 可以调用 adb?但是我是想在 termux 运行 appium,我需要达到的目的可能是 termux 中 使用 adb devices 能看到我当前这个手机;先前我试了在 termux 中用 wifi 连接 adbd,连接是连接成功了 但是我输入 adb devices 没有东西出来;这个问题应该可以解决,我还在尝试中...但是他好像依赖了"WIFI",要是我没有局域网怎么办,我想的是 termux 用 adb 连接当前的安卓手机 使用 localhost...他们本来就在一个设备上..但是无线调试如果我没有 WiFi 的话他甚至不让我打开这个选项....
    forQ
        12
    forQ  
       2023-07-13 16:16:00 +08:00
    开启手机无线调试,配对成功后,再 connect
    yangyuhan12138
        13
    yangyuhan12138  
    OP
       2023-07-13 16:21:41 +08:00
    @jiager 这个确实是实现了 termux 里边使用 adb,但是最终还是依赖了 WiFi 呀有没有可能连 wifi 都不要,或者说 这个方案 如果 WiFi 断开连接之后 termux 还能操作手机吗?
    qiaofanxing
        14
    qiaofanxing  
       2023-07-13 16:26:17 +08:00
    @yangyuhan12138 #11 “安装”是什么意思呀,你手机上都没有 adb 权限的话,当用户应用装上去权限也不够的。
    cairnechen
        15
    cairnechen  
       2023-07-13 16:28:25 +08:00
    回想起了以前玩家国梦的时候用 UIAutomator2 刷金币的时光
    azhangbing
        16
    azhangbing  
       2023-07-13 16:34:42 +08:00
    手机开启无线调试后 可以调用 adb 就是 1 楼说的 shizuku 的方式
    yangyuhan12138
        17
    yangyuhan12138  
    OP
       2023-07-13 16:46:56 +08:00
    @qiaofanxing 就是 appium 那种脚本 直接放到 termux 上去运行,相当于 appium 的服务端,adb 的服务端客户端,还有 appium 的脚本都放在 termux 上运行.
    yangyuhan12138
        18
    yangyuhan12138  
    OP
       2023-07-13 16:55:44 +08:00
    @forQ 确实 我之前 adb pair 完了 没有 connect,所以没有 devices
    LykorisR
        19
    LykorisR  
       2023-07-13 16:58:59 +08:00
    可以利用无线调试,让程序内置一个魔改的 adb 就行,然后引导用户开启无线 adb ,还有 adb 无线的话是需要配对的
    无线连接上之后就可以有权限了,但是无论如何都一定需要一次 adb ,不管你是电脑还是什么,shizuku 也是需要一次开启权限的
    yangyuhan12138
        20
    yangyuhan12138  
    OP
       2023-07-13 17:02:50 +08:00
    @LykorisR 第一次怎么样设置都可以,我想要的时候边不用 WIFI 也能用 adb
    yangyuhan12138
        21
    yangyuhan12138  
    OP
       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
        22
    LykorisR  
       2023-07-13 17:15:43 +08:00
    @yangyuhan12138 那就需要大量魔改 adb 然后让其在设备上能够被以 USB 形式检测出来
    hicdn
        23
    hicdn  
       2023-07-13 18:13:02 +08:00 via Android
    root 后有各种方式开启 adb over ip ,
    adb connect 127.0.0.1
    jiangwei2222
        24
    jiangwei2222  
       2023-07-13 18:55:48 +08:00 via Android
    https://github.com/Jinnrry/RobotHelper/tree/master

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

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

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

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

    如果你是操作游戏的话,游戏厂商还会使用 ai 判断你的操作轨迹是否符合人类习惯,到这一步的话,你又需要录制你的手动操作进行回放。
    yangyuhan12138
        35
    yangyuhan12138  
    OP
       2023-07-24 23:25:52 +08:00
    @jiangwei2222 我这个没有那些坑了,目前就是最后一个坑了,只要在无障碍里点击能生效就 ok;
    另外我 airtest 的图像识别慢我是说在手机上执行,我是把 airtest 安装到 userLand 里边执行的,用的全是手机的算力,不单是 airtest 的识别慢,我还试了 easyocr,也慢 基本都是 2s 左右,实在是不满足我的需求.飞浆这个 lite 版本在移动端的效果很好模型只有 3.5M,识别只要 80ms 左右
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2992 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 14:12 · PVG 22:12 · LAX 06:12 · JFK 09:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.