gpt4 book ai didi

android - 从 Android 应用程序中的 busybox 命令获取输出

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:06:08 27 4
gpt4 key购买 nike

在我的一生中,我无法让我的应用程序从 su shell 中调用 busybox 的进程获得响应。

我已经尝试了三种不同的方法,也尝试了三种方法的组合来让它工作,但是我永远无法使用 busybox 从任何东西中获取输出,只能使用其余的命令。

更具体地说,我可以让它返回像 ls/datacat 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 信息行)并且没有捕获其余数据。我尝试了所有我能想到的变体来使它正常工作:/

如果有人对此有所了解,我将不胜感激:)

最佳答案

这是一个快速解决方案...这是我为此创建的实用程序类。您可以使用 native shell,如果设备已获得 root 权限,则可以使用 root shell,或者设置自定义 shell。给你。

https://github.com/jjNford/android-shell

关于android - 从 Android 应用程序中的 busybox 命令获取输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10068655/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com