对于我的一生,我无法让我的应用程序从 su shell 中调用busybox的进程中获取响应。
我尝试了三种不同的方法,也尝试了这三种方法的组合以使其工作,但我永远无法使用busybox从任何东西中获得输出,只有其余的命令。
更具体地说,我可以让它返回和之类的命令ls /data
,cat suchandsuch.file
但是任何以“busybox”开头的东西(即busybox mount,busybox free)都不会显示任何内容。
这是对我来说最接近的方法,此代码适用于ls /data
,但不是“busybox free”
这将运行命令(大部分),并返回一个空字符串,而不是从输入流中无休止地循环。
Process p;
try {
p = Runtime.getRuntime().exec(new String[]{"su", "-c", "/system/bin/sh"});
DataOutputStream stdin = new DataOutputStream(p.getOutputStream());
stdin.writeBytes("ls /data\n");
DataInputStream stdout = new DataInputStream(p.getInputStream());
byte[] buffer = new byte[4096];
int read = 0;
String out = new String();
while(true){
read = stdout.read(buffer);
out += new String(buffer, 0, read);
if(read<4096){
break;
}
}
Toast.makeText(getApplicationContext(), out, Toast.LENGTH_SHORT).show();
} catch (IOException e) {
e.printStackTrace();
}
底部附近的 toast 显示从 开始的所有内容ls /data
,但是当更改为 busybox 的任何内容时,它的空白或 null。
我也尝试过这两种方法,但都没有奏效。(我在命令运行后将进程传递给他们。)
当您点击方法的按钮时,这两种方法总是会导致应用程序冻结。
String termReader(Process process){
BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
try {
int i;
char[] buffer = new char[4096];
StringBuffer output = new StringBuffer();
while ((i = reader.read(buffer)) > 0)
output.append(buffer, 0, i);
reader.close();
return output.toString();
} catch (IOException e) {
e.printStackTrace();
return e.getMessage();
}
}
String processReader(Process process){
InputStream stdout = process.getInputStream();
byte[] buffer = new byte[1024];
int read;
String out = new String();
while(true){
try {
read = stdout.read(buffer);
out += new String(buffer, 0, read);
if(read<1024){
break;
}
} catch (IOException e) {
e.printStackTrace();
}
}
return out;
}
没有堆栈跟踪可以使用,所以我开始有点难过。
使用下面提出的代码进行编辑,嗯,下面 :D 我对其进行了一些更改,使其成为一键运行的东西,以便于故障排除和测试。
当它尝试读取输入流时,它也会冻结,如果我stdin.writeBytes("exit\n")
在尝试读取流之前调用它会给我关闭终端的空白答案,如果我在之后调用它,它会无限循环。
void Run() {
String command = "busybox traceroute\n";
StringBuffer theRun = null;
try {
Process process = Runtime.getRuntime().exec("su");
DataOutputStream stdin = new DataOutputStream(process.getOutputStream());
stdin.writeBytes(command);
BufferedReader reader = new BufferedReader(
new InputStreamReader(process.getInputStream()));
int read;
char[] buffer = new char[4096];
StringBuffer output = new StringBuffer();
while ((read = reader.read(buffer)) > 0) {
theRun = output.append(buffer, 0, read);
}
reader.close();
process.waitFor();
} catch (IOException e) {
throw new RuntimeException(e);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
Toast.makeText(getApplicationContext(), theRun, Toast.LENGTH_SHORT).show();
}
似乎它跳过了第一行(每次调用命令时都会得到的busybox信息行)并且没有捕获其余数据。我已经尝试了所有我能想到的变体来让它正常工作:/
如果有人对此有所了解,我将不胜感激:)