Программная установка.apk с использованием ADB через беспроводное соединение
Я работаю над проектом, который выполняет задачи от сервера к клиенту, сервер является настольным Java-приложением, а клиент - приложением для Android. Я пытаюсь установить приложения на устройства Android программно, используя настольное приложение Java. Я делаю это с помощью команд adb (connect, install и т. Д.) С помощью методов Runtime.exec(), например:
Runtime shell = Runtime.getRuntime();
Process p = shell.exec("cmd /c adb connect *ip address*:*designated port*");
p.waitFor();
Я запускаю необходимые команды оболочки на устройстве Android при запуске клиентского приложения, чтобы устройство можно было подключить через adb по беспроводному соединению.
Проблема, с которой я сталкиваюсь, заключается в том, что после подключения первая установка обычно не выполняется. Я прочитал вывод процесса, чтобы увидеть, что он дал за неудачу, и он дал мне это:
rm failed for /data/local/tmp/MyApp.apk, No such file or directory
Это всегда происходит при первой установке приложения сразу после подключения (все последующие приложения устанавливаются правильно). Если я запускаю ту же самую команду установки из командной строки, она устанавливается правильно.
Странно то, что я обнаружил, когда отлаживал после подключения и перед установкой, он установился бы правильно. Я подумал, что это может быть проблема синхронизации, поэтому я поместил Thread.sleep(1000), и он установился правильно после сна примерно половину времени. Я подумал, что это может быть из-за того, что waitFor() не ожидал завершения соединения, но я также прочитал выходные данные процесса соединения (чтобы определить его результат), и весь его вывод завершен до того, как произойдет установка.
У кого-нибудь есть предложения по решению этой проблемы? Я чувствую, что произвольное засыпание нити в течение некоторого времени не должно быть необходимым.
1 ответ
ADB Connect - это асинхронный процесс. Возможно, вам повезет, если вы подождете дольше, но для того, чтобы сделать это правильно, вам, вероятно, потребуется написать некоторый код, а не просто использовать adb из командной строки.
Есть библиотека "ddmlib", которая позволяет вам взаимодействовать с adb.
У меня есть Groovy-код на Github, который подключается через ddmlib для захвата экрана. Он реализует AndroidDebugBridge.IDeviceChangeListener, чтобы получать уведомления о завершении подключения.
Если Groovy не ваша вещь, не должно быть слишком сложно конвертировать его в Java.