求助为何同样的命令在 adb shell 里面没问题但是用 Java Runtime.getRuntime().exec 会卡住 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
xwhxbg
V2EX    Android

求助为何同样的命令在 adb shell 里面没问题但是用 Java Runtime.getRuntime().exec 会卡住

  •  
  •   xwhxbg 2024-07-17 10:47:04 +08:00 6830 次点击
    这是一个创建于 498 天前的主题,其中的信息可能已经有所发展或是发生改变。
    事情是这样的,楼主因为沉迷手机魔兽,想用 winlator 来运行 wine-ge 来在安卓手机上跑官服魔兽,但是官服魔兽只支持 wine-ge-8-25 ,因为 battle.net 这个登录器需要 secondary logon 这个功能,于是楼主就试图移植这个 wine-ge 上 winlator 。

    winlator 是一个安卓写的 wine 配置管理工具,它自己手写了一个安卓 UI<=>x11 之间的双向绑定,然后通过 java 的 Runtime.getRuntime().exec 来运行 wine 命令。

    但是同样的命令用 adb shell 运行的时候会正常过,并且输出的 stdout 和 stderr 都很正常也很详细,但是到 java 这边就不行了

    由于这玩意是自己实现的 x11 ,我启动的时候忽略了一个 opcode 117 是用来设置鼠标按键数量的,不知道是不是这个会卡住什么,另外就是 java 的 exec 不知为何无法正常读取到命令的 output ,原始代码在这里 https://github.com/FrontMage/winlator-855/blob/main-make-it-build/app/src/main/java/com/winlator/core/ProcessHelper.java 然后整个项目 clone 下来用 Android studio 打开 main-make-it-build 分支即可,注意可能要更新下 gradle 的版本

    神通广大的 v2 大佬们有没有什么思路呢?





    7 条回复    2024-07-18 18:18:06 +08:00
    cleanery
        1
    cleanery  
       2024-07-17 16:45:29 +08:00
    你使用 root 权限的 shell 了没
    我记得模拟硬件至少需要 adb shell 级别的权限
    一般认为 root > system > adb shell > app
    cleanery
        2
    cleanery  
       2024-07-17 16:47:23 +08:00
    以前做过一个蓝牙外设模拟屏幕翻页的工具, 就遇到过这个问题, 至少需要在 adb shell 权限下才能模拟触控.
    解决防范大概就是用 root, 当时还没有 shizuku, 你可以考虑下 shizuku api
    xwhxbg
        3
    xwhxbg  
    OP
       2024-07-18 10:03:21 +08:00
    @cleanery 没有,我用的正常用户执行即可执行,这里没有模拟触控,仅仅是把 wine 的输出接到了一个安卓写的 x11 里面
    shily
        4
    shily  
       2024-07-18 11:13:59 +08:00
    | 但是到 java 这边就不行了
    | 另外就是 java 的 exec 不知为何无法正常读取到命令的 output


    什么不行了,期望是啥,现状是啥?


    我在桌面 Java 1.8 跑了一下你这个 Demo ,运行 ProcessHelper.exec("adb shell ps"); 看起来没啥问题。
    xwhxbg
        5
    xwhxbg  
    OP
       2024-07-18 11:57:36 +08:00
    @shily 期望是类似截图 2 里面大量的输出,比如有 BOX64 的信息以及 Dynarec 信息,但是我这边 java 的只能读到 wine 的信息,其实命令是一模一样的
    shily
        6
    shily  
      2024-07-18 15:49:52 +08:00
    @xwhxbg 看起来好像是 wine 命令启动了一个 subprocess ,然后这个子进程的输出和 wine 进程的输出是分离的
    xwhxbg
        7
    xwhxbg  
    OP
       2024-07-18 18:18:06 +08:00
    @shily 在 java 里面有能力拿到子进程的输出吗?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     1592 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 16:23 PVG 00:23 LAX 08:23 JFK 11:23
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86