Многие из перечисленных здесь ответов имеют присущие проблемы:
- Проверка на наличие тестовых ключей связана с корневым доступом, но не обязательно гарантирует это
- Каталоги "PATH" должны быть получены из фактической переменной среды "PATH", а не жестко закодированы
- Наличие исполняемого файла su не обязательно означает, что устройство было рутировано
- Исполняемый файл «which» может быть установлен или не установлен, и вы должны позволить системе разрешить свой путь, если это возможно
- Тот факт, что приложение SuperUser установлено на устройстве, еще не означает, что устройство имеет root-доступ
Библиотека RootTools от Stericson, похоже, более законно проверяет наличие root. Он также имеет много дополнительных инструментов и утилит, поэтому я очень рекомендую его. Тем не менее, нет объяснения того, как именно он проверяет наличие root, и он может быть немного тяжелее, чем нужно большинству приложений.
Я создал несколько служебных методов, которые свободно основаны на библиотеке RootTools. Если вы просто хотите проверить, находится ли исполняемый файл "su" на устройстве, вы можете использовать следующий метод:
public static boolean isRootAvailable(){
for(String pathDir : System.getenv("PATH").split(":")){
if(new File(pathDir, "su").exists()) {
return true;
}
}
return false;
}
Этот метод просто просматривает каталоги, перечисленные в переменной окружения «PATH», и проверяет, существует ли файл «su» в одном из них.
Для того, чтобы действительно проверить доступ с правами root, команда su должна быть действительно запущена. Если приложение, такое как SuperUser, установлено, то в этот момент оно может запросить root-доступ или, если оно уже было предоставлено / отклонено, может быть показан тост, указывающий, был ли предоставлен / запрещен доступ. Хорошая команда для запуска - это «id», так что вы можете проверить, что идентификатор пользователя на самом деле равен 0 (root).
Вот пример метода, чтобы определить, был ли предоставлен root-доступ:
public static boolean isRootGiven(){
if (isRootAvailable()) {
Process process = null;
try {
process = Runtime.getRuntime().exec(new String[]{"su", "-c", "id"});
BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
String output = in.readLine();
if (output != null && output.toLowerCase().contains("uid=0"))
return true;
} catch (Exception e) {
e.printStackTrace();
} finally {
if (process != null)
process.destroy();
}
}
return false;
}
Важно на самом деле протестировать выполнение команды "su", потому что в некоторых эмуляторах предварительно установлен исполняемый файл "su", но доступ к нему разрешен только определенным пользователям, например оболочке adb.
Также важно проверить наличие исполняемого файла "su", прежде чем пытаться его запустить, поскольку известно, что android неправильно распоряжается процессами, которые пытаются запустить отсутствующие команды. Эти побочные процессы могут со временем потреблять память.