출처: http://lsit81.tistory.com/entry/Android-루팅-여부-확인하기
안드로이드 루팅은 아래 코드를 실행해 봄으로써 루팅 여부를 알 수 있습니다.
1 2 3 4 5 6 | try { Runtime.getRuntime().exec( "su" ); } catch ( Exception e) { // 루팅 안되있으면 Exception Log.d( "test" , "rooting X" ); } |
위에서 보시는 것과 같이 루팅이 되어있다면 정상 작동하고, 루팅이 되어있지 않다면 Exception이
떨어집니다. 왜냐하면 su 는 시스템의 root 권한을 얻는 명령인데, 루팅된 폰에서 실행되기 때문입니다.
그러나 일부 루팅 프로그램에서는 "최고 권한"을 얻는 su 명령이 안 먹도록 되기도 합니다.
이럴때는 system/bin/su 혹은 system/xbin/su Path 가 있는지 확인하면 되겠습니다.
만약 루팅 프로그램이 이 su 명령 자체도 바꾸어 버린다면 (위치를 바꾸거나 이름을 바꾸면)
대략 난감한 상황이 되는데, 이럴때는 뭐 폰 제조사에서 루팅 체크하는 특별한 루틴을 넣어서 확인하도록
하는 방법을 강구해봐야겠습니다.
현재 대부분의 금융어플이나 뱅킹어플등에서는 아래의 4개의 파일 Path 여부를 체크해서 루팅 여부를
판단하고 있는데요. 루팅을 한 폰으로는 이러한 금융 어플들을 사용할 수 없기 때문에 ,
루트익스플로러를 사용해서 아래 파일을 삭제하시면 됩니다.
대부분 감지하는 어플이 아래 데이타 파일이 있는지 검사하는게 일반적입니다.
/system/bin/su
/system/xbin/su
/system/app/superuser.apk
/data/data/com.noshufou.android.su
아래 코드는 위 4가지 "최고 권한"을 얻는 프로그램까지 체크 하는 최종 소스 코드 입니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | public static final String ROOT_PATH = Environment.getExternalStorageDirectory() + "" ; public static final String ROOTING_PATH_1 = "/system/bin/su" ; public static final String ROOTING_PATH_2 = "/system/xbin/su" ; public static final String ROOTING_PATH_3 = "/system/app/SuperUser.apk" ; public static final String ROOTING_PATH_4 = "/data/data/com.noshufou.android.su" ; public static String[] RootFilesPath = new String[]{ ROOT_PATH + ROOTING_PATH_1 , ROOT_PATH + ROOTING_PATH_2 , ROOT_PATH + ROOTING_PATH_3 , ROOT_PATH + ROOTING_PATH_4 }; /** * 루팅된 디바이스인지 체크. * * @return */ private static boolean checkRootingDevice() { boolean isRootingFlag = false ; try { Process process = Runtime.getRuntime().exec( "find / -name su" ); BufferedReader reader = new BufferedReader( new InputStreamReader(process.getInputStream())); if (reader.ready() == false ) { return false ; } String result = reader.readLine(); if (result.contains( "/su" ) == true ) { isRootingFlag = true ; } } catch ( Exception e) { isRootingFlag = false ; } if (!isRootingFlag) { isRootingFlag = checkRootingFiles(RootFilesPath); } return isRootingFlag; } /** * 루팅 파일이 존재하는지 체크. * * @param file * @return */ private static boolean checkRootingFiles(String[] filePaths) { boolean result = false ; File file; for (String path : filePaths) { file = new File(path); if (file != null && file.exists() && file.isFile()) { result = true ; break ; } else { result = false ; } } return result; } |
* 출처 : http://arabiannight.tistory.com/64
'IT_Programming > Android_Java' 카테고리의 다른 글
Android 확장(추가) SDCard 경로 얻기. (0) | 2013.07.16 |
---|---|
Android JellyBean에서 사라진 setEmbeddedTitleBar 해결 방법 (0) | 2013.07.16 |
마켓 호출시 android.content.ActivityNotFoundException 문제. (0) | 2013.07.16 |
루팅 여부 판별! Runtime.getRuntime().exec() 주의 (0) | 2013.07.16 |
Android Camera Picture Size 선택 방법. (0) | 2013.07.16 |