Как установить отсутствующие инструменты командной строки на устройство Android?

В установках Android не всегда есть все инструменты, которые можно было бы ожидать в Unix-подобной системе.

Например, сейчас у меня есть проблемное устройство, на котором нет findутилиты CLI. Я имею в виду, это то, что я получаю в то время как adb shell:

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

Также:

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

Это конкретное устройство работает под управлением Android 5.0 (плюс некоторые проприетарные дополнения от LG, я думаю), но вопрос, конечно, касается всех версий Android.

Существует ли стандартная процедура установки собственных инструментов/инструментов командной строки (таких как find) на Android? ( Менеджер пакетов? ) И вообще, как это сделать наиболее корректно?

Да, это устройство рутировано. Но интересно узнать и о нерутированных совместимых способах. :)

Ответы (1)

Для рутированных устройств Android

Вы можете рассмотреть возможность установки приложения BusyBox от Стивена. Согласно Play Store, минимальная версия Android, поддерживаемая приложением, — Android 1.6, и это хорошо обновленное приложение. По сути, он устанавливает бинарный файл busybox/system/xbin и размещает символические ссылки в одном и том же каталоге для всех имеющихся у него утилит.

Что такое BusyBox (не приложение)?

BusyBox объединяет крошечные версии многих распространенных утилит UNIX в один небольшой исполняемый файл. Он предоставляет замену большинству утилит, которые вы обычно найдете в GNU fileutils, shellutils и т. д. Утилиты BusyBox обычно имеют меньше опций, чем их полнофункциональные собратья GNU; однако включенные параметры обеспечивают ожидаемую функциональность и ведут себя очень похоже на их аналоги GNU. BusyBox предоставляет довольно полную среду для любой небольшой или встроенной системы.

Вот официальный список утилит, которые он предоставляет. findинструмент можно найти там.

Грамотной альтернативой BusyBox является Toybox, заменивший Toolbox в версии Marshmallow.

Что такое игрушечный ящик ?

Toybox объединяет множество распространенных утилит командной строки Linux в один исполняемый файл под лицензией BSD. Он простой, небольшой, быстрый и в достаточной степени соответствует стандартам ( POSIX-2008 и LSB 4.1 ).

Вот официальный список утилит, которые поддерживает toybox. На данный момент BusyBox поддерживает больше инструментов, чем Toybox.

Я не думаю, что существует приложение для установки двоичного файла Toybox, поэтому вы можете использовать мой ответ здесь для его установки. Обратите внимание, что ответ можно использовать для установки как Toybox, так и BusyBox. Единственным обязательным условием является загрузка бинарного файла из официальных источников.

Официальные ссылки для скачивания:

Для устройств Android без рута

Не знаю, есть ли универсальный подход для всех версий Android. Тем не менее, для Android 4.0 и выше BusyBox Install (No Root) утверждает, что работает. Могут быть некоторые терминальные приложения, которые поставляются с двоичным файлом BusyBox. Я лично не тестировал ни одно из таких терминальных приложений, но легко понять, что их самый большой недостаток заключается в том, что вы не можете эффективно использовать их с помощью .

Однако существует подход, который работает для любой версии Android выше 4.2 (на основе моих тестов). /data/local/tmpэто каталог, который может редактировать shellпользователь. adb shellпредоставляет вам удаленную оболочку на устройстве и входит в систему как тот же пользователь.

Все, что вам нужно сделать, это поместить двоичный файл BusyBox/Toybox /data/local/tmpи создать символические ссылки для утилит в том же каталоге. Для этого вы можете использовать следующие шаги.

(Требуется настройка на ПК.)

adb push LOCAL_FILE /data/local/tmp/ # замените LOCAL_FILE на путь к бинарному файлу toybox/busybox на ПК
adb оболочка
chmod 755 /data/local/tmp/FILE # установка соответствующих разрешений для загруженного двоичного файла. Замените FILE на имя двоичного файла, который вы отправили на первом шаге. Рекомендуется использовать в качестве имени одно слово со всеми строчными буквами.
box=/data/local/tmp/FILE # настройка локальной переменной для использования на следующем шаге. Замените ФАЙЛ на соответствующий
$ коробка | $box sed 's/\ /\n/g'| $box sed '$d'| при чтении строки; do $box ln -sf /data/local/tmp/FILE /data/local/tmp/$line; done # Мы выполняем двоичный файл, на который ссылается $box, чтобы перечислить все утилиты, затем создать список, а затем для каждого элемента в списке мы создаем символическую ссылку в каталоге.

Иззи порекомендовал самый простой способ размещения символических ссылок для двоичного файла BusyBox .

adb shell /data/local/tmp/FILE --install -s /data/local/tmp/ # Замените ФАЙЛ соответствующим образом. --install -s создаст для вас нужные символические ссылки в каталоге. Путь к каталогу указан рядом с ним. 

Теперь ко всем этим инструментам можно получить доступ, используя абсолютный путь /data/local/tmp/TOOL. Замените TOOL именем утилиты. Пример использования вызова команды find:

adb shell /data/local/tmp/find --help
adb shell /data/local/tmp/FILE find --help   # alternative way of using a tool

Для интерактивных сеансов оболочки вы можете добавить расположение ФАЙЛА в $PATH с помощью команды экспорта:

export PATH=/data/local/tmp:$PATH # это префикс /data/local/tmp к существующему значению $PATH. экспорт гарантирует, что вложенные оболочки увидят одно и то же значение в $ PATH

Сделав это, теперь вы можете использовать find или другую утилиту BusyBox/Toybox следующим образом:

adb оболочка
найти --help

Следует отметить, что изменения в $PATH применимы только для текущего сеанса оболочки. Это означает, что каждый раз, когда вы запускаете оболочку с помощью adb, вам придется экспортировать $PATH.

Тем не менее, нет решения только для Android для неинтерактивных сеансов оболочки, кроме как найти способ создать переменную, существование и значение которой будут сохраняться за пределами текущего сеанса оболочки на вашем ПК, а не Android . Пример:

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)
Инструменты, которых нет в busybox и toybox, вам придется создавать для Android самостоятельно, если они еще не созданы кем-то и размещены в надежном месте, которому вы можете доверять, их можно загрузить и установить.