Por mi vida, no puedo obtener mi aplicación para obtener la respuesta de un proceso que llama a busybox desde dentro de su shell.Obtener resultados de los comandos de busybox dentro de la aplicación de Android
He intentado con tres métodos diferentes, así como he intentado una combinación de los tres para que funcione, pero nunca puedo obtener el resultado de nada usando busybox, solo el resto de los comandos. Para ser más específico, puedo conseguir que devuelva comandos como "ls/data" y "cat suchandsuch.file", pero cualquier cosa que comience con "busybox" (es decir, busybox mount, busybox gratis) simplemente no mostrará nada .
Este fue el método que tiene el más cercano para mí, este código funciona con "ls/datos", pero no "busybox libre"
Ésta sería ejecutar el comando (en su mayor parte), y el regreso una cadena vacía en lugar de un bucle sin fin desde la línea de entrada.
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();
}
El pan cerca de la parte inferior muestra todo, desde "ls/datos", pero cuando se cambia a cualquier cosa por busybox, su blanco o nulo.
También he intentado ambos, pero ninguno de ellos funcionó. (Les estaba pasando el proceso después de que se ejecutó el comando).
Ambos elementos siempre darán como resultado la congelación de la aplicación correcta cuando presiona el botón para los métodos.
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 ninguna trazas de la pila para trabajar, así que estoy empezando a tener un poco perplejo.
Editado con el código propuesto a continuación, uhm, a continuación: D Lo cambié un poco para que sea una operación de un clic para facilitar la solución de problemas y las pruebas.
Esto también se congela cuando trata de leer el inputstream, y si llamo a stdin.writeBytes ("exit \ n") antes de intentar leer la secuencia, me da la respuesta en blanco al cerrar el terminal, si lo llamo después, bucles interminablemente.
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();
}
Parece que su saltarse la primera línea (la línea de información busybox se obtiene cada vez que se invoca el comando) y no para controlar el resto de los datos. He intentado todas las variaciones que se me ocurre para conseguir este funcionamiento correcto:/
Si alguien tiene una idea de esto, yo estaría en gran medida apreciative :)
Esto es oro! ¡Gracias! –