2013-02-08 8 views
0

일부 루트 명령을 실행해야하는 앱이 있습니다. SuperSU 버전은 1.04입니다. Su 버전은 1.02입니다. Android 4.1.1. 기기가 Samsung Galaxy S3입니다.SuperSU에서 권한 확인을 얻을 수 없습니다.

문제는 SuperSU에서 권한 요청을받을 수 없다는 것입니다. 많은 것들을 시도했지만 프롬프트가 표시되지 않습니다.

RootChecker basic, ADB 및 기타 앱에 표시됩니다. 내 절차가 있습니다. 어쩌면 내가 잘못하고있는 것일 수도 있습니다.

private static String runShellCommand(String command) { 
    DataOutputStream os = null; 
    Process process = null; 
    try { 
     String [] env = {"PATH=/sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin"}; 
     process = Runtime.getRuntime().exec("su", env, Environment.getExternalStorageDirectory()); 
     os = new DataOutputStream(process.getOutputStream()); 

     InputStreamHandler err = new InputStreamHandler(process.getErrorStream(), false); 
     InputStreamHandler out = new InputStreamHandler(process.getInputStream(), false); 

     os.writeBytes(command + "\n"); 
     os.flush(); 

     os.writeBytes(EXIT); 
     os.flush(); 
     os.close(); 
     Log.d(LOGTAG, "Waiting on: " + process.waitFor()); 

     String errOut = err.getOutput(); 
     String stdOut = out.getOutput(); 

     Log.d(LOGTAG, "Exit code: " + process.exitValue()); 
     Log.d(LOGTAG, command + " erroutput: [" + errOut + "]"); 
     Log.d(LOGTAG, command + " output: [" + stdOut + "]"); 
     if (errOut != null && !errOut.equals("")) 
      return errOut; 
     else if (stdOut != null&& !stdOut.equals("")) 
      return stdOut; 
     else 
      return null; 
    } catch (Exception e) { 
     Log.e(LOGTAG, "runShellCommand error: ", e); 
     return null; 
    } finally { 
     try { 
      if (os != null) { 
       os.close(); 
      } 
      if (process != null) { 
       Log.d(LOGTAG, "Exit val: " + process.exitValue()); 
       process.destroy(); 
      } 
     } catch (Exception ignored) {} 
    } 
} 

의 InputStream 핸들러는 다음과 같습니다

private static class InputStreamHandler extends Thread { 
    private final InputStream stream; 
    private final boolean devNull; 
    StringBuffer output; 

    public String getOutput() { 
     return output.toString(); 
    } 

    InputStreamHandler(InputStream stream, boolean devNull) { 
     this.devNull = devNull; 
     this.stream = stream; 
     output = new StringBuffer(); 
     start(); 
    } 

    @Override 
    public void run() { 
     try { 
      if (devNull) { 
       while (stream.read() != -1) {} 
      } else { 
       BufferedReader br = new BufferedReader(new InputStreamReader(stream)); 
       while (true) { 
        String line = br.readLine(); 
        if (line == null) { 
         Log.d(LOGTAG, "Ended with reading!"); 
         br.close(); 
         return; 
        } 
        output.append(line); 
       } 
      } 
     } catch (IOException ignored) { 
      Log.e(LOGTAG, "Error", ignored); 
     } 
    } 
} 

사람은 그것이 권한 창을 표시하지 않도록 차단 않는 이유 아이디어가? 감사합니다. .

+0

stderr 및 stdout의 출력은 무엇입니까? –

+0

출력이 없습니다. SuperSU에서 su를 실행하는 것에 대한 허가를받지 못했습니다. –

+0

Odd. SuperSU에서 데이터를 삭제하거나 수퍼 유저를 사용하여 문제의 범위를 좁혀보십시오. –

답변

0

나는 그것을 마침내 발견했습니다. 트릭은 프로세스를 생성하는 것입니다 (다른 스레드에서 Runtime.getRuntime(). exec ("su");)를 개별적으로 실행하십시오. 왜 이것이 작동하는지 모르겠지만, 그렇지 않습니다. 비슷한 방식으로 RootTools에서 사용됩니다. 이것은 내 문제를 해결했습니다.

0

왜 이것이 작동하지 않을지 정확히 알 수 없습니다. 이상하게 여기는 첫 번째 것은 Environment.getExternalStorageDirectory()exec으로 전달하는 것입니다. 어쩌면이 (경로)가 허용되지 않습니다 (에서 실행)?

특별히이 작업을 수행하기 위해 특별히 작성된 libsuperuser을 사용하지 않는 이유는 무엇입니까? 그것은 오픈 소스이며, 작고, 완전히 주석이 달려 있고, 예제 프로젝트를 가지고 있으며 심지어 아주 조작을 시도 할 때 발생할 수있는 document detailing the common problems조차 있습니다.

+1

Process.getRuntime(). exec ("su")를 사용하더라도 권한을 묻지 않고 블록합니다. –

+0

libsuperuser를 사용하여이 작업을 수행 할 것입니다. 감사. –

+0

전혀 도움이되지 않습니다. 귀하의 코드는 내 코드와 유사합니다. 문제는 여전히 해결되지 않습니다. –