确定是否在根设备上运行

我的应用程序具有某些功能,只能在root可用的设备上使用。 当使用这个功能(并向用户显示一个合适的错误信息)时,而不是让这个功能失效,我宁愿有一种能力来静静地检查root是否可用,如果不是,首先隐藏相应的选项。

有没有办法做到这一点?


这里有一个类将检查Root的三种方法之一。

/** @author Kevin Kowalewski */
public class RootUtil {
    public static boolean isDeviceRooted() {
        return checkRootMethod1() || checkRootMethod2() || checkRootMethod3();
    }

    private static boolean checkRootMethod1() {
        String buildTags = android.os.Build.TAGS;
        return buildTags != null && buildTags.contains("test-keys");
    }

    private static boolean checkRootMethod2() {
        String[] paths = { "/system/app/Superuser.apk", "/sbin/su", "/system/bin/su", "/system/xbin/su", "/data/local/xbin/su", "/data/local/bin/su", "/system/sd/xbin/su",
                "/system/bin/failsafe/su", "/data/local/su", "/su/bin/su"};
        for (String path : paths) {
            if (new File(path).exists()) return true;
        }
        return false;
    }

    private static boolean checkRootMethod3() {
        Process process = null;
        try {
            process = Runtime.getRuntime().exec(new String[] { "/system/xbin/which", "su" });
            BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
            if (in.readLine() != null) return true;
            return false;
        } catch (Throwable t) {
            return false;
        } finally {
            if (process != null) process.destroy();
        }
    }
}

RootTools库提供了简单的方法来检查根目录:

RootTools.isRootAvailable()

参考


在我的应用程序中,我正在通过执行“su”命令来检查设备是否生根。 但是今天我删除了这部分代码。 为什么?

因为我的应用程序成了记忆杀手。 怎么样? 让我告诉你我的故事。

有人抱怨说,我的应用程序正在放慢设备(当然,我认为这不可能是真的)。 我试图找出原因。 所以我使用MAT来获得堆转储和分析,并且一切看起来都很完美。 但在重新启动我的应用多次后,我意识到该设备真的变慢了,停止我的应用程序并没有让它更快(除非我重新启动设备)。 当设备非常慢时,我再次分析转储文件。 但是对于转储文件来说,一切都是完美的 然后,我做了一些必须要做的事情。 我列出了流程。

$ adb shell ps

Surprize; 我的应用程序有很多流程(我的应用程序的流程标签位于清单)。 其中一些是僵尸,其中一些不是。

通过一个具有单个Activity且仅执行“su”命令的示例应用程序,我意识到每次启动应用程序时都会创建一个僵尸进程。 起初,这些僵尸分配0KB,但比事情发生和僵尸进程持有几乎相同的知识产权作为我的应用程序的主要过程,他们成为标准过程。

在bugs.sun.com上有一个同样问题的bug报告:http://bugs.sun.com/view_bug.do?bug_id=6474073这解释了是否找不到命令僵尸将使用exec()方法创建。 但我仍然不明白他们为什么以及如何成为标准流程并拥有重要的知识库。 (这不会一直发生)

如果你想要下面的代码示例,你可以尝试一下;

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) {
            }
        }
    }
}

总结一下; 我没有任何建议可以确定设备是否已植根。 但如果我是你,我不会使用Runtime.getRuntime()。exec()。

顺便一提; RootTools.isRootAvailable()会导致同样的问题。

链接地址: http://www.djcxy.com/p/4207.html

上一篇: Determine if running on a rooted device

下一篇: How to get the Android device's primary e