2014-10-10 90 views
2

我想一個Java程序執行以下shell命令:getRuntime()EXEC()什麼也不做

apktool.jar d /path/to/my/app.apk

此命令直接在命令行上執行它時會很好地工作。

Java代碼:

public static void main(String[] args) { 

    String command = "apktool d /path/to/my/app.apk"; 
    try { 
     Runtime.getRuntime().exec(command); 
    } catch (IOException e1) { 
     e1.printStackTrace(); 
    } 
} 

沒有錯誤,也不例外。沒有任何反應,我的印象是我已經在整個互聯網上搜索解決方案。有人知道我做錯了什麼嗎?一個簡單的命令像

的mkdir /路徑/到/ A /新/文件夾

作品沒有問題。

我試過使用的ProcessBuilder相同:

try { 
    Process process = new ProcessBuilder(command).start(); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

這一次我只得到「無法運行程序‘apktool d /path/to/my/app.apk,沒有這樣的文件或目錄’我可以。你甚至不會運行mkdir命令

回答

2

你需要用java.exe調用jar,而你沒有這樣做,還需要捕獲進程中的輸入和錯誤流,你可以不要這樣做,用ProcessBuilder代替流,然後運行流程。

例如(我只能做一個Windows示例),

import java.io.IOException; 
import java.io.InputStream; 
import java.util.Scanner; 

public class ProcessEg { 
    private static Process p; 

    public static void main(String[] args) { 
     String[] commands = {"cmd", "/c", "dir"}; 
     ProcessBuilder pBuilder = new ProcessBuilder(commands); 
     pBuilder.redirectErrorStream(); 

     try { 
     p = pBuilder.start(); 
     InputStream in = p.getInputStream(); 
     final Scanner scanner = new Scanner(in); 
     new Thread(new Runnable() { 
      public void run() { 
       while (scanner.hasNextLine()) { 
        System.out.println(scanner.nextLine()); 
       } 
       scanner.close(); 
      } 
     }).start(); 
     } catch (IOException e) { 
     e.printStackTrace(); 
     } 
     try { 
     int result = p.waitFor(); 
     p.destroy(); 
     System.out.println("exit result: " + result); 
     } catch (InterruptedException e) { 
     e.printStackTrace(); 
     } 
    } 
} 
+0

對不起,我編輯我的職務。 apktool是一個調用apktool.jar的.sh文件。 – null 2014-10-10 16:12:25

+0

@null:同樣的想法 - 然後用'sh'命令運行它(我相信因爲我沒有做unix)。 – 2014-10-10 16:14:13

+0

我用sh命令運行它,但沒有任何反應。我更新了我的問題,因爲我甚至無法使用ProcessBuilder運行mkdir。 – null 2014-10-10 16:21:41

0

試着做這樣的:

StringBuffer output = new StringBuffer(); 
    Process p; 
    try { 
     p = Runtime.getRuntime().exec("./path/apktool d /path/to/my/app.apk"); 
     p.waitFor(); 
     BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream())); 
     String line = "";   
     while ((line = reader.readLine())!= null) { 
      output.append(line + "\n"); 
     } 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    system.out.println(output.toString()); 

創建第一個過程,您可以等待迴應並讀取執行過程的輸出。

如果在運行shell命令時出現問題,最後會顯示錯誤消息。

此外,請確保您的Java程序可以訪問你的shell腳本,或者提供更好的完整路徑,如:

./path/to/shell/apktool d /path/to/my/app.apk 
+0

僅供參考:'waitFor()'是一個阻塞調用。 – 2014-10-10 16:39:16

+0

那麼,我已經知道了,那正是我告訴他要做的,等待「apktool」執行完成,這樣他就可以得到迴應並查看是否有失敗。 – 2014-10-10 16:44:51

+1

不要忘記,Linux默認不會將當前文件夾添加到路徑中。您需要'./'來引導任何調用。 p = Runtime.getRuntime()。exec(「./ apktool.sh d /path/to/my/app.apk」); – markbernard 2014-10-10 16:55:26