사실 안드로이드에서 루트권한을 확인해야 하는 일이 발생하는 건 그리 좋은 경우는 아닙니다 ㅎㅎㅎ
그래도 필요할 때가 있으니 정리해 봅니다.
시스템에 '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'에 들어 있음
루팅폰이 없어서 에뮬에서만 확인해봤습니다.
기회가 되면 루팅폰에서도 확인하고 수정하도록 하겠습니다.
안드로이드 스튜디오 프로젝트입니다.