是否有可能以编程方式确定Android设备是否已植根?

时间:2014-07-21 13:51:46

标签: android

我想检查一下Android设备是否有根。如果设备已植根,我不希望我的应用程序向用户显示相应的消息,并且应用程序不应在root设备上运行。

我已经浏览了各种链接和博客,其中包含代码snipplet以检查设备是否已植根。但我也发现多个开发人员说,无法以编程方式检查设备是否有根或无。代码段可能无法在所有设备上提供100%准确的结果,结果可能还取决于用于生成Android设备的工具。

如果有任何方法可以确认设备是否已经过编程,请告知我们。

谢谢, Sagar的

2 个答案:

答案 0 :(得分:3)

我没有足够的声誉点来评论,所以我必须添加另一个答案。

CodeMonkey的帖子中的代码适用于大多数设备,但至少在使用Marshmallow的Nexus 5上,因为即使在非root设备上,该命令实际上也能正常工作。但由于su不起作用,它返回非零退出值。此代码需要一个异常,因此必须像这样进行修改:

private static boolean canExecuteCommand(String command) {
    try {
        int exitValue = Runtime.getRuntime().exec(command).waitFor();
        return exitValue == 0;
    } catch (Exception e) {
        return false;
    }
}

答案 1 :(得分:0)

Stackoverflow可能重复。

这个有一个answer

在第二个链接上回答。这家伙在大约10台设备上进行了测试,这对他有用。

  /**
   * Checks if the device is rooted.
   *
   * @return <code>true</code> if the device is rooted, <code>false</code> otherwise.
   */
  public static boolean isRooted() {

    // get from build info
    String buildTags = android.os.Build.TAGS;
    if (buildTags != null && buildTags.contains("test-keys")) {
      return true;
    }

    // check if /system/app/Superuser.apk is present
    try {
      File file = new File("/system/app/Superuser.apk");
      if (file.exists()) {
        return true;
      }
    } catch (Exception e1) {
      // ignore
    }

    // try executing commands
    return canExecuteCommand("/system/xbin/which su")
        || canExecuteCommand("/system/bin/which su") || canExecuteCommand("which su");
  }

  // executes a command on the system
  private static boolean canExecuteCommand(String command) {
    boolean executedSuccesfully;
    try {
      Runtime.getRuntime().exec(command);
      executedSuccesfully = true;
    } catch (Exception e) {
      executedSuccesfully = false;
    }

    return executedSuccesfully;
  }