Почему та же команда работает в терминале, но не в моем приложении? - PullRequest
0 голосов
/ 30 января 2019

Я создаю приложение, которое, используя root, принимает logcat, чтобы оно могло найти определенную ошибку в другом приложении.Самым простым подходом для меня является сохранение logcat в файл непосредственно из команды.Так что все, что мне нужно сделать, это запустить su, а затем logcat | grep --line-buffered "search string" > /path/to/save/logcat.log.Когда я запускаю его на эмуляторе терминала (например, this или даже this ), он сохраняет выходные данные в файл именно так, как я этого хочу.Но когда я запускаю ту же самую команду из моего приложения, она получает пустой файл.Я пробовал много разных способов вывода logcat, но все они дают мне пустой файл.Интересно, что когда я беру нормальный logcat с помощью приложения (без grep, используя «>» для вывода), файл сохраняется, как и должен, и содержит строку, которую я хочу grep.Что я делаю не так?

Вот код, который я использую:

try {
        Process p = Runtime.getRuntime().exec("su");
        DataOutputStream dos = new DataOutputStream(p.getOutputStream());
        dos.writeBytes("logcat | grep --line-buffered \"search string\" > /storage/emulated/0/logcat.log\n");
        dos.flush();
 } catch (IOException e) {
     e.printStackTrace();
 }

1 Ответ

0 голосов
/ 31 января 2019

Я перечисляю свой комментарий как ответ, поскольку это, очевидно, помогло решить вашу проблему, но здесь происходит еще кое-что, что я не в состоянии полностью решить:

Попробуйте также перенаправить stderrчтобы увидеть, есть ли какая-либо ошибка, которая затем может быть зафиксирована - я думаю, что это будет &> (это bash) - и> outfile 2> & 1 для более общего синтаксиса.

Итак

dos.writeBytes("logcat | grep --line-buffered \"search string\" &> /storage/emulated/0/logcat.log\n");

Или

dos.writeBytes("logcat | grep --line-buffered \"search string\" > /storage/emulated/0/logcat.log 2>&1\n");

Первоначально целью комментария было дать вам больше информации о том, что на самом деле происходит - как выяснилось, это помогло вам получить результат, который вымы ищем.

Я полагаю, что здесь есть несколько факторов, которые могут способствовать тому, почему добавление stderr помогло:

  • stderr (который предложил добавить комментарий) не буферизован - я думаю (но не может доказать) не буферизация - это то, что помогает вам, даже несмотря на то, что перехваченный вывод является stdout.
  • обработка stdout чувствительна к TTY (эмуляция терминала) против non-TTY (ваша программа) иразные подходы к буферизации (буферизация строк в TTY, в противном случае - полная буферизация).Я понимаю, что ваш вариант grep должен преодолеть это.Эта разница в TTY-nonTTY может объяснить источник вашей проблемы.
  • Отправленный код отправляет команду (logcat ...) процессу, созданному , и продолжает .Так, например, если бы logcat должен был выводить много данных, теоретически ваш опубликованный код продолжил бы и оставил бы область действия - что происходит с процессом, созданным, когда p выходит из области видимости - не уверен.

В любом случае, рад, что вы смогли продолжить.

...