Für das Leben von mir kann ich nicht meine App bekommen, die Antwort von einem Prozess zu erhalten, der innerhalb von su-Shell busybox anruft.Ausgabe von Busybox-Befehlen innerhalb der Android-App
Ich habe versucht, drei verschiedene Methoden, sowie eine Kombination der drei, um es zur Arbeit zu bekommen, aber ich kann nie die Ausgabe von irgendetwas mit busybox, nur den Rest der Befehle.
Um genauer zu sein, kann ich es Befehle wie "ls/data" und "cat suchandsuch.file" zurückgeben, aber alles, was mit "busybox" beginnt (dh busybox mount, busybox free) zeigt einfach nichts .
Das war die Methode, die am nächsten bei mir hätte, funktioniert dieser Code mit „ls/data“, aber nicht „busybox frei“
Dieser den Befehl laufen würde (zum größten Teil), und Rückkehr eine leere Zeichenfolge anstelle einer Schleife endlos aus dem Eingangsstrom.
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();
}
Der Toast am unteren Rand zeigt alles von „ls/data“, aber wenn sie etwas für Busybox, dessen leer oder null geändert.
Ich habe auch beide versucht, aber keiner von ihnen funktioniert. (Ich habe den Prozess an sie weitergegeben, nachdem der Befehl ausgeführt wurde.)
Beides würde immer dazu führen, dass die App sofort einfriert, wenn Sie den Knopf für die Methoden drücken.
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;
}
Theres keine Stack-Spuren zu arbeiten, so dass ich ein wenig ratlos bin.
Bearbeitet mit dem unten vorgeschlagenen Code, uh, unten: D Ich änderte es um ein kleines bisschen, um es zu einem Oneclick-Lauf-Ding für eine einfachere Fehlersuche und Tests zu machen.
Das friert auch ein, wenn es versucht, den Eingangsstrom zu lesen, und wenn ich stdin.writeBytes ("exit \ n") vor dem Lesen des Streams aufrufen, gibt es mir die leere Antwort vom Schließen des Terminals, wenn ich es anrufe Danach schleift es endlos.
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();
}
Es scheint, wie seine in der ersten Zeile (die Busybox Infozeile Sie jedes Mal wenn Sie den Befehl aufrufen, erhalten) und nicht Überspringen der Rest der Daten zu kontrollieren. Ive versucht, alle Variationen ich denken kann dies zum Laufen zu bringen rechts:/
Wenn jemand auf diese einen Einblick bekam ist, ich stark apreciative würde :)
Das ist Gold! Vielen Dank! –