我想要一个java程序来执行以下shell命令:
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 / path / to / a / new / folder
没有问题。
我使用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 命令。
答案 0 :(得分: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();
}
}
}
答案 1 :(得分: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