2015-09-08 2 views
-1

Ошибка при выполнении exec(). Команда:Runtime.exec() throwing Рабочий каталог: null Окружающая среда: null

set `ps | grep <package name>` 

Working Directory: нулевая среда: нулевая

Я бегу следующую команду, чтобы получить идентификатор процесса для моего приложения

private int getProcessId(String packageName) { 
    int processid = -1; 
    try { 
     runADBCommand(new String[] {"set `ps | grep " + packageName + "`"}); 
     processid = Integer.parseInt(runADBCommand(new String[]{"print $2"})); 
    } catch (IOException e) { 
     e.printStackTrace(); 
     Log.e(LOG_TAG, e.getMessage()); 
    } 
    Log.w(LOG_TAG, "Process id: " + processid); 
    return processid; 
} 

Функция runADBCommand выглядит следующим образом:

private String runADBCommand(String[] adbCommand) throws IOException { 
    String returnValue = "", line; 
    InputStream inStream = null; 
    try { 
     Process process = Runtime.getRuntime().exec(adbCommand); 
     inStream = process.getInputStream(); 
     BufferedReader brCleanUp = new BufferedReader(new InputStreamReader(inStream)); 
     while ((line = brCleanUp.readLine()) != null) { 
      returnValue = returnValue + line + "\n"; 
     } 
     brCleanUp.close(); 
     try { 
      process.waitFor(); 
     } catch (InterruptedException e) { 
      Log.e(LOG_TAG, e.getMessage()); 
      e.printStackTrace(); 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
     Log.e(LOG_TAG, e.getMessage()); 
    } 
    return returnValue; 
} 

Я пытаюсь запустить это на неуправляемом устройстве Moto G, а также разрезать aw k не являются , доступными в оболочке устройства, чтобы я мог напрямую получить pid.

+0

Это не исключение, поэтому оно не было выброшено. Обеспечьте всю трассировку стека. – EJP

ответ

-1

Как-то я обнаружил, что команда set не работает на неуправляемом устройстве, а moto G не имеет awk или вырезаны как команды по умолчанию, поэтому вместо прямого получения PID из оболочки adb я пробовал другой подход.

private int getProcessId() { 
    try { 
     String process = runADBCommand("ps <<last 15 characters of packagename>>"); 
     return Integer.parseInt(process.split("\n")[1].trim().split(" ")[3]); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
    return -1; 
} 

Эта функция дала результат отлично.

Также, если вы заметили, что я не отправляю массив как команду, а просто строку, runADBCommand для этого аналогичен вопросу, единственная разница заключается в том, что он принимает строку вместо массива строк.

0

Вы используете команду set, которая представляет собой команду оболочки, но вы не используете оболочку. Так что это не сработает. Вам нужно добавить sh -c. Но я не вижу смысла. Результат из set будет потерян, когда оболочка выйдет. Это не имеет смысла.

+0

этот код находится в UIAutomator и, следовательно, он запускается непосредственно внутри оболочки ADB, поэтому мне не нужно ставить sh -c – Nirav

 Смежные вопросы

  • Нет связанных вопросов^_^