2012-06-29 3 views
0

루팅 된 Android 기기에서 작업하고 있습니다. 기본적으로 수퍼 유저로 linux 명령을 실행합니다.

Runtime.getRuntime().exec("su") 

때마다 실행하지 않고 수퍼 유저로 실행되는 리눅스 명령을 할 수있는 방법이 있습니까? 나를 귀찮게하는 것은 수퍼 유저 권한이 앱에 부여되었다는 것을 나타낼 때마다 나타나는 토스트입니다. 처음에 su 명령을 실행하면 대화 상자가 나타나고 명령을 실행할 때마다 선택 사항을 기억하도록 선택하더라도 토스트를 얻습니다.

+0

, 일반 Linux 시스템을 사용할 때 안드로이드에 su''와 주변 연주하지만,하지를 호출 한 후 'su' 한 번, 당신이' 나머지 (터미널) 세션에 대해 수퍼 유저로 로그인합니다. 따라서 모든 애플리케이션 실행마다 'su'를 한 번만 호출하면됩니다. –

답변

1

아니요 기본 su 바이너리를 제공된 상태로 사용하는 중에는 아무런 방법이 없습니다. chainxx와 chainfire의 SU 앱에는 팝업이 없지만 사용자가 선택할 수있는 옵션이 있습니다.

물론 자신의 su 바이너리를 컴파일하고 사용할 수는 있지만 오픈 소스입니다. 이것은 공개 스 바이너리를 가지고있는 보안 문제로 남을 수 있습니다. 사용자는 아마도 이것을 좋아하지 않을 것입니다. 당신이한다면 다른 su 바이너리가 어떻게 동작 하는지를 검사하는 것과 같은 일을하고 싶을 것이다. 하지만 다시 이것은 아마도 당신이해야 할 일이 아닙니다.

+0

감사합니다. 비슷한 결론에 도달했습니다. Super SU라는 앱을 다운로드했고 언급 한 옵션이 있으며 Toast를 사용 중지 한 후에도 내 앱에서 Toast가 나타나지 않았습니다. 그렇다면이 앱이 자신의 su 바이너리를 컴파일하여이를 수행 할 수 있다고 생각하십니까? 그것은 아마도 복잡한 작업과 내 애플 리케이션의 초점 밖으로 방법입니다 확실히 그것을하고 싶지 않아 :) –

2

실행하려는 항목과 빈도가 확실하지 않습니다. 그러나 OutputStream에서 둘 이상의 명령을 실행할 수 있으므로 명령을 배열이나 그와 비슷한 것으로 큐에 넣을 수 있습니다.

public void runCommandsAsRoot(String[] cmds) throws IOException { 
    Process proc = Runtime.getRuntime().exec("su"); 

    DataOutputStream oStream = new DataOutputStream(proc.getOutputStream()); 

    for (String cmd : cmds) { 
     oStream.writeBytes(cmd + "\n"); 
    } 

    oStream.writeBytes("exit\n"); 
    oStream.flush(); 
} 

다음과 같이 그것을 호출 :

String[] commands = { "fistCommand", "secondCommand" }; 
runCommandsAsRoot(commands); 
+0

네, 덕분이 유용 할 수도 있습니다. 필자의 유스 케이스에서는 항상 프로세스를 계속 실행하고 몇 시간에 한 번씩 몇 가지 명령을 실행해야한다. 그래서 내가 생각하고있는 것은 전화 시작시 proc을 열어 사용자가 Toast를 한 번만보고 필요할 때 명령을 실행하고 계속 실행하도록하는 것입니다. 이 접근 방식의 단점에 대해 생각할 수 있습니까? –

+0

응용 프로그램이 일시 중지되었거나 Android에서 메모리가 부족하여 응용 프로그램에서 일부를 재활용 할 때이 프로세스에서 어떤 일이 일어나는지 생각해 봐야합니다. 나는. 예외를 피하기 위해 null 일 때 프로세스에 액세스하려고하지 마십시오. 프로세스가 메모리 누출이 일어나기 쉽지만 알아낼 수있는 방법은 하나뿐입니다. – Cheesebaron

관련 문제