사실 안드로이드에서 루트권한을 확인해야 하는 일이 발생하는 건 그리 좋은 경우는 아닙니다 ㅎㅎㅎ
그래도 필요할 때가 있으니 정리해 봅니다.
시스템에 'su'권한을 요청해보는 것이 가장 간단한 방법입니다.
이 방법을 쓰면 슈퍼유저 권한을 줄 거냐고 묻는 알림창이 뜨고 이후 결과에 따라 메시지가 표시됩니다.
이 방법의 단점은 루팅된사람들은 권한 요청 창이 뜨고 사용자가 루트권한을 부여하지 않으면 동작하지 않을 수 있다는 점입니다.
그냥 무작정 요청하는 겁니다!
애초에 루팅을 하지 않으면 권한을 달라는 요청 자체가 되지 않습니다.
try { //관리자 권한 요청 Runtime.getRuntime().exec("su"); //루트 } catch ( Exception ex) { //루트 아님 }
원래는 루트권한이 없으면 에러가 발생하면서 'catch' 루틴을 타게 되는데....
권한 요청 창이 떠 있는 상태에서도 루트권한이 있다고 표시됩니다.
가끔 위의 방법으로 확인이 안 되는 경우가 있는데 이럴 때는 프로세스(Process)를 이용하여 '.exec("su")'를 실행시키고 루트권한이 있어야지만 쓸 수 있는 디렉터리에 파일을 작성하고 결과를 리턴받는 방법을 사용합니다.
(참고 : Stealthcopter.com - Android: Requesting root access in your app )
try { this.m_Process = Runtime.getRuntime().exec("su"); //루트일때만 쓰기가 가능한 디렉토리 DataOutputStream dos = new DataOutputStream(this.m_Process.getOutputStream()); dos.writeBytes("echo \"Do I bave Root\" >/system/sd/temporary.txt\n"); //터미널을 닫는다. dos.writeBytes("exit\n"); dos.flush(); try { //프로세스가 종료되기를 기다렸다가... this.m_Process.waitFor(); if(255 != this.m_Process.exitValue()) { //루트 } else { //루트 아님 } } catch (Exception ex) { //루트 아님 } } catch (Exception ex) { //루트 아님 }
루팅을 하면 일반적으로 다음과 같은 파일들이 생성됩니다.
/system/bin/su
/system/xbin/su
(참고 : 어부어부님 블로그 - [안드로이드] 안드로이드 루팅 확인 및 시스템 명령 실행 방법.)
이 방법의 가장 큰 문제는 루팅할때 다른 디렉터리에 파일을 생성하면 못 찾습니다-_-;;
boolean bRoot = false; //루트 패스 String sRootPath = Environment.getExternalStorageDirectory().toString(); //루트파일 패스 String[] sRootFilesPath = new String[]{ sRootPath + "/system/bin/su" , sRootPath + "/system/xbin/su" }; File file; for (String sTemp : sRootFilesPath) { file = new File(sTemp); if( true == file.exists()) { //파일이 있다. bRoot = true; break; } } //결과는 'bRoot'에 들어 있음
루팅폰이 없어서 에뮬에서만 확인해봤습니다.
기회가 되면 루팅폰에서도 확인하고 수정하도록 하겠습니다.
안드로이드 스튜디오 프로젝트입니다.