欢迎访问移动开发之家(rcyd.net),关注移动开发教程。移动开发之家  移动开发问答|  每日更新
页面位置 : > > 内容正文

android判断手机是否root,android判断root

来源: 开发者 投稿于  被查看 42790 次 评论:235

android判断手机是否root,android判断root


关于判断手机是否已经root的方法。如果app有一些特殊功能需要root权限,则需要判断是否root。比如一些市场下载完app后自动安装。

/**
 * @author Kevin Kowalewski
 * 
 */
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;
        }
    }
}


/**
 * @author Kevin Kowalewski
 *
 */
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;
            //e.printStackTrace();
        }

        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:




Android中判断手机是不是已经Root 详细??

本人博客原文在Android 中,虽然我们可以通过Runtime.getRuntime().exec( su )的方式来判断一个手机是否Root,但是该方式会弹出对话框让用户选择是否赋予该应用程序Root 权限,有点不友好。其实我们可以在环境变量$PATH 所列出的所有目录中查找是否有su文件来判断一个手机是否Root。当然即使有su 文件,也并不能完全表示手机已经Root,但是实际使用中作为一个初略的判断已经很好了。另外出于效率的考虑,我们可以在代码中直接把$PATH 写死。实例1privatefinalstaticintkSystemRootStateUnknow=-1;privatefinalstaticintkSystemRootStateDisable=0;privatefinalstaticintkSystemRootStateEnable=1;privatestaticintsystemRootState=kSystemRootStateUnknow;publicstaticbooleanisRootSystem(){if(systemRootState==kSystemRootStateEnable){returntrue;}elseif(systemRootState==kSystemRootStateDisable){returnfalse;}Filef=null;finalStringkSuSearchPaths[]={/system/bin/,/system/xbin/,/system/sbin/,/sbin/,/vendor/bin/};try{for(inti=0;ikSuSearchPaths.length;i++){f=newFile(kSuSearchPaths[i]+su);if(f!=nullf.exists()){systemRootState=kSystemRootStateEnable;returntrue;}}}catch(Exceptione){}systemRootState=kSystemRootStateDisable;returnfalse;}结束!2 楼hudashi 昨天 17:10的方法。首先你那个方法要去执行shell 脚本,而且返回值各个手机也许还不一样。
 

Android中判断手机是不是已经Root 详细??

Android 中判断手机是否已经Root
本人博客原文
在Android 中,虽然我们可以通过
Runtime.getRuntime().exec( su )
的方式来判断一个手机是否Root,
但是该方式会弹出对话框让用户选择是否赋予该应用程序Root 权限,有点不友好。
其实我们可以在环境变量$PATH 所列出的所有目录中查找是否有su文件来判断一个手机是否Root。
当然即使有su 文件,也并不能完全表示手机已经Root,但是实际使用中作为一个初略的
判断已经很好了。
另外出于效率的考虑,我们可以在代码中直接把$PATH 写死。实例1privatefinalstaticintkSystemRootStateUnknow=-1;privatefinalstaticintkSystemRootStateDisable=0;privatefinalstaticintkSystemRootStateEnable=1;privatestaticintsystemRootState=kSystemRootStateUnknow;publicstaticbooleanisRootSystem(){if(systemRootState==kSystemRootStateEnable){returntrue;}elseif(systemRootState==kSystemRootStateDisable){returnfalse;}Filef=null;finalStringkSuSearchPaths[]={/system/bin/,
/system/xbin/,
/system/sbin/,
/sbin/,
/vendor/bin/};try{for(inti=0;i
kSuSearchPaths.
length;i++){f=newFile(kSuSearchPaths[i]+su);if(f!=nullf.
exists()){
systemRootState=kSystemRootStateEnable;returntrue;}}}catch(Exceptione){}
systemRootState=kSystemRootStateDisable;returnfalse;}结束!2 楼hudashi 昨天 17:10
的方法。首先你那个方法要去执行shell 脚本,而且返回值各个手机也许还不一样。Re:hudashi 昨天 17:12
 

相关频道:

用户评论