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

    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方案在一些情况下不能很好地发挥作用。
/*** 判断Android设备是否拥有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权限说明 system权限 root权限 - 漫步沙滩 - 博客园原文链接:http://blog.csdn.net/rockwupj/article/details/8618655Android权限说明Android系统是运行在Linux内核上的,Android与https://www.cnblogs.com/4-312/p/4754219.html

【Android小技巧】判断设备是否root 参照bugly的实现方式 - 代码先锋网https://www.codeleading.com/article/31221666385/

判断Android设备是否拥有Root权限 - 简书在android开发中,出于安全的考虑我们很多时候已被Root的手机需要禁止用户访问敏感信息或者提示用户后再操作。所以判断是否拥有Root权限是很有必要的。https://www.jianshu.com/p/c356e02efbad

腾讯 Bugly SDK下载https://bugly.qq.com/v2/sdkDownload?id=258e9ae8-4375-444f-b567-69872fc2a0ee

Android判断是否Root方法相关推荐

  1. android判断是否root或者是否能被root的方法

    已知的root应用应用判断 通过adb shell pm list packages | findstr xxx 判断是否存在下面的包名 "com.noshufou.android.su&q ...

  2. Android 判断摄像头权限方法

    由于项目需要,我们需要在启动摄像头前,预先判断一下我们的应用是否有摄像头权限(包括系统设置以及第三方安全软件是否禁止了摄像头打开权限). 目前主要用到了一下两个方法结合起来判断. 1.通过系统的检查权 ...

  3. nubia android root权限,中兴NX402 (Nubia Z5 Mini Android 4.2)ROOT教程,一键获取ROOT权限

    中兴NX402 (Nubia Z5 Mini Android 4.2)怎么ROOT?中兴NX402 (Nubia Z5 Mini Android 4.2) ROOT工具选用哪些?如何避免中兴NX402 ...

  4. 三星I509 完美ROOT方法及删除电信定制程序

    转载请注明出处. 放假在家,闲来无事时,研究了一下android手机的root方法,记录如下: 注意事项: 1.电脑必须安装NET Framework 2.0以上 2.最好关掉91手机助手等联手机软件 ...

  5. android判断软件是否已root权限,Android应用开发Android 判断手机是否有root权限方法...

    本文将带你了解Android应用开发Android 判断手机是否有root权限方法,希望本文对大家学Android有所帮助. root权限是安卓最高的操作权限,俗称superuser,简称su,一般来 ...

  6. android 判断图片的格式的,android判断文件是否是图片文件的方法

    判断一个文件是否是图片文件的方法,采用BitmapFactory去decode然后根据返回的Options参数来确定: public static boolean isImageFile(String ...

  7. android+5.0+root,人生在于折腾:Android 5.0再次闪电Root 附Root方法

    一般来说,Android开发版系统都是给开发人员研究用的,但也有不少喜欢折腾的玩家会在第一时间尝鲜,而他们也都有一个必备的要求:Root. Nexus 5/7 2013 Android 5.0最新预览 ...

  8. android 判断miui版本,Android判断手机是否是小米MIUI系统的方法

    易采站长站为您分析Android判断手机是否是小米MIUI系统的方法的相关资料,需要的朋友可以参考下 废话不多说了,直接给大家贴代码了: 具体代码如下所示: public class MIUIUtil ...

  9. Android判断模拟器还是真机的方法

    作为一个App,我们在做推广的同时,肯定会担心刷量的问题.一般常见的刷量手段就是通过安卓模拟器进行刷量. 那就会想到,怎么判断一个设备是模拟器还是真机. 先吐槽一下,百度上搜出来的都是什么垃圾答案.各 ...

最新文章

  1. 小学AI教材终于来了,下一步是AI胎教吗?
  2. 年终凡尔赛,都是别人家的公司...
  3. 2021-9-下旬 数据结构-线性表-双向链表-java代码实现(复习用)
  4. list Control实现单元格编辑与插入Combo Box
  5. 计算机网络学习笔记-目录(更新日期:2020.4.8)
  6. 毕马威首次发布《初探元宇宙》报告:从科幻畅想到产业风口(附报告下载链接)...
  7. 心路历程(四)-我的2015
  8. win7如何安装mysql5.7_Win7下安装MySQL5.7.16过程记录
  9. 循序渐进PostgreSQL: 学习pqxx C++ API访问
  10. 连接linux服务器工具
  11. 各种 IntelliJ IDEA 酷炫插件推荐
  12. 计算机wifi共享usb设备,手机设置wifi热点如何通过usb和电脑共享网络
  13. 网站防止CC攻击的方法,CC攻击原理及防范方法
  14. 魔法书《SICP》的简明介绍 - 为什么要学习SICP
  15. 爆笑,2008最新一句话笑喷饭!
  16. 旅游企业该怎么进行网络品牌推广呢?如何宣传和规划旅游商品?
  17. matlab多个最大公约数,求任意多数的最大公约数及最小公倍数的matlab实现
  18. android rsa加密工具类,GitHub - Lerist/encrypt: Android 加密解密工具包。
  19. 计算机中负数和正数的二进制表示
  20. SpringBoot项目启动图标展示个性化

热门文章

  1. 一篇blog带你了解java中的锁
  2. 2018年终总结(一只刚毕业的程序猿)
  3. linux离线安装服务 =====Ubuntu16.0.4 离线部署Openssh
  4. Warning: post-commit hook failed (exit code 255) with no output.
  5. sqlserver往oracle写数据,Sqlserver连接oracle进行读写数据库
  6. php种loop用法,PHP EvLoop 用法 手册 | 示例代码
  7. delphi 打包工具_每年帮你省钱20万的砖头打包方式,是你想要的吗?
  8. 为什么计算机模拟不了人脑,为什么计算机永远不会拥有人类的意识?听完科学家的解释恍然大悟...
  9. 广联达5代锁与4代锁有何区别_BVVB是什么线?BV与BVVB有何区别?
  10. ajax传formdata类型的数据_JQuery.Ajax()的data参数类型