Heim  >  Artikel  >  Java  >  Warum funktioniert mein Shell-Befehl im Terminal, schlägt jedoch in Java fehl?

Warum funktioniert mein Shell-Befehl im Terminal, schlägt jedoch in Java fehl?

Patricia Arquette
Patricia ArquetteOriginal
2024-11-10 10:06:03467Durchsuche

Why Does My Shell Command Work in Terminal but Fail in Java?

Ausführen von Shell-Befehlen von Android: Eine Reise vom Terminal zu Java

Auf der Suche nach der Automatisierung von Gerätefunktionen stoßen Android-Entwickler häufig auf die Notwendigkeit, Shell-Befehle programmgesteuert auszuführen. Während dies über den Terminalemulator unkompliziert zu bewerkstelligen ist, kann die Ausführung derselben Befehle über Java zu Herausforderungen führen. Dieser Frage-und-Antwort-Artikel befasst sich mit der Frage, warum derselbe Befehl, der in einem Terminalemulator funktioniert, in Java möglicherweise nicht erfolgreich ist, und bietet eine Lösung zur Überwindung dieser Hürde.

Problem: Shell-Befehlsausführung schlägt in Java fehl

Ein Entwickler, der versuchte, seinen Bildschirm mit dem neu eingeführten Befehl „screenrecord“ in Android KitKat aufzuzeichnen, bemerkte, dass der Befehl im Terminalemulator einwandfrei funktionierte, jedoch fehlschlug, wenn er in einer Java-Anwendung mit Process.exec() ausgeführt wurde. Sie suchten nach Rat, wo das Problem lag und wie es gelöst werden kann.

Antwort: Erteilen von Berechtigungen für den Befehl

Der Kern des Problems ergab sich aus der Tatsache, dass der Befehl „screenrecord“ erhöhte Berechtigungen erfordert. wird normalerweise durch die Verwendung von „su“ (Superuser) gewährt. Beim Ausführen des Befehls über den Terminalemulator gibt der Benutzer manuell „su“ ein und erteilt damit die erforderlichen Berechtigungen. Bei der Ausführung des Befehls aus Java fehlte der Anwendung jedoch die erforderliche Elevation.

Lösung: Aufforderung zum Root-Zugriff über Process Standard Input

Die Lösung lag in der Aufforderung zum Root-Zugriff innerhalb des Java-Codes . Auf den Befehl „su“ folgt normalerweise eine neue Zeile und der Befehl, der ausgeführt werden muss. Indem der Entwickler den Standardeingabestrom des Prozesses „su“ abgreift und den Befehl hineinschreibt, könnte er das Verhalten des Terminalemulators effektiv nachahmen.

Der folgende Codeausschnitt veranschaulicht die Lösung:

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);
}

Fazit

Durch den Einsatz der bereitgestellten Lösung können Entwickler erfolgreich Shell-Befehle von Java-Anwendungen ausführen, selbst solche, die erhöhte Berechtigungen erfordern. Diese Technik eröffnet die Möglichkeit, verschiedene Gerätefunktionen zu automatisieren und die Anwendungsfunktionen zu verbessern.

Das obige ist der detaillierte Inhalt vonWarum funktioniert mein Shell-Befehl im Terminal, schlägt jedoch in Java fehl?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn