iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >Android如何判断是否Root
  • 307
分享到

Android如何判断是否Root

2023-06-28 23:06:26 307人浏览 独家记忆
摘要

这篇文章主要为大家展示了“Android如何判断是否Root”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Android如何判断是否Root”这篇文章吧。为了照顾那些着急的同学,先直接给出结论:

这篇文章主要为大家展示了“Android如何判断是否Root”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Android如何判断是否Root”这篇文章吧。

为了照顾那些着急的同学,先直接给出结论:

    private static final String[] rootRelatedDirs = new String[]{            "/su", "/su/bin/su", "/sbin/su",            "/data/local/xbin/su", "/data/local/bin/su", "/data/local/su",             "/system/xbin/su",            "/system/bin/su", "/system/sd/xbin/su", "/system/bin/failsafe/su",            "/system/bin/cufsdosck", "/system/xbin/cufsdosck", "/system/bin/cufsmgr",            "/system/xbin/cufsmgr", "/system/bin/cufaevdd", "/system/xbin/cufaevdd",            "/system/bin/conbb", "/system/xbin/conbb"};     public static boolean hasRootPrivilege() {        boolean hasRootDir = false;        String[] rootDirs;        int dirCount = (rootDirs = rootRelatedDirs).length;        for (int i = 0; i < dirCount; ++i) {            String dir = rootDirs[i];            if ((new File(dir)).exists()) {                hasRootDir = true;                break;            }        }        return Build.TAGS != null && Build.TAGS.contains("test-keys") || hasRootDir;    }

好,接下来我们来看看到底是如何得到上述的解决方案的。首先,这是既有的判断root权限的方案,即判定两个root权限相关文件夹是否存在,以及当前账户是否具备访问其内容的权限,如果都成立,那么就认为当前账号具备root权限。然而,这种root方案在一些情况下不能很好地发挥作用。

public class RootCheck {     private final static String TAG = "RootUtil";     public static boolean isRoot() {        String binPath = "/system/bin/su";        String xBinPath = "/system/xbin/su";        if (new File(binPath).exists() && isExecutable(binPath))            return true;        if (new File(xBinPath).exists() && isExecutable(xBinPath))            return true;        return false;    }     private static boolean isExecutable(String filePath) {        Process p = null;        try {            p = Runtime.getRuntime().exec("ls -l " + filePath);            // 获取返回内容            BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));            String str = in.readLine();            Log.i(TAG, str);            if (str != null && str.length() >= 4) {                char flag = str.charAt(3);                if (flag == 's' || flag == 'x')                    return true;            }        } catch (ioException e) {            e.printStackTrace();        } finally {            if (p != null) {                p.destroy();            }        }        return false;    }}

然后我就找到了如下方案,该方案号称是腾讯bugly的root权限判断方案:

private static final String[] a = new String[]{"/su", "/su/bin/su", "/sbin/su",    "/data/local/xbin/su", "/data/local/bin/su", "/data/local/su",     "/system/xbin/su", "/system/bin/su", "/system/sd/xbin/su",    "/system/bin/failsafe/su", "/system/bin/cufsdosck",     "/system/xbin/cufsdosck", "/system/bin/cufsmgr",     "/system/xbin/cufsmgr", "/system/bin/cufaevdd",     "/system/xbin/cufaevdd", "/system/bin/conbb",     "/system/xbin/conbb"}; public static boolean p() {  boolean var0 = false;  String[] var1 = a;  int var2 = a.length;   for(int var3 = 0; var3 < var2; ++var3) {    String var4 = var1[var3];    if ((new File(var4)).exists()) {      var0 = true;      break;    }  }   return Build.TAGS != null && Build.TAGS.contains("test-keys") || var0;}

当然,本人生性多疑,偶像是曹操曹丞相,所以自然不能人云亦云,还是实际确认一下bugly实际上是否是这样实现的,以及确保bugly在新的版本中有没有对该方案有进一步的改进。

然后我就到bugly官网,下载了其最新发布的jar包,笔者下载时最新的版本为4.4.4,然后直接解压,然后在解压的目录中搜索“test-keys”内容。

grep -r test-keys "D:\迅雷下载\Bugly_v3.4.4

最后找到了对应的文件位置和对应方法:com\tencent\bugly\crashreport\common\info\b.class

private static final String[] a = new String[]{"/su", "/su/bin/su", "/sbin/su", "/data/local/xbin/su", "/data/local/bin/su", "/data/local/su", "/system/xbin/su", "/system/bin/su", "/system/sd/xbin/su", "/system/bin/failsafe/su", "/system/bin/cufsdosck", "/system/xbin/cufsdosck", "/system/bin/cufsmgr", "/system/xbin/cufsmgr", "/system/bin/cufaevdd", "/system/xbin/cufaevdd", "/system/bin/conbb", "/system/xbin/conbb"};public static boolean l() {    boolean var0 = false;    String[] var1;    int var2 = (var1 = a).length;     for(int var3 = 0; var3 < var2; ++var3) {        String var4 = var1[var3];        if ((new File(var4)).exists()) {            var0 = true;            break;        }    }     return Build.TAGS != null && Build.TAGS.contains("test-keys") || var0;}

然后分析一下对应变量的意思,我们就能还原出腾讯判断Root的代码,即我们开头所贴出的解决方案:

