通过无线连接以编程方式使用adb安装.apk

时间:2014-01-03 14:48:50

标签: java android multithreading adb wireless

我正在开发一个项目,它执行从服务器到客户端的任务,服务器是桌面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()没有等待足够的时间来完成连接,但我还读取了连接过程的输出(以确定其结果),并且在安装发生之前它的整个输出已完成。

有没有人有任何建议来解决这个问题?我觉得任意让线程睡眠一段时间都不是必要的。

1 个答案:

答案 0 :(得分:0)

adb connect是一个异步过程。您可以通过等待更长时间来获得一些运气,但要正确地执行此操作,您可能需要编写一些代码而不是仅使用命令行adb。

有一个库“ddmlib”,可让您与adb进行交互。

我有一些Groovy代码on Github通过ddmlib连接进行屏幕截图。它实现了AndroidDebugBridge.IDeviceChangeListener,以便在连接完成时得到通知。

如果不是Groovy,那么将其转换为Java应该不会太难。