关于判断手机是否已经root的方法。如果app有一些特殊功能需要root权限,则需要判断是否root。比如一些市场下载完app后自动安装。
public class Root { private static String LOG_TAG = Root. class .getName(); public boolean isDeviceRooted() { if (checkRootMethod1()){ return true ;} if (checkRootMethod2()){ return true ;} if (checkRootMethod3()){ return true ;} return false ; } public boolean checkRootMethod1(){ String buildTags = android.os.Build.TAGS; if (buildTags != null && buildTags.contains( "test-keys" )) { return true ; } return false ; } public boolean checkRootMethod2(){ try { File file = new File( "/system/app/Superuser.apk" ); if (file.exists()) { return true ; } } catch (Exception e) { } return false ; } public boolean checkRootMethod3() { if ( new ExecShell().executeCommand(SHELL_CMD.check_su_binary) != null ){ return true ; }else { return false ; } } } public class ExecShell { private static String LOG_TAG = ExecShell. class .getName(); public static enum SHELL_CMD { check_su_binary(new String[] { "/system/xbin/which" , "su" }), ; String[] command; SHELL_CMD(String[] command){ this .command = command; } } public ArrayList<String> executeCommand(SHELL_CMD shellCmd){ String line = null ; ArrayList<String> fullResponse = new ArrayList<String>(); Process localProcess = null ; try { localProcess = Runtime.getRuntime().exec(shellCmd.command); } catch (Exception e) { return null ; } BufferedWriter out = new BufferedWriter( new OutputStreamWriter(localProcess.getOutputStream())); BufferedReader in = new BufferedReader( new InputStreamReader(localProcess.getInputStream())); try { while ((line = in.readLine()) != null ) { Log.d(LOG_TAG, "--> Line received: " + line); fullResponse.add(line); } } catch (Exception e) { e.printStackTrace(); } Log.d(LOG_TAG, "--> Full response was: " + fullResponse); return fullResponse; } }
代码来自stackoverflow,向作者致敬。
方法2:
The RootTools library offers simple methods to check for root:
一个开源项目:http://code.google.com/p/roottools/
RootTools.isRootAvailable()判断是否root
RootTools.isAccessGiven()返回true那么手机已经root并且app也被授予root权限。
另外:据那片帖子的一个回贴人说使用
String commandToExecute = "su" ; executeShellCommand(commandToExecute); private boolean executeShellCommand(String command){ Process process = null ; try { process = Runtime.getRuntime().exec(command); return true ; } catch (Exception e) { return false ; } finally { if (process != null ){ try { process.destroy(); }catch (Exception e) { } } } }
会引起非常严重的性能问题,将手机系统拖的非常慢,当应用多次启动后会创建出很多个僵死的进程耗用内存。 参考http://stackoverflow.com/questions/1101380/determine-if-running-on-a-rooted-device
To sum up; I have no advice for you to determine if device is rooted or not. But if I were you I would not use Runtime.getRuntime().exec().
By the way; RootTools.isRootAvailable() causes same problem. The RootTools library offers simple methods to check for root: