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. 명령이 실행될 때마다, 나는 슈퍼 유저 권한 (코드의 두 번째 줄)을 찾는 결국은. 그리고 나는 이것을 버리고 싶습니다. File.txt를
    cd /sdcard  
    touch File.txt  
    

    가 아닌 '/ SDCARD'에 '/'에서 생성되어 같은
  2. 가지 경우에는
  3. 사용자가 다른 하나 개 다음에 명령을 입력,
    . 지금이 문제를 피하기 위해 현재 작업 디렉토리가 무엇인지 알아 내기 위해 모든 'cd'명령을 추적합니다. 그리고 나는 이것에 대해 더 좋은 방법이 있기를 바라고 있습니다.

누군가 나를 도와 줄 수 있다면 감사 할 것입니다.

+0

이 있나요? 또한 "su"를 제거하십시오. 사용자가 루트 priv를 필요로하는 경우, 모든 것을 루트로 실행하는 대신 터미널에서와 마찬가지로 "sudo mycommand"를 실행해야합니다. – Jack

+0

그 이유는 확실하지 않지만 응용 프로그램이 'su'없이 강제 종료됩니다. 그리고 '터미널에서와 같이 각 명령을 하나씩 실행하는 방법'에 대한 단서가 없습니다. 대체 코드를 제공해 주시겠습니까? 감사! – Vishnu

+0

사용자가 명령을 입력하고 Enter 키를 누르면 명령을 실행해야합니다. 그것은 당신이 여러 명령 또는 뭔가를 실행하는 것? – 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) 대신 출발점 사용/시스템/빈/SH으로 SU를 사용

.

추가 명령을 제공하기 위해

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

당신은 출력 스트림을 입력 스트림에 보유해야을 호출 한 후

.

명령을 실행 한 후에 "--- EOF ---"와 같은 마법 선을 에코하여 해당 행을 읽은 후 입력을 읽지 않아야합니다. 이것을 가지고 있지 않다면 InputStream 블로킹의 read 함수로 끝날 것이다.

2) 작성한 네이티브 프로세스로 데이터를 파이프합니다.이 프로세스는 데이터를 Android 애플리케이션으로 이동하기 만하면 끝 문자 나 문자열이 끝에 첨부됩니다.

어떻게해야할지 모르겠지만 본질적으로 이전 방법은 중간 사람으로 네이티브 응용 프로그램을 사용하는 것과 같습니다.

이렇게하면 작동하는 "터미널 에뮬레이터"에 가까워집니다.

3) 진정한 Ternimal 에뮬레이터를 사용하지 않으면 다음과 같은 다른 방법이 없습니다. psuedoterminal에 대한 연결을 여는 기본 응용 프로그램 사용.link

터미널 에뮬레이터는이 기술을 사용하는 오픈 소스 프로젝트입니다 :

는 여기 PTY를 여는 방법의 몇 가지 기본 정보입니다.

는보고 왜 하나가 각 명령을 실행뿐만 아니라 터미널처럼 here

관련 문제