我正在开发一个项目,它执行从服务器到客户端的任务,服务器是桌面Java应用程序,客户端是android应用程序。我正在尝试使用桌面Java应用程序以编程方式将应用程序安装到Android设备。我这样做是通过Runtime.exec()方法运行adb命令(连接,安装等),如下所示:
Runtime shell = Runtime.getRuntime();
Process p = shell.exec("cmd /c adb connect *ip address*:*designated port*");
p.waitFor();
我在客户端应用程序启动时在Android设备上运行所需的shell命令,以便可以通过无线连接通过adb连接设备。
我遇到的问题是连接后,第一次安装通常会失败。我阅读了流程的输出,看看它给失败带来了什么,它给了我这个:
rm failed for /data/local/tmp/MyApp.apk, No such file or directory
这种情况经常发生在连接后的第一个应用程序安装(所有后续应用程序正确安装)。如果我从命令提示符运行相同的确切安装命令,它将正确安装。
奇怪的是,我在连接之后和安装之前调试时发现,它会正确安装。我认为这可能是一个计时问题,所以我把一个Thread.sleep(1000)和睡眠后大约一半的时间安装得正确。我认为这可能是因为waitFor()没有等待足够的时间来完成连接,但我还读取了连接过程的输出(以确定其结果),并且在安装发生之前它的整个输出已完成。
有没有人有任何建议来解决这个问题?我觉得任意让线程睡眠一段时间都不是必要的。
答案 0 :(得分:0)
adb connect是一个异步过程。您可以通过等待更长时间来获得一些运气,但要正确地执行此操作,您可能需要编写一些代码而不是仅使用命令行adb。
有一个库“ddmlib”,可让您与adb进行交互。
我有一些Groovy代码on Github通过ddmlib连接进行屏幕截图。它实现了AndroidDebugBridge.IDeviceChangeListener,以便在连接完成时得到通知。
如果不是Groovy,那么将其转换为Java应该不会太难。