2015-09-08 57 views
-1

運行exec()時出錯。命令:Runtime.exec()引發工作目錄:null環境:null

set `ps | grep <package name>` 

工作目錄:空環境:空

我運行下面的命令來獲得進程ID爲我的應用程序

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命令不能在非rooted設備上工作,而moto G沒有awk或cut作爲默認命令,所以我嘗試了一種不同的方法,而不是直接從adb shell獲取PID。

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; 
} 

該函數給出了完美的結果。

此外,如果你注意到我現在不是發送一個數組作爲命令,但只是一個字符串,運行ADBCommand這是相同的問題,唯一的區別是它接受一個字符串,而不是一個字符串數組。

0

您正在運行set命令,這是一個shell命令,但您沒有運行shell。所以它不可能工作。您需要在其前面添加sh -c。但我沒有看到這一點。當shell退出時,set的結果將會丟失。這沒有意義。

+0

此代碼位於UIAutomator中,因此它直接在ADB外殼內運行,所以我不需要將sh -c – Nirav