안드로이드 디바이스 루팅 여부 확인하기

종종 안드로이드 폰의 루팅 여부를 체크해야 하는 상황이 있다.

다음과 같은 함수를 사용하면 루팅된 경우 true 값을 돌려받는다.

fun isDeviceRooted(): Boolean {
    val buildTags = android.os.Build.TAGS
    if (buildTags != null && buildTags.contains("test-keys")) {
        return true
    }

    try {
        val file = File("/system/app/Superuser.apk")
        if (file.exists()) {
            return true
        }
    } catch (e: Exception) {
    }

    val rootBinaryPaths = arrayOf(
        "/sbin/su", "/system/bin/su", "/system/xbin/su", "/system/sd/xbin/su",
        "/system/bin/failsafe/su", "/data/local/su", "/su/bin/su"
    )
    for (path in rootBinaryPaths) {
        try {
            val file = File(path)
            if (file.exists()) {
                return true
            }
        } catch (e: Exception) {
        }
    }

    return false
}


AVD 종류에 따른 루팅 판단 결과

안드로이드 스튜디오에서 사용하는 에뮬레이터는 루팅이 되어있을까 안 되어있을까.

정답은 ‘만들기 나름’이다.

대부분의 케이스에서 에뮬레이터는 루팅이 기본적으로 된 상황이라고 판단한다. 다만, 플레이스토어가 포함된 하드웨어를 고르고, 구글 플레이가 포함된 타겟을 고르면 루팅이 되지 않는다.

안드로이드 스튜디오에서 Device Manager를 통해 새 디바이스를 만들 때, Hardware에서 플레이스토어가 포함된 디바이스를 선택할 수 있다.



만약 플레이스토어가 포함되지 않은 하드웨어를 고르면, Google Play가 포함된 타겟을 선택할 수 없다. (Google API, Open Source만 선택 가능)

플레이스토어를 포함한 후에는 Google Play를 타겟으로 하는 System Image를 고를 수 있다.

  • 하드웨어 스토어O / 구글 api → 루팅 O
  • 하드웨어 스토어O / 구글 play → 루팅 X
  • 하드웨어 스토어O / open source → 루팅 O

  • 하드웨어 스토어X / 구글 api → 루팅 O
  • 하드웨어 스토어X / open source → 루팅 O

물론, 이건 어디까지나 아무 작업 없이 에뮬레이터를 생성했을 때의 상태이고 adb를 통한다면 충분히 다른 설정도 가능할 것이다.


타사 에뮬레이터 루팅 작동

그렇다면 흔히 게임 등에 메이저하게 쓰이는 에뮬레이터의 기본 루팅 여부는 어떻게 되어있을까. 서비스마다 각각 달랐으나, 설정 메뉴 or 커맨드로 대부분 쉽게 루팅이 가능하다.

  • 블루스택: 디폴트 루팅 X

  • ld player, Nox player: 디폴트 루팅 X, 설정에서 변경 가능

  • GenyMotion: 디폴트 루팅 O

구글링으로 에뮬레이터 루팅하는 방법을 치면 너무나 많은 사람들이 상세하고 친절하게 안내해주고 있다. 실제 디바이스에 비해 에뮬레이터 루팅하기는 사실 크게 어려운 것 같진 않다. 그러니 자신 또는 회사에서 제공하는 서비스가 부정적인 방향으로 쓰일까 걱정이 된다면 루팅 여부를 판단해 앱을 종료하는 식의 처리를 해주어야 편-안- 할 것이다.