2014-10-10 67 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