¿Cómo instalo las herramientas de línea de comandos que faltan en un dispositivo Android?

Las instalaciones de Android no siempre tienen todas las herramientas que uno esperaría tener en un sistema tipo Unix.

Por ejemplo, ahora mismo tengo un dispositivo problemático que no tiene findla utilidad CLI. Quiero decir, esto es lo que obtengo mientras estoy en adb shell:

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

También:

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

Este dispositivo en particular ejecuta Android 5.0 (más algunas adiciones patentadas de LG, supongo), pero la pregunta es para todas las versiones de Android, por supuesto.

¿Existe un procedimiento estándar para instalar herramientas nativas/CLI (como find) en Android? (¿Un administrador de paquetes? ) Y, de todos modos, ¿cómo hacerlo de la manera más correcta?

Sí, este dispositivo está rooteado. Pero también es interesante saber acerca de las formas compatibles sin rootear. :)

Respuestas (1)

Para dispositivos Android rooteados

Puede considerar instalar la aplicación BusyBox de Stephen. Según Play Store, la versión mínima de Android compatible con la aplicación es Android 1.6 y es una aplicación bien actualizada. En esencia, instala el binario busybox/system/xbin y coloca los enlaces simbólicos en el mismo directorio para todas las utilidades que tiene.

¿Qué es BusyBox (no la aplicación)?

BusyBox combina versiones diminutas de muchas utilidades comunes de UNIX en un solo ejecutable pequeño. Proporciona reemplazos para la mayoría de las utilidades que normalmente encuentra en GNU fileutils, shellutils, etc. Las utilidades en BusyBox generalmente tienen menos opciones que sus primos GNU con todas las funciones; sin embargo, las opciones que se incluyen brindan la funcionalidad esperada y se comportan de manera muy similar a sus contrapartes de GNU. BusyBox proporciona un entorno bastante completo para cualquier sistema pequeño o integrado.

Aquí está la lista oficial de utilidades que proporciona. findla herramienta se puede encontrar allí.

Una alternativa competente a BusyBox es Toybox, que reemplazó a Toolbox en el lanzamiento de Marshmallow.

¿Qué es ToyBox ?

Toybox combina muchas utilidades comunes de línea de comandos de Linux en un único ejecutable con licencia BSD. Es simple, pequeño, rápido y razonablemente compatible con los estándares ( POSIX-2008 y LSB 4.1 ).

Aquí está la lista oficial de utilidades compatibles con Toybox. BusyBox, por el momento, parece admitir más herramientas que Toybox.

No creo que exista una aplicación para instalar el binario Toybox, por lo que puede usar mi respuesta aquí para su instalación. Tenga en cuenta que la respuesta se puede utilizar para la instalación de Toybox y BusyBox. El único requisito previo es descargar el binario de fuentes oficiales.

Enlaces de descarga oficiales:

Para dispositivos Android no rooteados

No sé si existe un enfoque universal para todas las versiones de Android. Dicho esto, para Android 4.0 y versiones posteriores, BusyBox Install (No Root) dice que funciona. Puede haber algunas aplicaciones de terminal que vengan con el binario BusyBox. No he probado personalmente ninguna aplicación de terminal de este tipo, pero es fácil entender que su mayor inconveniente es que no se puede hacer un buen uso de ellas usando .

Sin embargo, existe un enfoque que parece funcionar para cualquier versión de Android superior a 4.2 (según mis pruebas). /data/local/tmpes un directorio que puede ser editado por shellel usuario. adb shellle otorga el shell remoto en el dispositivo e iniciar sesión como el mismo usuario.

Todo lo que tiene que hacer es colocar el binario BusyBox/Toybox /data/local/tmpy crear enlaces simbólicos para las utilidades en el mismo directorio. Puede usar los siguientes pasos para eso.

(Requiere configuración en PC).

adb push LOCAL_FILE /data/local/tmp/ # reemplace LOCAL_FILE con la ruta del archivo del binario toybox/busybox en la PC
shell adb
chmod 755 /data/local/tmp/FILE # configurando el permiso apropiado en el archivo binario insertado. Reemplace ARCHIVO con el nombre del binario que presionó en el primer paso. Se recomienda usar una sola palabra como nombre con todas las letras en minúsculas
box=/data/local/tmp/FILE # configurando una variable local para su uso en el siguiente paso. Reemplace ARCHIVO según corresponda
$caja | $caja sed 's/\ /\n/g'| $box sed '$d'| mientras lee la línea; hacer $box ln -sf /data/local/tmp/FILE /data/local/tmp/$line; done # Estamos ejecutando el binario al que hace referencia $box para enumerar todas las utilidades, seguido de la creación de una lista y luego, para cada elemento de la lista, estamos creando un enlace simbólico en un directorio.

Izzy ha recomendado la forma más sencilla de colocar enlaces simbólicos para el binario BusyBox .

adb shell /data/local/tmp/FILE --install -s /data/local/tmp/ # Reemplace FILE según corresponda. --install -s creará los enlaces simbólicos deseados para usted en un directorio. La ruta del directorio se proporciona al lado. 

Ahora se puede acceder a todas esas herramientas utilizando la ruta absoluta /data/local/tmp/TOOL. Reemplace HERRAMIENTA con el nombre de la utilidad. Ejemplo de uso de llamar al comando de búsqueda:

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

Para sesiones de shell interactivas, puede agregar la ubicación de ARCHIVO en $PATH usando el comando de exportación:

export PATH=/data/local/tmp:$PATH # esto antepone /data/local/tmp al valor existente de $PATH. export se aseguraría de que las subcapas vean el mismo valor en $PATH

Hecho eso, ahora puede usar find u otra utilidad BusyBox/Toybox de esta manera:

shell adb
encontrar ayuda

Cabe señalar que los cambios en $PATH solo se aplican a la sesión de shell actual. Significa que cada vez que inicie un shell usando adb, deberá exportar $PATH.

Dicho esto, no existe una solución exclusiva de Android para sesiones de shell no interactivas que no sea encontrar una manera de crear una variable cuya existencia y valor persistirían más allá de la sesión de shell actual en su PC, no en Android . Ejemplo:

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)
Las herramientas que no se encuentran en busybox y toybox, tendrá que crearlas usted mismo para Android, si no las ha creado alguien y publicado en una ubicación confiable en la que puede confiar, puede descargarlas e instalarlas.