Как получить сообщение об ошибке неудачной команды оболочки на Android - PullRequest
2 голосов
/ 02 февраля 2012

На рутированном устройстве Android я попытался запустить команду cat, которая читает журнал ядра, следующим образом:

Process p = Runtime.getRuntime().exec("su");
p = Runtime.getRuntime().exec("/system/bin/cat /proc/kmsg");

Команда su была успешно выполнена, но не cat.Я попытался прочитать вывод команды с помощью getInputStream (), но там ничего не было, как показано ниже:

BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
 while ((read = err.read(buffer)) > 0)
 {  //read error to buffer 
catOutput.append(buffer, 0, read);
 }
 in.close();

Я использовал тот же код с командой ls вместо отображения журнала ядра, он работал просто отлично ипокажи мне результат.

Интересно, какую ошибку я получаю, и хотел увидеть сообщение об ошибке в оболочке при выполнении команды cat.Пробовал p.getErrorStream (), но он не дает мне никакого результата.Может ли кто-нибудь помочь мне с этим?Благодарю.

Ответы [ 2 ]

0 голосов
/ 12 июня 2012

Я наконец нашел решение проблемы с помощью библиотеки RootTools.Недавно выпущенный (через несколько месяцев после того, как был задан мой вопрос), RootTools предоставляет простой в использовании набор инструментов, который помогает запускать команды, требующие привилегии root.Я создал оболочку для проверки доступности корневого доступа перед выполнением команды оболочки:

void testRootToolsCommand(String command){

    if (RootTools.isRootAvailable())
        toastMessage("Root is available !!!");
    else { 
        toastMessage("NO ROOT !!! ");
        return; 
    }

    int timeOut = 1000; 
    try {
        List<String> output = RootTools.sendShell(command,timeOut);     
        toastMessage("OUTPUT of the command \n" + output.toString());           
    } catch (RootToolsException re) {
        toastMessage("Funny thing happened with RootTools!!! ");            
    } catch (TimeoutException te)
    {
        toastMessage("Timeout exception - Increase timeout !!! !!! ");
    }
    catch (Exception e) { 
    toastMessage(e.getMessage().toString());
    }       
}

Пример вызова функции:

testRootToolsCommand("cat /proc/kmsg > /sdcard/jun11_4h51.txt");

Примечание. Инструмент также поддерживает запуск несколькихкоманды сразу.

0 голосов
/ 02 февраля 2012

Вот подробный пример того, как это сделать - обратите внимание, что я получил идею от этого ответа:

public void catKmsg() {
  Runtime runtime = Runtime.getRuntime();
  Process proc = null;
  OutputStreamWriter osw = null;
  StringBuilder sbstdOut = new StringBuilder();
  StringBuilder sbstdErr = new StringBuilder();

  String command="/system/bin/cat /proc/kmsg";

  try { // Run Script

    proc = runtime.exec("su");
    osw = new OutputStreamWriter(proc.getOutputStream());
    osw.write(command);
    osw.flush();
    osw.close();

  } catch (IOException ex) {
    ex.printStackTrace();
  } finally {
    if (osw != null) {
      try {
        osw.close();
      } catch (IOException e) {
        e.printStackTrace();                    
      }
    }
  }
  try {
    if (proc != null) {
      proc.waitFor();
    }
  } catch (InterruptedException e) {
    e.printStackTrace();
  }
  sbstdOut.append(ReadBufferedReader(new InputStreamReader
                                     (proc.getInputStream())));
  sbstdErr.append(ReadBufferedReader(new InputStreamReader
                                     (proc.getErrorStream())));
  if (proc.exitValue() != 0) {
  }
}
...