Создание эмулятора терминала для Android - PullRequest
2 голосов
/ 30 декабря 2011

Я пытался создать эмулятор терминала для Android. Будучи довольно новым для этого, я хотел выполнить каждую команду и сохранить результаты в файле, содержимое которого будет отображаться после каждого выполнения. Псевдокод:

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;
        }

Этот фрагмент кода работает, за исключением нескольких специальных команд (например, «очистить»). Но меня больше всего волнуют следующие проблемы:

  1. Каждый раз, когда должна выполняться команда, я в конечном итоге ищу разрешения SuperUser (вторая строка кода). И я бы хотел покончить с этим.
  2. В случаях, когда пользователь вводит одну команду, а затем другую,
    Такие как:

    cd /sdcard    
    touch File.txt    
    

    Файл File.txt создается в «/», а не в «/ sdcard». На данный момент, чтобы избежать этого, я отслеживаю все команды 'cd', чтобы выяснить, каков текущий рабочий каталог. И я надеюсь, что есть лучший способ обойти это.

Буду признателен, если кто-нибудь поможет мне здесь.

Ответы [ 2 ]

2 голосов
/ 02 февраля 2012

Не уверен, если вам все еще нужно это, или нет, но вот как я выполняю несколько команд одновременно и не использую "su" для их запуска.

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();
}
1 голос
/ 23 октября 2012

Это немного поздно, но здесь есть несколько способов сделать это.

1)

Вместо использования su в качестве отправной точки используйте /system/bin/sh.

и после звонка

rt.exec("/system/bin/sh");

Вы должны удерживать Выходной поток и Входной поток, чтобы давать дальнейшие команды.

После того, как вы выполнили команду, вы должны повторить магическую строку типа "--- EOF ---" и прекратить чтение ввода после чтения этой строки. Если у вас этого нет, вы получите функцию чтения из блокировки InputStream.

2) Передайте данные в собственный процесс, который вы написали, который просто перемещает данные в ваше приложение Android с завершающим символом или строкой, прикрепленной к концу.

Я не совсем уверен, как это сделать, но по сути он такой же, как и предыдущий метод, который опирается на ваше нативное приложение в качестве посредника.

Это приблизит вас к функционирующему «Эмулятору терминала».

3) Если вы не хотите настоящего Ternimal Emulator, то нет другого способа сделать это, кроме как: использовать собственное приложение, которое открывает соединение с псевдотерминалом.

Вот некоторые основные сведения о том, как открыть pty: ссылка

Terminal Emulator - проект с открытым исходным кодом, использующий эту технику.

Взгляните здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...