我想检查一下Android设备是否有根。如果设备已植根,我不希望我的应用程序向用户显示相应的消息,并且应用程序不应在root设备上运行。
我已经浏览了各种链接和博客,其中包含代码snipplet以检查设备是否已植根。但我也发现多个开发人员说,无法以编程方式检查设备是否有根或无。代码段可能无法在所有设备上提供100%准确的结果,结果可能还取决于用于生成Android设备的工具。
如果有任何方法可以确认设备是否已经过编程,请告知我们。
谢谢, Sagar的
答案 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;
}