    private static final String[] rootRelatedDirs = new String[]{            "/su", "/su/bin/su", "/sbin/su",            "/data/local/xbin/su", "/data/local/bin/su", "/data/local/su",             "/system/xbin/su",            "/system/bin/su", "/system/sd/xbin/su", "/system/bin/failsafe/su",            "/system/bin/cufsdosck", "/system/xbin/cufsdosck", "/system/bin/cufsmgr",            "/system/xbin/cufsmgr", "/system/bin/cufaevdd", "/system/xbin/cufaevdd",            "/system/bin/conbb", "/system/xbin/conbb"};     public static boolean hasRootPrivilege() {        boolean hasRootDir = false;        String[] rootDirs;        int dirCount = (rootDirs = rootRelatedDirs).length;        for (int i = 0; i < dirCount; ++i) {            String dir = rootDirs[i];            if ((new File(dir)).exists()) {                hasRootDir = true;                break;            }        }        return Build.TAGS != null && Build.TAGS.contains("test-keys") || hasRootDir;    }

以上是“Android如何判断是否Root”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网精选频道!

--结束END--

本文标题: Android如何判断是否Root

本文链接: https://www.lsjlt.com/news/321184.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何在 Golang 中替换正则表达式匹配的文本?
    在 go 中,可使用 regexp.replaceall 函数替换符合正则表达式的文本,该函数需要三个参数:待替换字符串、匹配模式和替换文本。例如,将字符串中 "fox" 替换为 "do...
    99+
    2024-05-14
    golang 正则表达式
  • 如何在 Golang 中测试随机数生成器的准确性?
    在 go 中测试随机数生成器准确性的步骤包括:生成大量随机数并计算每个范围内的出现次数,以确保均匀分布。针对指定均值和标准差计算每个范围内的出现次数,以确保正态分布。 如何在 Gola...
    99+
    2024-05-14
    golang 随机数
  • 面向对象设计原则在C++中的体现
    c++++ 体现了 oop 原则,包括:封装:使用类将数据和方法封装在对象中。继承:允许派生类从基类继承数据和行为。多态:允许对象的行为根据其类型而改变,通过虚函数实现。 面向对象设计...
    99+
    2024-05-14
    c++ 面向对象
  • c语言怎么区分小数和整数
    c 语言区分小数和整数的方法有:数据类型不同:小数类型(float、double)包含小数点,整数类型(int)不包含。printf() 函数中使用不同格式化字符串:小数用 %f,整数用...
    99+
    2024-05-14
    c语言
  • 设计模式在C++ 中的可复用性和可扩展性
    在 c++++ 中,设计模式通过提供经过验证的解决方案来提高可复用性和可扩展性。可复用性允许重复使用代码,例如 factory method 模式,它支持创建不同的产品而不影响具体类。可...
    99+
    2024-05-14
    c++ 设计模式 高可扩展性
  • C++语法中函数模板的灵活运用
    C++ 语法中函数模板的灵活运用 函数模板是 C++ 中的一项强大功能,允许您创建可用于不同数据类型的一组代码。这可以提高代码的可重用性,并使您能够编写更通用、更可维护的代码。 语法 ...
    99+
    2024-05-14
    c++语法 函数模板 c++
  • c语言怎么计算字符串长度和宽度
    在 c 语言中,计算字符串长度和宽度的函数分别为:strlen() 函数用于计算字符串长度,不包括终止符 '\0'。strwidth() 函数用于计算字符串在终端中的宽度,返回显示像素数...
    99+
    2024-05-14
    c语言
  • 如何用 Golang 正则匹配多个单词或字符串?
    golang 正则表达式使用管道符 | 来匹配多个单词或字符串,将各个选项作为逻辑 or 表达式分隔开来。例如:匹配 "fox" 或 "dog":fox|dog匹配 "quick"、"b...
    99+
    2024-05-14
    golang 正则 python
  • c语言怎么跳出多层循环
    在 c 语言中,可以使用嵌套的 break 语句跳出多层循环。对于每个要跳出的循环层,都需要一个单独的 break 语句。例如:使用一个 break 语句跳出内层循环再使用一个 brea...
    99+
    2024-05-14
    c语言
  • c语言怎么注释成中文
    c语言中文注释提供两种方式:行内注释(以"//"开头)和块注释(以"/"开头并以"/"结尾)。最佳实践包括:使用简明扼要的语言,在函数和类开头处添加块注释,在关键部分添加行内注释,保持注...
    99+
    2024-05-14
    c语言
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作