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

9

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 bekomme ich in adb shell:

$ find
/system/bin/sh: find: not found

Ebenfalls:

$ /system/bin/toolbox find
find: no such tool

Auf diesem speziellen Gerät wird Android 5.0 ausgeführt (plus einige proprietäre Ergänzungen von LG, denke ich), aber die Frage ist natürlich für alle Android-Versionen.

Gibt es ein Standardverfahren für die Installation von nativen / CLI-Tools (z. B. find) unter Android? (Ein Paketmanager? ) Und wie geht das überhaupt am besten?

Anzeigename
quelle
Ja, dieses Gerät ist gerootet. Es ist aber auch interessant, über nicht verwurzelte kompatible Methoden Bescheid zu wissen. :)
Anzeigename

Antworten:

5

Für gerootete Android-Geräte

Sie können die BusyBox- App von Stephen installieren . Pro Play Store ist die von der App unterstützte Mindestversion von Android Android 1.6 und eine gut aktualisierte App. Im Wesentlichen installiert es die Busybox- Binärdatei in /system/xbinund stellt Symlinks für alle Dienstprogramme in dasselbe Verzeichnis.

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 bieten 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-Gegenstücke. BusyBox bietet eine ziemlich vollständige Umgebung für jedes kleine oder eingebettete System.

Hier ist die offizielle Liste der angebotenen Dienstprogramme. findTool finden Sie 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 ausführbaren Datei mit BSD-Lizenz. Es ist einfach, klein, schnell und einigermaßen standardkonform ( POSIX-2008 und LSB 4.1 ).

Hier ist die offizielle Liste der Dienstprogramme, die Toybox unterstützt. BusyBox scheint derzeit mehr Tools als Toybox zu unterstützen.

Ich glaube nicht, dass eine App zum Installieren von Toybox Binary vorhanden ist. 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 aus offiziellen Quellen.

Offizielle Download-Links:

Für nicht gerootete Android-Geräte

Ich weiß nicht, ob es für alle Android-Versionen einen universellen Ansatz 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 BusyBox-Binärdateien geliefert werden. Ich habe eine solche Terminal-App nicht persönlich getestet, aber es ist leicht zu verstehen, dass ihr größter Nachteil darin besteht, dass Sie sie mit nicht oder nur sehr gut nutzen können .

Es gibt jedoch einen Ansatz, der für jede Android-Version über 4.2 (basierend auf meinen Tests) zu funktionieren scheint. /data/local/tmpist ein Verzeichnis, das vom shellBenutzer bearbeitet werden kann. adb shellgewährt Ihnen die Remote-Shell auf dem Gerät und meldet sich als derselbe Benutzer an.

Sie müssen lediglich die BusyBox / Toybox-Binärdatei einfügen /data/local/tmpund Symlinks für die Dienstprogramme im selben Verzeichnis erstellen. Sie können dazu die folgenden Schritte ausführen.

(Erfordert ein Setup im PC.)

adb push LOCAL_FILE / data / local / tmp / # Ersetze LOCAL_FILE durch den Dateipfad von toybox / busybox binary im PC
ADB Shell
chmod 755 / data / local / tmp / FILE # Festlegen der entsprechenden Berechtigung für die Push-Binärdatei. Ersetzen Sie FILE durch den Namen der Binärdatei, die Sie im ersten Schritt eingegeben haben. Es wird empfohlen, ein einzelnes Wort als Namen mit allen Kleinbuchstaben zu verwenden
box = / data / local / tmp / FILE # Einrichten einer lokalen Variablen zur Verwendung im nächsten Schritt. Ersetzen Sie die DATEI entsprechend
$ box | $ box sed 's / \ / \ n / g' | $ box sed '$ d' | während Zeile lesen; 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 erstellen dann für jedes Element in der Liste einen Symlink in einem Verzeichnis.

Izzy hat den einfachsten Weg empfohlen , Symlinks für BusyBox-Binärdateien zu platzieren .

ADB-Shell / data / local / tmp / FILE --installiere -s / data / local / tmp / # Ersetze FILE entsprechend. --install -s erstellt die gewünschten Symlinks für Sie in einem Verzeichnis. Daneben wird der Pfad des Verzeichnisses angegeben. 

Auf alle diese Tools kann jetzt über den absoluten Pfad zugegriffen werden /data/local/tmp/TOOL. Ersetzen Sie TOOL durch den Dienstprogrammnamen. Beispiel für die Verwendung des Befehls find aufrufen:

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 in $ PATH einfügen:

export PATH = / data / local / tmp: $ PATH # Dies ist das Präfix / data / local / tmp in den vorhandenen Wert von $ PATH. Der Export würde sicherstellen, dass Sub-Shells in $ PATH denselben Wert sehen

Wenn Sie dies getan haben, können Sie jetzt find oder ein anderes BusyBox / Toybox-Dienstprogramm auf folgende Weise verwenden:

ADB Shell 
Finde Hilfe

Es ist zu beachten, dass Änderungen in $ PATH nur für die aktuelle Shell-Sitzung gelten. Dies bedeutet, dass Sie jedes Mal, wenn Sie eine Shell mit adb starten, $ PATH exportieren müssen.

Es gibt jedoch keine reine Android-Lösung für nicht interaktive Shell-Sitzungen, außer einen Weg zu finden, um eine Variable zu erstellen, deren Existenz und Wert über die aktuelle Shell-Sitzung in Ihrem PC hinaus bestehen bleibt, nicht für 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
quelle
Die Tools, die nicht in Busybox und Toybox enthalten sind, müssen Sie selbst für Android erstellen. Wenn sie nicht bereits von jemandem erstellt und an einem vertrauenswürdigen Ort veröffentlicht wurden, dem Sie vertrauen können, können Sie sie herunterladen und installieren.
Feuerlord