Wie installiere ich fehlende Befehlszeilentools auf einem Android-Gerät?

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 findCLI-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?

Ja, dieses Gerät ist gerootet. Aber es ist auch interessant, über nicht gerootete kompatible Wege zu wissen. :)

Antworten (1)

Für gerootete Android-Geräte

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/xbinund platziert symbolische Links in demselben Verzeichnis für alle Dienstprogramme, die es hat.

Was ist BusyBox (nicht die App)?

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. findWerkzeug findet man dort.

Eine kompetente Alternative zu BusyBox ist Toybox, die Toolbox in der Marshmallow-Version ersetzt hat.

Was ist Toybox ?

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:

Für nicht gerootete Android-Geräte

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. 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/tmpbearbeitet werden kann. gewährt Ihnen die Remote-Shell auf dem Gerät und meldet sich als derselbe Benutzer an.shelladb shell

Alles, was Sie tun müssen, ist, die BusyBox/Toybox-Binärdatei in /data/local/tmpdasselbe Verzeichnis zu kopieren und Symlinks für die Dienstprogramme zu erstellen. Sie können dafür die folgenden Schritte verwenden.

(Erfordert 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)
Die Tools, die nicht in busybox und toybox zu finden sind, müssen Sie für Android selbst erstellen, falls sie nicht bereits von jemandem erstellt und an einer vertrauenswürdigen Stelle veröffentlicht wurden, der Sie vertrauen können, können sie herunterladen und installieren.