363 Stimmen

Feststellen, ob ein gerootetes Gerät verwendet wird

Meine App hat eine bestimmte Funktionalität, die nur auf einem Gerät funktioniert, auf dem Root verfügbar ist. Anstatt diese Funktion bei der Verwendung fehlschlagen zu lassen (und dem Benutzer dann eine entsprechende Fehlermeldung anzuzeigen), würde ich eine Möglichkeit bevorzugen, zuerst stillschweigend zu prüfen, ob Root verfügbar ist, und wenn nicht, die entsprechenden Optionen von vornherein auszublenden.

Gibt es eine Möglichkeit, dies zu tun?

1voto

Ab 2021 (heute) sieht es so aus, als gäbe es keine verlässliche Methode zur Erkennung von Root, insbesondere wenn ein leistungsfähiges Verstecktool wie MagiskHide aktiviert ist. Die meisten der Antworten hier sind nicht mehr relevant, also verwenden Sie sie nicht in der Produktion. Verlassen Sie sich auf bewährte Prüfungen wie SafetyNet, und anstatt sich die Mühe zu machen, Root zu erkennen, schlage ich vor, Ihre Anwendung zur Laufzeit zu schützen, z. B. Debugger/Instrumentierung zu verhindern und sicherzustellen, dass Sie Obfuskation verwenden.

0voto

Singagirl Punkte 465

Das ist in der Tat eine interessante Frage, und bisher hat noch niemand eine Auszeichnung verdient. Ich verwende den folgenden Code:

  boolean isRooted() {
      try {
                ServerSocket ss = new ServerSocket(81);
                ss.close();
                                    return true;
            } catch (Exception e) {
                // not sure
            }
    return false;
  }

Der Code ist sicherlich nicht kugelsicher, denn das Netzwerk kann nicht verfügbar sein, so dass Sie eine Ausnahme erhalten. Wenn diese Methode true zurückgibt, kann man zu 99% sicher sein, ansonsten nur zu 50%. Netzwerkerlaubnis kann auch die Lösung verderben.

-2voto

VPZ Punkte 671

Mit meiner Bibliothek unter rootbox ist es ziemlich einfach. Prüfen Sie den erforderlichen Code unten:

    //Pass true to <Shell>.start(...) call to run as superuser
    Shell shell = null;
    try {
            shell = Shell.start(true);
    } catch (IOException exception) {
            exception.printStackTrace();
    }
    if (shell == null)
            // We failed to execute su binary
            return;
    if (shell.isRoot()) {
            // Verified running as uid 0 (root), can continue with commands
            ...
    } else
            throw Exception("Unable to gain root access. Make sure you pressed Allow/Grant in superuser prompt.");

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X