无法从Java在shell上运行apktool命令

时间:2015-03-25 07:30:53

标签: java shell apktool

我正在尝试使用Java程序中的apktool。我正在使用它来创建一个Web服务。但是,此命令不能在Java程序的shell上运行。

String cmd = "apktool d /home/ridhima/Test.apk" ;
try {
    Process p = Runtime.getRuntime().exec(cmd);
    BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
    String line = "";
    while((line = reader.readLine()) != null)
     {
       System.out.print(line + "\n");
     }
    p.waitFor(); 
}
catch (IOException | InterruptedException e1) {
        e1.printStackTrace();
}

该命令可直接从shell中完成。

2 个答案:

答案 0 :(得分:0)

您可能应该等待该过程完成

String cmd = "apktool d /home/ridhima/Test.apk" ;
try {
    Process p = Runtime.getRuntime().exec(cmd);
    // You maybe should wait for the process to complete
    p.waitFor(); 
    BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
    String line = "";
    while((line = reader.readLine()) != null)
     {
       System.out.print(line + "\n");
     }

}
catch (IOException | InterruptedException e1) {
        e1.printStackTrace();
}

或者您可以使用 ProcessBuilder 执行相同的任务

public class Main {
    public static void main(String[] args) throws java.io.IOException, java.lang.InterruptedException {
        // Create ProcessBuilder instance for UNIX command ls -l
        java.lang.ProcessBuilder processBuilder = new java.lang.ProcessBuilder("ls", "-l");
        // Create an environment (shell variables)
        java.util.Map env = processBuilder.environment();
        env.clear();
        env.put("COLUMNS", "3");
        processBuilder.directory(new java.io.File("/Users"));
        java.lang.Process p = processBuilder.start();
    }
}

答案 1 :(得分:0)

谢谢,但现在工作正常。由于apktool是一个包装脚本,因此可能无法通过java程序识别它。直接解压apktool.jar。

   try {
        ProcessBuilder pb = new ProcessBuilder("/home/ridhima/java/jdk1.8.0/bin/java", "-jar", "apktool.jar","d","test.apk");
        Process p = pb.start();
        BufferedReader reader = new BufferedReader(new InputStreamReader(p.getInputStream()));
        while((line = reader.readLine()) != null) {
            System.out.print(line + "\n");
        }
        p.waitFor(); 
    }catch (IOException | InterruptedException e1) {
        e1.printStackTrace();
    }