Heim >Java >javaLernprogramm >Warum werden „su'-Befehle in Java- und Emulator-Terminals unterschiedlich ausgeführt?
Ausführen von Shell-Befehlen von Android: Eine Analyse einer häufigen Fallstricke
Bei der Android-Entwicklung kann es vorkommen, dass die Ausführung von Shell-Befehlen erforderlich ist . Beim Versuch, solche Befehle aus einer Java-Anwendung heraus auszuführen, können jedoch häufige Fallstricke auftreten. Ein solcher Fallstrick wird beim Befehl „su“ beobachtet, der Superuser-Berechtigungen auf gerooteten Geräten gewährt.
Stellen Sie sich das Szenario einer Bildschirmaufnahme mit dem Befehl „screenrecord“ vor. Wenn der Befehl über das Anwendungsemulator-Terminal ausgeführt wird, wird die Aufzeichnung erfolgreich initiiert. Die Ausführung desselben Befehls aus Java mit der Methode Runtime.getRuntime().exec() schlägt jedoch beim Erstellen der Aufzeichnung fehl.
Die Diskrepanz ergibt sich aus der Methode der Übergabe von Befehlen an den „su“-Prozess. Das Emulator-Terminal ermöglicht die direkte Eingabe von Befehlen, während in Java der Befehl als Eingabe für den „su“-Prozess über seine Standardeingabe bereitgestellt werden muss.
Die Lösung besteht darin, den Befehl an die „su“-Prozesse umzuleiten Standardeingabe mit DataOutputStream. Hier ist der überarbeitete Codeausschnitt:
try{ Process su = Runtime.getRuntime().exec("su"); DataOutputStream outputStream = new DataOutputStream(su.getOutputStream()); outputStream.writeBytes("screenrecord --time-limit 10 /sdcard/MyVideo.mp4\n"); outputStream.flush(); outputStream.writeBytes("exit\n"); outputStream.flush(); su.waitFor(); }catch(IOException e){ throw new Exception(e); }catch(InterruptedException e){ throw new Exception(e); }
Durch die Umleitung des Befehls zur Standardeingabe empfängt der „su“-Prozess den Befehl und erhöht ihn mit Root-Rechten, wodurch die Bildschirmaufzeichnung erfolgreich ausgeführt wird. Diese Technik stellt sicher, dass Shell-Befehle effektiv von Android-Anwendungen ausgeführt werden können, selbst wenn dafür Superuser-Rechte erforderlich sind.
Das obige ist der detaillierte Inhalt vonWarum werden „su'-Befehle in Java- und Emulator-Terminals unterschiedlich ausgeführt?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!