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

adb 连夜神模拟器速度慢怎么办?

  •  1
     
  •   JCZ2MkKb5S8ZX9pq · 2019-10-16 01:05:41 +08:00 · 14518 次点击
    这是一个创建于 1900 天前的主题,其中的信息可能已经有所发展或是发生改变。

    环境

    • 夜神模拟器 6.3.0.8
    • 虚拟机安卓 7.0,720x1280,DirectX,中等那个配置双核 2G。
    • python 通过 os.system 调用 adb
    • adb devices --> 127.0.0.1:62025 device 就一个

    问题

    • adb shell screencap -p 截图大约要 1 秒以上。
    • adb shell input tap {x} {y} 有时候要 1~3 秒。

    尝试的方法

    • 直接用-s指定,作用不大。
    • adb shell screencap 不存 png,读取速度的确快很多。
      但 raw 格式解读有问题,并不是规范的 rrggbbaa 排列。

    求教

    • 我就是一个游戏,懒得点了,写了个自动化,可是读截图加操作一来一回好几秒,有点太慢了。
    • 有啥别的办法嘛,求教各位高手了。
    25 条回复    2019-10-17 10:26:38 +08:00
    EscYezi
        1
    EscYezi  
       2019-10-16 08:30:54 +08:00 via iPhone   ❤️ 1
    需要写模拟器脚本的话强推 Airtest,我用 Airtest 弄了个明日方舟的脚本,可以参考下
    https://github.com/yeziyezi/airtest-arknights
    ctro15547
        2
    ctro15547  
       2019-10-16 08:39:48 +08:00
    adb shell screencap 截图本来就很慢 ,试试模拟按键截图。真机用 tap 也差不多 1 秒左右 。想简单直接按键精灵手机版,脑子都不用就能写。还要啥自行车
    JCZ2MkKb5S8ZX9pq
        3
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-10-16 09:27:29 +08:00
    @ctro15547 按键精灵不大爱写,小东西还行,稍微复杂点调试起来麻烦。
    javen73
        4
    javen73  
       2019-10-16 09:45:33 +08:00
    emmm 用触动精灵这个平台不行嘛,我觉得还不错
    JCZ2MkKb5S8ZX9pq
        5
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-10-16 09:52:03 +08:00
    @javen73 是 touchelf 嘛? lua 的那个?
    按键精灵和 touchelf 以前都写过,但是感觉调试不方便,手机上看 log 也麻烦,模拟器连打字有时候都有问题,复制黏贴过去啥的,实在是有点费事儿。两三个点判断一下点点还行,稍微复杂点真的太麻烦。
    还是觉得 python 写和调试都比较方便。
    javen73
        6
    javen73  
       2019-10-16 09:54:56 +08:00
    @JCZ2MkKb5S8ZX9pq #5 是触动精灵,不是触摸精灵。
    触动精灵有一个小的 IDE,电脑上可以直接调试手机和模拟器,脚本调试的 log 可以直接显示在 IDE 里面,不用再手机里看 log 的
    JCZ2MkKb5S8ZX9pq
        7
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-10-16 09:55:32 +08:00
    @javen73 ok,我找找看,谢谢。
    fhvch
        8
    fhvch  
       2019-10-16 10:32:42 +08:00   ❤️ 1
    appium https://github.com/appium/appium 环境比较复杂
    uiautomater2 https://github.com/openatx/uiautomator2 环境相对简单

    还有 1 楼哥们说的 airtest,这个支持图形点击,做游戏测试比较好,如果只是滑动,点击固定的点的话可以用 uiautomater2
    Troevil
        9
    Troevil  
       2019-10-16 10:36:14 +08:00
    可以试试 大漠挺好用的
    hkitdog
        10
    hkitdog  
       2019-10-16 11:13:45 +08:00 via iPhone
    @Troevil 没英文文档,看着难受
    JCZ2MkKb5S8ZX9pq
        11
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-10-16 14:53:49 +08:00
    @EscYezi
    @ctro15547
    @javen73
    @fhvch
    @fhvch
    @Troevil
    @hkitdog

    各位,捎带再请教个问题。
    夜神怎么能方便点用上主机的代理?

    以前是走 fiddler,然后 fiddler 用代理。但是安卓 7 版本下,fiddler 的证书有点问题。请问有啥便利的方法嘛?
    Jirajine
        12
    Jirajine  
       2019-10-16 14:57:37 +08:00 via Android
    别用 Python,直接写 shell 脚本用 adb shell xxx.sh 执行
    JCZ2MkKb5S8ZX9pq
        13
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-10-16 15:08:00 +08:00
    @Jirajine 跟 Python 完全没关系,直接命令行也是慢的,早试过了。
    Jirajine
        14
    Jirajine  
       2019-10-16 15:14:44 +08:00 via Android
    @JCZ2MkKb5S8ZX9pq 不是说 Python 慢,你那样调用每一条命令都要 adb 通信一次,写成脚本就是手机上原生执行,不用通信了。
    fhvch
        15
    fhvch  
       2019-10-16 15:33:57 +08:00
    #11 装个 fiddler 的证书不行么?
    不行的话,就换个代理试试 Charles anyproxy ( https 的话都要装证书)
    JCZ2MkKb5S8ZX9pq
        16
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-10-16 15:37:31 +08:00
    @Jirajine 一样很慢的,好像只有一次性连续输入一系列动作可以这么搞,比如点击五次之类的,能优化一点。
    但是如果要图形判断再操作,还是每次都很慢。
    JCZ2MkKb5S8ZX9pq
        17
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-10-16 15:38:49 +08:00
    @fhvch 证书当然装了,安卓 4.2 没问题,可能安卓 7 改了啥东西吧。
    而且我的需求只是代理,并不需要抓包,所以想知道有没有更简单的方法,省得多开一个抓包的。
    fhvch
        18
    fhvch  
       2019-10-16 16:00:36 +08:00   ❤️ 1
    #17
    Android7.0 及以上的系统中,每个应用可以定义自己的可信 CA 集,默认情况下,应用只会信任系统预装的 CA 证书,而不会信任用户安装的 CA 证书,

    所以 Android7.0 及以上的系统就算安装证书也不会被信任, 但还是可以其他办法解决:

    1.修改 APP 配置文件,直接修改 APP 的 android:networkSecurityConfig 属性,前提是可以获取到 APP 的源码。
    2.将证书安装到系统证书中,需要 root。(详情请查看:https://testerhome.com/articles/17746
    JCZ2MkKb5S8ZX9pq
        19
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-10-16 17:43:22 +08:00
    暂时先用了 uiautomator,代码改动量很小。
    截屏还是需要 1s 左右,估计跟 png 压缩有关系。点击是快了很多。

    [10-16 17:42:39] Click used -------------- 0.148
    [10-16 17:42:40] Screen capture used ----- 1.131
    [10-16 17:42:40] 关卡选择
    [10-16 17:42:40] Click used -------------- 0.152
    [10-16 17:42:41] Screen capture used ----- 0.611
    [10-16 17:42:41] 出击
    [10-16 17:42:41] Click used -------------- 0.148
    [10-16 17:42:42] Screen capture used ----- 0.714
    [10-16 17:42:42] 其它
    [10-16 17:42:42] Click used -------------- 0.142
    [10-16 17:42:43] Screen capture used ----- 0.712
    [10-16 17:42:43] 其它
    [10-16 17:42:43] Click used -------------- 0.158
    [10-16 17:42:43] Screen capture used ----- 0.634
    [10-16 17:42:43] 其它
    [10-16 17:42:44] Click used -------------- 0.146
    [10-16 17:42:44] Screen capture used ----- 0.593
    locoz
        20
    locoz  
       2019-10-16 17:51:27 +08:00
    @JCZ2MkKb5S8ZX9pq #11
    @JCZ2MkKb5S8ZX9pq #17
    是系统级的 SSL Pinning,很好解决,可以看一下我之前写的这篇文章: https://zhuanlan.zhihu.com/p/56397466
    locoz
        21
    locoz  
       2019-10-16 17:52:58 +08:00
    做游戏自动化脚本的话,其实 Android 端的自动化测试工具会比较好用些,比如 Android 版按键精灵,它还可以加扩展实现它本身没有实现的功能。
    JCZ2MkKb5S8ZX9pq
        22
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-10-16 21:15:39 +08:00
    @fhvch
    uiautomator 如果一段时间没有命令输入,好像会被杀后台?
    运行的时候会自动重新 init,挺费时间的,请问你了解这个现象吗?

    [10-16 21:11:12] uiautomator2.GatewayError(gateway error, tim
    ed 0.0s), retrying in 3.0 seconds...
    [D 191016 21:11:15 __init__:627] Product-brand: samsung
    [D 191016 21:11:17 __init__:645] uiautomator is starting ...
    [D 191016 21:11:18 __init__:645] uiautomator is starting ...
    [D 191016 21:11:19 __init__:645] uiautomator is starting ...
    [D 191016 21:11:20 __init__:645] uiautomator is starting ...
    [D 191016 21:11:21 __init__:645] uiautomator is starting ...
    [D 191016 21:11:22 __init__:645] uiautomator is starting ...
    [D 191016 21:11:23 __init__:645] uiautomator is starting ...
    [D 191016 21:11:24 __init__:645] uiautomator is starting ...
    [D 191016 21:11:25 __init__:645] uiautomator is starting ...
    [D 191016 21:11:26 __init__:645] uiautomator is starting ...
    [I 191016 21:11:30 __init__:661] uiautomator back to normal
    JCZ2MkKb5S8ZX9pq
        23
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-10-16 22:03:23 +08:00
    另外每次到这段代码,uiautomator 必定出现 back to normal,好奇怪。

    代码:
    log.info('探测')
    d.click(540, 880) # 点击探测
    time.sleep(5)
    rx, ry = randint(80, 640), randint(310, 870)
    log.info(f'搜索 {rx} {ry}')
    d.click(rx, ry)
    time.sleep(10)
    battleTm = Timer() # 开始战斗计时

    输出:
    [10-16 21:50:18] 探测
    [10-16 21:50:23] 搜索 606 841
    C:\Users\chuan\AppData\Local\Programs\Python\Python37-32\lib
    te-packages\uiautomator2\__init__.py:460: RuntimeWarning: ui
    omator2 is not reponding, restart uiautomator2 automatically
    stacklevel=1)
    [10-16 21:50:23] uiautomator2.GatewayError(gateway error, ti
    used 0.0s), retrying in 3.0 seconds...
    [D 191016 21:50:26 __init__:627] Product-brand: samsung
    [D 191016 21:50:29 __init__:645] uiautomator is starting ...
    [I 191016 21:50:33 __init__:661] uiautomator back to normal

    好奇怪哦,不知道是不是这里 sleep(5)的影响,但后面暂停还要久都没事。
    fhvch
        24
    fhvch  
       2019-10-17 10:15:49 +08:00
    @JCZ2MkKb5S8ZX9pq
    如果这段代码每次执行都是必现这个问题的话 可以去 github 提个 issue
    如果不是的话,那就得分析下了。。(你操作的是游戏 app 是不是,界面是动态的是不是?我猜可能问题就出在这里了)
    JCZ2MkKb5S8ZX9pq
        25
    JCZ2MkKb5S8ZX9pq  
    OP
       2019-10-17 10:26:38 +08:00
    @fhvch
    嗯,就是感觉 uiautomator 经常需要 back to normal,本来猜想是哪里可以设置,或者是模拟器机能不足之类的。
    那我等下去问问看。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1000 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 19:36 · PVG 03:36 · LAX 11:36 · JFK 14:36
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.