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

9

Установки 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.

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

Показать имя
источник
Да, это устройство рутировано. Но интересно знать и о не-root-совместимых способах. :)
Отображаемое имя

Ответы:

5

Для рутованных устройств 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 в выпуске Зефира.

Что такое Toybox ?

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

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

Оболочка adb / data / local / tmp / FILE --install -s / data / local / tmp / # Замените FILE, если необходимо. --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

Для сеансов интерактивной оболочки вы можете добавить местоположение FILE в $ PATH, используя команду export:

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

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

adb shell 
найти --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 самостоятельно, если они еще не созданы кем-то и размещены в надежном месте, которому вы можете доверять, их можно загрузить и установить.
Повелитель огня