2011-12-29 3 views
2

Я пытался создать эмулятор терминала для Android. Будучи совершенно новым в этом, я решил выполнить каждую команду и сохранить вывод в файле, содержимое которого будет отображаться после каждого исполнения. Псевдо Код:Создание терминального эмулятора для 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. Каждый раз, когда команда должна быть выполнена, я в конечном итоге ищет разрешения суперпользователем (вторая строка кода). И я хотел бы покончить с этим.
  2. В тех случаях, когда пользователь вводит одну команду, за которой следует другой,
    Такие, как:

    cd /sdcard  
    touch File.txt  
    

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

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

+0

Почему бы не выполнить каждую команду по одному так же, как в терминале? Также просто избавьтесь от «su». Если пользователю нужны корневые привилегии, они должны выполнить команду «sudo mycommand» так же, как в терминале, вместо того, чтобы заставить все выполнять как root. – Jack

+0

Я не уверен, почему, но сила приложения закрывается без «su». И я не знаю, как «выполнять каждую команду один за другим, как в терминале». Не могли бы вы предоставить альтернативный код? Благодаря! – Vishnu

+0

Когда пользователь вводит команду и нажимает клавишу ввода, вы должны выполнить команду. Кажется, вы выполняете несколько команд или что-то еще? – Jack

ответ

2

Не уверен, что вы все еще нуждаетесь в этом или нет, но вот как я выдаю несколько команд за один раз и не использую «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

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

1)

Вместо того чтобы использовать су в качестве отправной точки использования/системы/бен/ш.

и после вызова

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

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

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

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

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

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

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

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

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

Посмотрите here

Смежные вопросы