Android-Installationen verfügen nicht immer über alle Tools, die man von einem Unix-ähnlichen System erwarten würde.
Zum Beispiel habe ich gerade ein problematisches Gerät, das kein find
CLI-Dienstprogramm hat. Ich meine, das ist, was ich bekomme, während ich in bin adb shell
:
$ find
/system/bin/sh: find: not found
Ebenfalls:
$ /system/bin/toolbox find
find: no such tool
Auf diesem speziellen Gerät läuft Android 5.0 (und einige proprietäre Ergänzungen von LG, denke ich), aber die Frage gilt natürlich für alle Android-Versionen.
Gibt es ein Standardverfahren für die Installation von nativen/CLI-Tools (z. B. find
) auf Android? (Ein Paketmanager? ) Und wie macht man das am besten?
Sie können die BusyBox- App von Stephen installieren. Laut Play Store ist die von der App unterstützte Android-Mindestversion Android 1.6 und es handelt sich um eine gut aktualisierte App. Im Wesentlichen installiert es die Busybox- Binärdatei /system/xbin
und platziert symbolische Links in demselben Verzeichnis für alle Dienstprogramme, die es hat.
BusyBox kombiniert winzige Versionen vieler gängiger UNIX-Dienstprogramme in einer einzigen kleinen ausführbaren Datei. Es bietet Ersatz für die meisten Dienstprogramme, die Sie normalerweise in GNU-Fileutils, Shellutils usw. finden. Die Dienstprogramme in BusyBox haben im Allgemeinen weniger Optionen als ihre voll ausgestatteten GNU-Cousins; Die enthaltenen Optionen bieten jedoch die erwartete Funktionalität und verhalten sich sehr ähnlich wie ihre GNU-Pendants. BusyBox bietet eine ziemlich vollständige Umgebung für jedes kleine oder eingebettete System.
Hier ist die offizielle Liste der bereitgestellten Dienstprogramme. find
Werkzeug findet man dort.
Eine kompetente Alternative zu BusyBox ist Toybox, die Toolbox in der Marshmallow-Version ersetzt hat.
Toybox kombiniert viele gängige Linux-Befehlszeilenprogramme in einer einzigen BSD-lizenzierten ausführbaren Datei. Es ist einfach, klein, schnell und ziemlich standardkonform ( POSIX-2008 und LSB 4.1 ).
Hier ist die offizielle Liste der von Toybox unterstützten Dienstprogramme. BusyBox scheint im Moment mehr Tools zu unterstützen als Toybox.
Ich glaube nicht, dass es eine App zum Installieren der Toybox-Binärdatei gibt, daher können Sie meine Antwort hier zum Zweck der Installation verwenden. Beachten Sie, dass die Antwort für die Installation von Toybox und BusyBox verwendet werden kann. Einzige Voraussetzung ist das Herunterladen der Binärdatei von offiziellen Quellen.
Offizielle Download-Links:
Ich weiß nicht, ob es einen universellen Ansatz für alle Android-Versionen gibt. Das heißt, für Android 4.0 und höher behauptet BusyBox Install (No Root) zu funktionieren. Möglicherweise gibt es einige Terminal-Apps, die mit der BusyBox-Binärdatei geliefert werden. Ich habe keine solche Terminal-App persönlich getestet, aber es ist leicht zu verstehen, dass ihr größter Nachteil darin besteht, dass Sie sie mit adb nicht oder nur sehr gut nutzen können .
Es gibt jedoch einen Ansatz, der für jede Android-Version über 4.2 zu funktionieren scheint (basierend auf meinen Tests). ist ein Verzeichnis, das vom Benutzer /data/local/tmp
bearbeitet werden kann. gewährt Ihnen die Remote-Shell auf dem Gerät und meldet sich als derselbe Benutzer an.shell
adb shell
Alles, was Sie tun müssen, ist, die BusyBox/Toybox-Binärdatei in /data/local/tmp
dasselbe Verzeichnis zu kopieren und Symlinks für die Dienstprogramme zu erstellen. Sie können dafür die folgenden Schritte verwenden.
(Erfordert adb- Setup im PC.)
adb push LOCAL_FILE /data/local/tmp/ # Ersetzen Sie LOCAL_FILE durch den Dateipfad der Toybox/Busybox-Binärdatei auf dem PC ADB Shell chmod 755 /data/local/tmp/FILE # Festlegen der entsprechenden Berechtigung für die gepushte Binärdatei. Ersetzen Sie DATEI durch den Namen der Binärdatei, die Sie im ersten Schritt verschoben haben. Es wird empfohlen, ein einzelnes Wort als Namen mit ausschließlich Kleinbuchstaben zu verwenden box=/data/local/tmp/FILE # Einrichten einer lokalen Variablen für die Verwendung im nächsten Schritt. Ersetzen Sie DATEI entsprechend $Box | $box sed 's/\ /\n/g'| $box sed '$d'| während Lesezeile; do $box ln -sf /data/local/tmp/FILE /data/local/tmp/$line; done # Wir führen die von $box referenzierte Binärdatei aus, um alle Dienstprogramme aufzulisten, gefolgt von der Erstellung einer Liste, und dann erstellen wir für jedes Element in der Liste einen symbolischen Link in einem Verzeichnis.
Izzy hat den einfachsten Weg empfohlen, Symlinks für die BusyBox-Binärdatei zu platzieren .
adb shell /data/local/tmp/FILE --install -s /data/local/tmp/ # DATEI entsprechend ersetzen. --install -s erstellt die gewünschten Symlinks für Sie in einem Verzeichnis. Der Pfad des Verzeichnisses wird daneben angezeigt.
Auf all diese Tools kann jetzt über den absoluten Pfad zugegriffen werden /data/local/tmp/TOOL
. Ersetzen Sie TOOL durch den Namen des Dienstprogramms. Beispielverwendung für den Aufruf des Find-Befehls:
adb shell /data/local/tmp/find --help
adb shell /data/local/tmp/FILE find --help # alternative way of using a tool
Für interaktive Shell-Sitzungen können Sie den Speicherort von FILE mit dem Befehl export zu $PATH hinzufügen:
export PATH=/data/local/tmp:$PATH # Dies stellt /data/local/tmp dem bestehenden Wert von $PATH voran. export würde sicherstellen, dass Sub-Shells denselben Wert in $PATH sehen
Wenn Sie das getan haben, können Sie jetzt find oder ein anderes BusyBox/Toybox-Dienstprogramm auf diese Weise verwenden:
ADB Shell Finde Hilfe
Es ist zu beachten, dass Änderungen in $PATH nur für die aktuelle Shell-Sitzung gelten. Das bedeutet, dass Sie jedes Mal, wenn Sie eine Shell mit adb starten, $PATH exportieren müssten.
Allerdings gibt es keine reine Android-Lösung für nicht-interaktive Shell-Sitzungen, außer einen Weg zu finden, eine Variable zu erstellen, deren Existenz und Wert über die aktuelle Shell-Sitzung hinaus auf Ihrem PC bestehen bleibt, nicht auf Android . Beispiel:
adb shell $lolcat # $lolcat is a temporary variable in my shell on PC and it was assigned the value /system/xbin/toybox. My bash shell is replacing $lolcat with its value and then passing it to adb shell (or you can say, it first expanded the variable and then executed the whole command)
Feuerlord
Anzeigename