Вопрос по android, android-emulator, java, adb – Выполнять команды ADB из Java

4

Я хочу отправить файл из моей Java-программы в эмулятор Android. Теперь я могу запустить эмулятор с помощью ProcessBuilder, а также перехватывать сообщения logcat. Но всякий раз, когда я пытаюсь использовать команду adb push в компоновщике процессов, процесс зависает, и выходные данные не генерируются.

Код:

try {
    ProcessBuilder proc = new ProcessBuilder("D://android-sdk//platform-tools//adb.exe",
                                             "push D:\\final.xml /mnt/sdcard/final.xml");
    Process p = proc.start();
    BufferedReader br2 = new BufferedReader(new InputStreamReader(p.getInputStream()));
    while ( (line = br2.readLine()) != null)
        System.out.println(line);
} catch (Exception e) {
    System.err.println("Error");
}

РЕДАКТИРОВАТЬ:- Нашел вероятное решение. Я использовал метод Process.waitFor (), но не сохранял возвращенный код выхода. Теперь, когда я сделал это:

int exitVal = p.waitFor();

Все работало как шарм.

И @Marc Van Daele Спасибо за ваш вклад. Согласно моему опыту, ProcessBuilder работает в обоих направлениях, т.е. Вы можете использовать аргументы, разделенные пробелами или запятыми. :)

Да ... после того как я сделал правку ... мне это тоже показалось странным. Но я уже давно не сталкиваюсь с той же проблемой. Спасибо за помощь, пареньз :) user1471910
Честно говоря, я думаю, что маловероятно, что сохранение возвращаемого значения waitFor решит проблему. Я скорее думаю, что иногда вы достаточно быстры, чтобы читать данные из InputStream (и тогда все работает нормально), а иногда нет, и тогда вы сталкиваетесь с & quot; повесить & apos; вопрос. Marc Van Daele

Ваш Ответ

1   ответ
4

Если это не отдельные аргументы, такие как

ProcessBuilder proc = new ProcessBuilder("D://android-sdk//platform-tools//adb.exe", "push",  "D:\\final.xml", "/mnt/sdcard/final.xml");
да .. попробовал это .. не работает. Outputstream становится нулевым user1471910
Я действительно провел несколько экспериментов, и этот ответ кажется правильным.
игнорировать мой (неправильный) комментарий на входе против потока выше. Остальная часть моего комментария действительна, хотя.
вы читаете p.getInputStream ()? Я думаю, что вы должны прочитать OutputStream и ErrorStream. Возможно, это также хорошая идея, чтобы установить proc.redirectErrorStream (true); и только читать OutputStream. Возможно, вы работаете с & quot; Поскольку некоторые собственные платформы предоставляют ограниченный размер буфера только для стандартных входных и выходных потоков, невозможность оперативной записи входного потока или чтения выходного потока подпроцесса может привести к блокировке подпроцесса и даже к тупиковой ситуации. & Quot ; как описаноdocs.oracle.com/javase/1.4.2/docs/api/java/lang/Process.html
Удивительно ! отличный ответ .. сэкономил много времени .. Большое спасибо!

Похожие вопросы