Como instalar ferramentas de linha de comando ausentes em um dispositivo Android?

9

As instalações do Android nem sempre têm todas as ferramentas que se esperaria ter em um sistema semelhante ao Unix.

Por exemplo, agora eu tenho um dispositivo problemático que não possui o findutilitário CLI. Quero dizer, é isso que recebo enquanto adb shell:

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

Além disso:

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

Este dispositivo em particular está executando o Android 5.0 (mais algumas adições proprietárias da LG, eu acho), mas a pergunta é para todas as versões do Android, é claro.

Existe um procedimento padrão para instalar ferramentas nativas / CLI (como find) no Android? (Um gerenciador de pacotes? ) E, de qualquer maneira, como fazê-lo da maneira mais correta?

Nome em Exibição
fonte
Sim, este dispositivo está enraizado. Mas também é interessante conhecer formas compatíveis com não raiz. :)
Nome de exibição

Respostas:

5

Para dispositivos Android enraizados

Você pode instalar o aplicativo BusyBox de Stephen. Por Play Store, a versão mínima do Android suportada pelo aplicativo é o Android 1.6 e é um aplicativo bem atualizado. Em essência, ele instala o binário do busybox/system/xbin e coloca links simbólicos no mesmo diretório para todos os utilitários que possui.

O que é o BusyBox (não o aplicativo)?

O BusyBox combina pequenas versões de muitos utilitários UNIX comuns em um único pequeno executável. Ele fornece substituições para a maioria dos utilitários que você normalmente encontra nos arquivos GNU, shellutils etc. Os utilitários do BusyBox geralmente têm menos opções do que seus primos GNU completos; no entanto, as opções incluídas fornecem a funcionalidade esperada e se comportam de maneira semelhante aos seus equivalentes GNU. O BusyBox fornece um ambiente bastante completo para qualquer sistema pequeno ou incorporado.

Aqui está a lista oficial de utilitários que ele fornece. findferramenta pode ser encontrada lá.

Uma alternativa competente ao BusyBox é o Toybox, que substituiu o Toolbox na versão Marshmallow.

O que é o Toybox ?

O Toybox combina muitos utilitários comuns de linha de comando do Linux em um único executável licenciado por BSD. É simples, pequeno, rápido e razoavelmente compatível com os padrões ( POSIX-2008 e LSB 4.1 ).

Aqui está a lista oficial de utilitários compatíveis com toybox. No momento, o BusyBox parece oferecer suporte a mais ferramentas que o Toybox.

Não acho que exista um aplicativo para instalar o binário do Toybox, portanto, você pode usar minha resposta aqui para fins de instalação. Observe que a resposta pode ser usada para a instalação do Toybox e do BusyBox. O único pré-requisito é baixar o binário de fontes oficiais.

Links para download oficiais:

Para dispositivos Android sem raiz

Não sei se existe uma abordagem universal para todas as versões do Android. Dito isto, para o Android 4.0 ou superior, o BusyBox Install (No Root) afirma funcionar. Pode haver alguns aplicativos de terminal que acompanham o binário BusyBox. Eu não testei pessoalmente nenhum desses aplicativos de terminal, mas é fácil entender que a maior desvantagem deles é: você não pode fazer nenhum ou muito bom uso deles usando .

Existe uma abordagem no entanto, que parece funcionar para qualquer versão do Android acima da 4.2 (com base nos meus testes). /data/local/tmpé um diretório que pode ser editado pelo shellusuário. adb shellconcede a você o shell remoto no dispositivo e efetua login como o mesmo usuário.

Tudo o que você precisa fazer é colocar o binário BusyBox / Toybox /data/local/tmpe criar links simbólicos para os utilitários no mesmo diretório. Você pode usar as seguintes etapas para isso.

(Requer configuração no PC.)

adb push LOCAL_FILE / data / local / tmp / # substitua LOCAL_FILE pelo caminho do arquivo do binário toybox / busybox no PC
shell adb
chmod 755 / data / local / tmp / FILE # configurando a permissão apropriada no arquivo binário enviado. Substitua FILE pelo nome do binário que você enviou na primeira etapa. Recomendado é usar uma única palavra como nome com todas as letras minúsculas
box = / data / local / tmp / FILE # configurando uma variável local para uso na próxima etapa. Substitua FILE conforme apropriado
$ box | $ box sed 's / \ / \ n / g' | $ box sed '$ d' | enquanto lê linha; faça $ box ln -sf / data / local / tmp / FILE / data / local / tmp / $ line; done # Estamos executando o binário referido por $ box para listar todos os utilitários, seguido pela criação de uma lista e, em seguida, para cada item da lista, criando um link simbólico em um diretório.

Izzy recomendou a maneira mais direta de colocar links simbólicos para o binário do BusyBox .

shell adb / data / local / tmp / FILE --install -s / data / local / tmp / # Substitua FILE conforme apropriado. --install -s criará links simbólicos desejados para você em um diretório. O caminho do diretório é fornecido próximo a ele. 

Todas essas ferramentas agora podem ser acessadas usando o caminho absoluto /data/local/tmp/TOOL. Substitua TOOL pelo nome do utilitário. Exemplo de uso do comando find:

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

Para sessões de shell interativas, você pode adicionar o local de FILE em $ PATH usando o comando export:

exportar PATH = / data / local / tmp: $ PATH # é o prefixo / data / local / tmp para o valor existente de $ PATH. a exportação garantiria que as subconchas vejam o mesmo valor em $ PATH

Feito isso, agora você pode usar o find ou outro utilitário BusyBox / Toybox desta maneira:

shell adb 
find --help

Deve- se notar que as alterações no $ PATH são aplicáveis ​​apenas à sessão atual do shell. Isso significa que toda vez que você inicia um shell usando adb, é necessário exportar $ PATH.

Dito isso, não há solução apenas para Android para sessões de shell não interativas além de encontrar uma maneira de criar uma variável cuja existência e valor persistam além da atual sessão de shell no seu PC, não no Android . Exemplo:

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)
Senhor do Fogo
fonte
As ferramentas que não são encontradas no busybox e toybox, você precisará construí-las para o Android, se ainda não tiver sido criada por alguém e postada em um local confiável em que você possa confiar, poderá baixar e instalar.
Firelord