프로그래밍/Java, Android

[Android] 루트권한 확인

당근천국 2015. 7. 30. 15:00

사실 안드로이드에서 루트권한을 확인해야 하는 일이 발생하는 건 그리 좋은 경우는 아닙니다 ㅎㅎㅎ

그래도 필요할 때가 있으니 정리해 봅니다.

 

1. 일반적인 방법

시스템에 'su'권한을 요청해보는 것이 가장 간단한 방법입니다.

이 방법을 쓰면 슈퍼유저 권한을 줄 거냐고 묻는 알림창이 뜨고 이후 결과에 따라 메시지가 표시됩니다.

 

이 방법의 단점은 루팅된사람들은 권한 요청 창이 뜨고 사용자가 루트권한을 부여하지 않으면 동작하지 않을 수 있다는 점입니다.

1-1. 간단한 방법

그냥 무작정 요청하는 겁니다!

애초에 루팅을 하지 않으면 권한을 달라는 요청 자체가 되지 않습니다.

try
{
    //관리자 권한 요청
    Runtime.getRuntime().exec("su");
    //루트
}
catch ( Exception ex)
{
    //루트 아님
}

 

 

원래는 루트권한이 없으면 에러가 발생하면서 'catch' 루틴을 타게 되는데....

권한 요청 창이 떠 있는 상태에서도 루트권한이 있다고 표시됩니다.

 

 

 

 

 

1-2. 응용 방법

가끔 위의 방법으로 확인이 안 되는 경우가 있는데 이럴 때는 프로세스(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)
{
    //루트 아님
}

 

 

2. 루팅 파일을 찾는 방법

 

루팅을 하면 일반적으로 다음과 같은 파일들이 생성됩니다.

 

/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'에 들어 있음

 

 

 

마무리

루팅폰이 없어서 에뮬에서만 확인해봤습니다.

기회가 되면 루팅폰에서도 확인하고 수정하도록 하겠습니다.

 

안드로이드 스튜디오 프로젝트입니다.

 

RootTest2.zip