尝试android start-server
从 Java 内部作为外部进程运行时,我遇到了各种问题。Java 由 Gradle 调用。让我向您描述一下在各种情况下到底发生了什么:
环境
- 视窗 7 X64
- 爪哇 7
- commons-exec-1.1
- 摇篮 1.6
- 安卓 API 17
- IntelliJ IDEA 12.1.4 社区版
假设
adb 守护进程被杀死并在调用adb start-server
.
情况1
这段代码:
DefaultExecutor executor = new org.apache.commons.exec.DefaultExecutor();
executor.execute(org.apache.commons.exec.CommandLine.parse("adb start-server"));
log.info("Checkpoint!");
从应用程序插件的 Gradlerun
任务运行时,将显示启动服务器输出,即:
* daemon not running. starting it now on port 5037 *
* daemon started successfully *
然后它将挂起,即“检查点!” 永远不会被记录。手动终止adb.exe
进程将导致代码继续执行。
问题 1
为什么这个调用会阻塞?当adb start-server
从终端运行命令时,几秒钟后控件返回到终端,为什么它不会在代码中发生?
案例2
相反,如果我像这样直接使用 Java 运行时:
Runtime.getRuntime().exec(new String[]{"adb", "start-server"});
log.info("Checkpoint!");
System.exit(0);
如果像以前一样从 Gradle 调用,“检查点!” 将被记录。但是,执行将挂起System.exit(0)
。手动杀死adb.exe
将再次使 Gradle 调用完成。
在这种情况下,不adb start-server
显示输出。
有趣的是,当我从 IntelliJ IDEA 运行应用程序而不是 Gradle 时,使用模仿 Gradle 的构建设置,一切正常,应用程序正常完成。
问题2
为什么 Gradle 挂起System.exit(0)
而 IntelliJ 没有?这是否与 Gradle 本身是一个内部调用 Java 的进程以及在 IntelliJ 的情况下,Java 被立即调用而没有任何间接的事实有关?为什么这有关系?
问题 3
最终,我希望能够从 Gradle 运行它而没有任何挂起。的记录输出adb start-server
将是一个奖励。我将不胜感激任何提示如何做到这一点。