Viele der hier aufgeführten Antworten sind mit Problemen behaftet:
- Die Prüfung auf Testschlüssel korreliert mit dem Root-Zugriff, garantiert ihn aber nicht unbedingt.
- "PATH"-Verzeichnisse sollten von der aktuellen "PATH"-Umgebungsvariablen abgeleitet werden, anstatt hart kodiert zu sein
- Das Vorhandensein der ausführbaren Datei "su" bedeutet nicht unbedingt, dass das Gerät gerootet wurde
- Die ausführbare Datei "which" kann installiert sein oder auch nicht, und Sie sollten den Pfad nach Möglichkeit vom System ermitteln lassen
- Nur weil die SuperUser-App auf dem Gerät installiert ist, bedeutet das noch nicht, dass das Gerät Root-Zugriff hat.
Les RootTools Bibliothek von Stericson scheint die Überprüfung auf Root legitimer zu sein. Sie hat auch viele zusätzliche Tools und Dienstprogramme, so dass ich sie sehr empfehlen kann. Allerdings gibt es keine Erklärung, wie es speziell für Root überprüft, und es kann ein bisschen schwerer sein als die meisten Anwendungen wirklich brauchen.
Ich habe eine Reihe von Dienstprogrammen entwickelt, die lose auf der RootTools-Bibliothek basieren. Wenn Sie einfach nur überprüfen wollen, ob sich die ausführbare Datei "su" auf dem Gerät befindet, können Sie die folgende Methode verwenden:
public static boolean isRootAvailable(){
for(String pathDir : System.getenv("PATH").split(":")){
if(new File(pathDir, "su").exists()) {
return true;
}
}
return false;
}
Diese Methode durchläuft einfach die Verzeichnisse, die in der Umgebungsvariablen "PATH" aufgeführt sind, und prüft, ob eine "su"-Datei in einem dieser Verzeichnisse existiert.
Um wirklich auf Root-Zugriff zu prüfen, muss der Befehl "su" tatsächlich ausgeführt werden. Wenn eine Anwendung wie SuperUser installiert ist, kann sie an dieser Stelle nach Root-Zugriff fragen, oder wenn dieser bereits gewährt/verweigert wurde, kann ein Toast angezeigt werden, der angibt, ob der Zugriff gewährt/verweigert wurde. Ein guter Befehl ist "id", damit Sie überprüfen können, ob die Benutzerkennung tatsächlich 0 (Root) ist.
Hier ein Beispiel für eine Methode, um festzustellen, ob Root-Zugriff gewährt wurde:
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;
}
Es ist wichtig, die Ausführung des "su"-Befehls tatsächlich zu testen, da einige Emulatoren die ausführbare Datei "su" vorinstalliert haben, aber nur bestimmten Benutzern den Zugriff darauf erlauben, wie z. B. der adb-Shell.
Es ist auch wichtig zu überprüfen, ob die ausführbare Datei "su" vorhanden ist, bevor man versucht, sie auszuführen, da Android dafür bekannt ist, Prozesse, die versuchen, fehlende Befehle auszuführen, nicht ordnungsgemäß zu entsorgen. Diese Geisterprozesse können mit der Zeit den Speicherverbrauch in die Höhe treiben.