android - movil - terminal emulator para que sirve
Construyendo un emulador de terminal para Android (2)
He estado intentando construir un emulador de terminal para Android. Siendo bastante nuevo en esto, mi idea era ejecutar cada comando y almacenar el resultado en un archivo, cuyos contenidos se mostrarían después de cada ejecución. Pseudo Código:
public Boolean execCommands(String command) {
try {
rt = Runtime.getRuntime();
process = rt.exec("su");
DataOutputStream os = new DataOutputStream(process.getOutputStream());
os.writeBytes("echo $ /""+command+ "/" >> /sdcard/Android/data/terminalemulatorlog.txt/n/n/n");
/**** Note : String command = (EditText)findViewById(R.id.command).getText().toString(); ****/
os.flush();
os.writeBytes("exit/n");
os.flush();
process.waitFor();
}
// Error Handling
displayOutput(); //Loads and displays the Text File (/sdcard/Android/data/terminalemulatorlog.txt)
return true;
}
Este código funciona a excepción de unos pocos comandos especiales (por ejemplo, ''borrar''). Pero lo que más me preocupa son los siguientes problemas:
- Cada vez que se ejecuta un comando, termino buscando permisos SuperUser (segunda línea de código). Y me gustaría terminar con esto.
En los casos en que el usuario ingresa un comando seguido de otro,
Como :cd /sdcard touch File.txt
File.txt se crea en ''/'' y no en ''/ sdcard''. A partir de ahora para evitar esto, estoy haciendo un seguimiento de todos los comandos ''cd'' para descubrir cuál es el directorio de trabajo actual. Y espero que haya una mejor manera de evitar esto.
Estaría agradecido si alguien pudiera ayudarme aquí.
Esto es un poco tarde, pero aquí hay algunas maneras de hacerlo.
1)
En lugar de usar su como punto de partida use / system / bin / sh.
y después de llamar
rt.exec("/system/bin/sh");
Debes mantener el flujo de salida y el flujo de entrada para dar más comandos.
Después de emitir un comando, debe hacer eco de una línea mágica como "--- EOF ---" y dejar de leer la entrada después de leer esa línea. Si no tiene esto, terminará con la función de lectura del bloqueo de InputStream.
2) Transfiera los datos a un proceso nativo que haya escrito que simplemente transfiera los datos a su Aplicación de Android con un carácter de terminación o una cadena adjunta al final.
No estoy del todo seguro de cómo hacer esto, pero es esencialmente el mismo que el método anterior solo confía en su aplicación nativa como intermediario.
Esto lo acercará a un "Emulador de terminal" que funcione.
3) Si no quieres un Emulador de Ternimal real, entonces no hay otra manera de hacerlo que: usando una aplicación nativa que abre una conexión a un psuedoterminal.
Aquí hay información básica sobre cómo abrir un pty: enlace
Terminal Emulator es un proyecto de código abierto que utiliza esta técnica.
Echa un vistazo aquí
No estoy seguro de si todavía necesita esto o no, pero así es como estoy emitiendo múltiples comandos a la vez y no usando "su" para que se ejecuten.
try {
String[] commands = {
"dumpstate > /sdcard/LogFiles/dumpstate.txt",
"dumpsys > /sdcard/LogFiles/dumpsys.txt",
"logcat -d > /sdcard/LogFiles/log.txt",
"cat /sdcard/LogFiles/dumpstate.txt /sdcard/LogFiles/dumpsys.txt /sdcard/LogFiles/log.txt > /sdcard/LogFiles/bugreport.rtf" };
Process p = Runtime.getRuntime().exec("/system/bin/sh -");
DataOutputStream os = new DataOutputStream(p.getOutputStream());
for (String tmpCmd : commands) {
os.writeBytes(tmpCmd + "/n");
}
} catch (IOException e) {
e.printStackTrace();
}