package sg.vantagepoint.util;
import android.os.Build;
import java.io.File;
public class RootDetection {
public RootDetection() {
super();
}
public static boolean checkRoot1() {
boolean bool = false;
String[] array_string = System.getenv("PATH").split(":");
int i = array_string.length;
int i1 = 0;
while(i1 < i) {
if(new File(array_string[i1], "su").exists()) {
bool = true;
}
else {
++i1;
continue;
}
return bool;
}
return bool;
}
public static boolean checkRoot2() {
String string0 = Build.TAGS;
boolean bool = string0 == null || !string0.contains("test-keys") ? false : true;
return bool;
}
public static boolean checkRoot3() {
boolean bool = true;
String[] array_string = new String[]{"/system/app/Superuser.apk", "/system/xbin/daemonsu", "/system/etc/init.d/99SuperSUDaemon",
"/system/bin/.ext/.su", "/system/etc/.has_su_daemon", "/system/etc/.installed_su_daemon",
"/dev/com.koushikdutta.superuser.daemon/"};
int i = array_string.length;
int i1 = 0;
while(true) {
if(i1 >= i) {
return false;
}
else if(!new File(array_string[i1]).exists()) {
++i1;
continue;
}
return bool;
}
return false;
}
}
private boolean loggingEnabled = true;
private final Context mContext;
public RootBeer(Context context) {
this.mContext = context;
}
public boolean isRooted() {
return detectRootManagementApps() || detectPotentiallyDangerousApps() || checkForBinary("su") || checkForDangerousProps() || checkForRWPaths() || detectTestKeys() || checkSuExists() || checkForRootNative();
}
public boolean isRootedWithoutBusyBoxCheck() {
return detectRootManagementApps() || detectPotentiallyDangerousApps() || checkForBinary("su") || checkForDangerousProps() || checkForRWPaths() || detectTestKeys() || checkSuExists() || checkForRootNative();
}
public boolean detectTestKeys() {
String buildTags = Build.TAGS;
return buildTags != null && buildTags.contains("test-keys");
}
public boolean detectRootManagementApps() {
return detectRootManagementApps(null);
}
public boolean detectRootManagementApps(String[] additionalRootManagementApps) {
ArrayList<String> packages = new ArrayList();
packages.addAll(Arrays.asList(Const.knownRootAppsPackages));
if (additionalRootManagementApps != null && additionalRootManagementApps.length > 0) {
packages.addAll(Arrays.asList(additionalRootManagementApps));
}
return isAnyPackageFromListInstalled(packages);
}
public boolean detectPotentiallyDangerousApps() {
return detectPotentiallyDangerousApps(null);
}
public boolean detectPotentiallyDangerousApps(String[] additionalDangerousApps) {
ArrayList<String> packages = new ArrayList();
packages.addAll(Arrays.asList(Const.knownDangerousAppsPackages));
if (additionalDangerousApps != null && additionalDangerousApps.length > 0) {
packages.addAll(Arrays.asList(additionalDangerousApps));
}
return isAnyPackageFromListInstalled(packages);
}
public boolean detectRootCloakingApps() {
return detectRootCloakingApps(null) || (canLoadNativeLibrary() && !checkForNativeLibraryReadAccess());
}
public boolean detectRootCloakingApps(String[] additionalRootCloakingApps) {
ArrayList<String> packages = new ArrayList();
packages.addAll(Arrays.asList(Const.knownRootCloakingPackages));
if (additionalRootCloakingApps != null && additionalRootCloakingApps.length > 0) {
packages.addAll(Arrays.asList(additionalRootCloakingApps));
}
return isAnyPackageFromListInstalled(packages);
}
public boolean checkForSuBinary() {
return checkForBinary("su");
}
public boolean checkForBusyBoxBinary() {
return checkForBinary("busybox");
}
public boolean checkForBinary(String filename) {
boolean result = false;
for (String path : Const.suPaths) {
if (new File(path + filename).exists()) {
result = true;
}
}
return result;
}
private boolean isAnyPackageFromListInstalled(List<String> packages) {
boolean result = false;
PackageManager pm = this.mContext.getPackageManager();
for (String packageName : packages) {
try {
pm.getPackageInfo(packageName, 0);
result = true;
} catch (NameNotFoundException e) {
}
}
return result;
}
public boolean checkForDangerousProps() {
Exception e;
Throwable th;
BufferedReader bufferedReader = null;
boolean result = false;
try {
ProcessBuilder pb = new ProcessBuilder(new String[]{"getprop", "ro.debuggable"});
pb.redirectErrorStream(true);
BufferedReader in = new BufferedReader(new InputStreamReader(pb.start().getInputStream()));
try {
String str = "";
str = in.readLine();
if (str != null && str.equals("1")) {
result = true;
}
if (result) {
bufferedReader = in;
} else {
pb = new ProcessBuilder(new String[]{"getprop", "ro.secure"});
pb.redirectErrorStream(true);
bufferedReader = new BufferedReader(new InputStreamReader(pb.start().getInputStream()));
str = bufferedReader.readLine();
if (str != null && str.equals("0")) {
result = true;
}
}
SysHelper.close(bufferedReader);
return result;
} catch (Exception e2) {
e = e2;
bufferedReader = in;
try {
e.printStackTrace();
SysHelper.close(bufferedReader);
return false;
} catch (Throwable th2) {
th = th2;
SysHelper.close(bufferedReader);
throw th;
}
} catch (Throwable th3) {
th = th3;
bufferedReader = in;
SysHelper.close(bufferedReader);
throw th;
}
} catch (Exception e3) {
e = e3;
e.printStackTrace();
SysHelper.close(bufferedReader);
return false;
}
}
public boolean checkForRWPaths() {
Throwable th;
BufferedReader in = null;
boolean result = false;
try {
ProcessBuilder processBuilder = new ProcessBuilder(new String[]{"mount"});
processBuilder.redirectErrorStream(true);
Process mProcess = processBuilder.start();
BufferedReader in2 = new BufferedReader(new InputStreamReader(mProcess.getInputStream()));
while (true) {
try {
String line = in2.readLine();
if (line != null) {
String[] args = line.split(" ");
if (args.length >= 4) {
String mountPoint = args[1];
String mountOptions = args[3];
for (String pathToCheck : Const.pathsThatShouldNotBeWrtiable) {
if (mountPoint.equalsIgnoreCase(pathToCheck)) {
for (String option : mountOptions.split(",")) {
if (option.equalsIgnoreCase("rw")) {
result = true;
break;
}
}
}
}
}
} else {
int exitValue = mProcess.waitFor();
SysHelper.close(in2);
in = in2;
return result;
}
} catch (Exception e) {
in = in2;
} catch (Throwable th2) {
th = th2;
in = in2;
}
}
} catch (Exception e2) {
SysHelper.close(in);
return false;
} catch (Throwable th3) {
th = th3;
SysHelper.close(in);
throw th;
}
}
public boolean checkSuExists() {
boolean z = true;
BufferedReader in = null;
try {
ProcessBuilder pb = new ProcessBuilder(new String[]{"which", "su"});
pb.redirectErrorStream(false);
Process mProcess = pb.start();
BufferedReader in2 = new BufferedReader(new InputStreamReader(mProcess.getInputStream()));
try {
String line = in2.readLine();
int exitValue = mProcess.waitFor();
SysHelper.close(in2);
if (line == null || !line.endsWith("su")) {
z = false;
}
in = in2;
return z;
} catch (Throwable th) {
in = in2;
if (in != null) {
SysHelper.close(in);
}
return false;
}
} catch (Throwable th2) {
if (in != null) {
SysHelper.close(in);
}
return false;
}
}
public boolean checkForNativeLibraryReadAccess() {
return true;
}
public boolean canLoadNativeLibrary() {
return true;
}
public boolean checkForRootNative() {
if (!canLoadNativeLibrary()) {
return false;
}
String binaryName = "su";
String[] paths = new String[Const.suPaths.length];
for (int i = 0; i < paths.length; i++) {
paths[i] = Const.suPaths[i] + binaryName;
}
if (FileNative.checkForRoot(paths) > 0) {
return true;
}
return false;
}
https://www.anquanke.com/post/id/86201
其中
/**
* 并不能决定什么 ,Permission denied 哪怕root了。
* @return
*/
public static boolean checkSuExistsByWhich() {
boolean z = true;
BufferedReader in = null;
try {
ProcessBuilder pb = new ProcessBuilder(new String[]{"which", "su"});
pb.redirectErrorStream(false);
Process mProcess = pb.start();
BufferedReader in2 = new BufferedReader(new InputStreamReader(mProcess.getInputStream()));
try {
String line = in2.readLine();
int exitValue = mProcess.waitFor();
close(in2);
if (line == null || !line.endsWith("su")) {
z = false;
}
in = in2;
return z;
} catch (Throwable th) {
in = in2;
if (in != null) {
close(in);
}
return false;
}
} catch (Throwable th2) {
if (in != null) {
close(in);
}
return false;
}
}
方法不靠谱,有root也会提示权限禁止,另外还可以反射判断secure是否为1,来判断 以及 ro.debuggalbe,如果调试为1 或者安全为0 就是root了。
package android.os;
public class Build {
private static final String TAG = "Build";
/** Value used for when a build property is unknown. */
public static final String UNKNOWN = "unknown";
/** Either a changelist number, or a label like "M4-rc20". */
public static final String ID = getString("ro.build.id");
/** A build ID string meant for displaying to the user */
public static final String DISPLAY = getString("ro.build.display.id");
/** The name of the overall product. */
public static final String PRODUCT = getString("ro.product.name");
/** The name of the industrial design. */
public static final String DEVICE = getString("ro.product.device");