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

127 天前
 xwhxbg
事情是这样的,楼主因为沉迷手机魔兽,想用 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 大佬们有没有什么思路呢?





3362 次点击
所在节点    Android
7 条回复
cleanery
127 天前
你使用 root 权限的 shell 了没
我记得模拟硬件至少需要 adb shell 级别的权限
一般认为 root > system > adb shell > app
cleanery
127 天前
以前做过一个蓝牙外设模拟屏幕翻页的工具, 就遇到过这个问题, 至少需要在 adb shell 权限下才能模拟触控.
解决防范大概就是用 root, 当时还没有 shizuku, 你可以考虑下 shizuku api
xwhxbg
126 天前
@cleanery 没有,我用的正常用户执行即可执行,这里没有模拟触控,仅仅是把 wine 的输出接到了一个安卓写的 x11 里面
shily
126 天前
| 但是到 java 这边就不行了
| 另外就是 java 的 exec 不知为何无法正常读取到命令的 output


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


我在桌面 Java 1.8 跑了一下你这个 Demo ,运行 ProcessHelper.exec("adb shell ps"); 看起来没啥问题。
xwhxbg
126 天前
@shily 期望是类似截图 2 里面大量的输出,比如有 BOX64 的信息以及 Dynarec 信息,但是我这边 java 的只能读到 wine 的信息,其实命令是一模一样的
shily
126 天前
@xwhxbg 看起来好像是 wine 命令启动了一个 subprocess ,然后这个子进程的输出和 wine 进程的输出是分离的
xwhxbg
126 天前
@shily 在 java 里面有能力拿到子进程的输出吗?

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

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

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

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

© 2021 V2EX