Como instalar as ferramentas de compilação do SDK do Android na linha de comando?

292

Desejo configurar o ambiente de desenvolvimento Android na linha de comando e encontrar o seguinte problema:

wget http://dl.google.com/android/android-sdk_r22.0.5-linux.tgz

depois de extrair o arquivo, execute

tools/android update sdk --no-ui

No entanto, é muito lento ao executar

Fetching https://dl-ssl.google.com/android/repository/addons_list-2.xml

O resultado é que nada na pasta build-tools, e eu quero, é aapt e apkbuilder, já que eu quero criar apk a partir da linha de comando sem form.

Zhenguo Yang
fonte

Respostas:

479

Por padrão, o SDK Manager da linha de comando não inclui as ferramentas de criação na lista. Eles estão na categoria "obsoleto". Para ver todos os downloads disponíveis, use

android list sdk --all

E, para obter um dos pacotes nessa lista na linha de comando, use:

android update sdk -u -a -t <package no.>

Onde -u significa --no-ui, -a significa --all e -t significa --filter.

Se você precisar instalar vários pacotes, faça:

atualização do Android sdk -u -a -t 1,2,3,4, .., n 

Onde 1,2, .., n é o número do pacote listado com o comando list acima

nsg
fonte
4
Se estiver faltando ferramentas de construção como 18.1.1, este é o caminho certo para instalá-lo usando a linha de comando.
Cray
19
é meio chato, eles não mencionaram a --allopção nas dicas oficiais . Obrigado.
Alexander Malakhov
4
@DanielJonker Sim, é. Apenas echo "yes" ao comando, ou seja, echo yes | android atualização SDK --all --filter ferramentas --no-ui --force> / dev / null
NSG
4
echo "yes"pode ser reduzido para echo "y", mas isso não funciona em todos os casos. Em alguns casos, você pode obter mais de um prompt de licença de y / n, dependendo do filtro e dos pacotes específicos. echo "y"responderá apenas ao primeiro prompt, mas não ao restante. Estou tentando fazê-lo funcionar com yescomando sem sucesso até agora.
I4niac
3
@AlexanderMalakhov Concordo que, se o seu sistema operacional host tiver o utilitário, usá-lo é a melhor opção. Eu olhei para o expectativa primeiro, mas no meu caso eu tenho que executar o script em uma certa distribuição Linux em execução na nuvem da AWS. Essa distribuição não tem expectativa de instalação e eu não tenho direitos suficientes para instalá-la como parte do plano de compilação. Depois de olhar em volta, a melhor solução que encontrei é <pre> <code> # atualizar o SDK do Android no servidor sem cabeça FILTER = ferramenta, plataforma, android-20 (sono 5 e enquanto [1]; sono 1; eco; feito) ) \ | atualização do android sdk --no-ui --all \ --filter $ {FILTER} </code> </pre>
i4niac
140

Como mencionado em outras respostas, você pode usar a --filteropção para limitar os pacotes instalados:

android update sdk --filter ...

As outras respostas não mencionam que você pode usar identificadores de string constantes em vez de índices (que serão alterados) para as opções de filtro. Isso é útil para instalações autônomas ou com script. Homem por --filteropção:

... Isso também aceita os identificadores retornados por 'list sdk --extended'.

android list sdk --all --extended :

Packages available for installation or update: 97
----------
id: 1 or "tools"
     Type: Tool
     Desc: Android SDK Tools, revision 22.6.2
----------
id: 2 or "platform-tools"
     Type: PlatformTool
     Desc: Android SDK Platform-tools, revision 19.0.1
----------
id: 3 or "build-tools-19.0.3"
     Type: BuildTool
     Desc: Android SDK Build-tools, revision 19.0.3

Em seguida, você pode usar os IDs de string como opções de filtro para especificar com precisão as versões desejadas:

android update sdk --filter tools,platform-tools,build-tools-19.0.3 etc

robd
fonte
27
+1 para a --extendedopção, deixando claro o que instalar nos scripts de IC.
Nhaarman 31/05
16
android updatetambém exigirá a --allopção, caso contrário, a ajuda de uso será exibida. Por exemplo: android update sdk --no-ui --all --filter build-tools-21.1.0(e +1 para a --extendedopção que permite que você veja os pseudônimos como build-tools-21.1.0)
Petrus Repo
1
Onde está o homem para as opções --filtere --extended?
Ciro Santilli escreveu
2
Concordo que é muito melhor usar a string do que o número, que não é fixo.
25816 wisbucky
1
Eu estava procurando por essa --extendedopção para poder escrever um script e usá-lo no meu Continuous Integration Server, onde ele pode atualizar os recursos do sdk. Boa dica!
Osayilgan # 7/16
73

A versão 25.2.3 (e superior) do Android SDK Toolspacote contém uma nova ferramenta - sdkmanager - que simplifica esta tarefa de instalar ferramentas de construção a partir da linha de comandos.
Está localizado na android_sdk/tools/binpasta

Uso (da documentação ):

sdkmanager packages [options]

O packagesargumento é um caminho no estilo SDK, entre aspas (por exemplo, "build-tools;25.0.0"ou "platforms;android-25"). Você pode passar vários caminhos de pacote, separados por um espaço, mas cada um deles deve ser agrupado em seu próprio conjunto de cotações.

Exemplo de uso (no meu Mac):

alex@mbpro:~/sdk/tools/bin$ ls ../../build-tools/  
25.0.0/   
alex@mbpro:~/sdk/tools/bin$ ./sdkmanager "build-tools;25.0.2"  
done   
alex@mbpro:~/sdk/tools/bin$ ls ../../build-tools/  
25.0.0/ 25.0.2/

Você também pode especificar várias opções , por exemplo, para forçar todas as conexões a usar HTTP ( --no_https) ou para usar o servidor proxy ( --proxy_host=addresse --proxy_port=port).

Para verificar as opções disponíveis, use a --helpbandeira. Na minha máquina (Mac), a saída é a seguinte:

alex@mbpro:~/sdk/tools/bin$ ./sdkmanager --help
Usage: 
  sdkmanager [--uninstall] [<common args>] \
    [--package_file <package-file>] [<packages>...]
  sdkmanager --update [<common args>]
  sdkmanager --list [<common args>]

In its first form, installs, or uninstalls, or updates packages.
    <package> is a sdk-style path (e.g. "build-tools;23.0.0" or 
             "platforms;android-23").
    <package-file> is a text file where each line is a sdk-style path
                   of a package to install or uninstall.
    Multiple --package_file arguments may be specified in combination
     with explicit paths.
In its second form (with --update), currently installed packages are
    updated to the latest version.
In its third form, all installed and available packages are printed out.

Common Arguments:
    --sdk_root=<sdkRootPath>: Use the specified SDK root instead of the SDK containing this tool
    --channel=<channelId>: Include packages in channels up to <channelId>.
                           Common channels are:
                           0 (Stable), 1 (Beta), 2 (Dev), and 3 (Canary).

    --include_obsolete: With --list, show obsolete packages in the
                        package listing. With --update, update obsolete
                        packages as well as non-obsolete.
    --no_https: Force all connections to use http rather than https.
    --proxy=<http | socks>: Connect via a proxy of the given type.
    --proxy_host=<IP or DNS address>: IP or DNS address of the proxy to use.
    --proxy_port=<port #>: Proxy port to connect to.

* If the env var REPO_OS_OVERRIDE is set to "windows",
  "macosx", or "linux", packages will be downloaded for that OS.
Alex Lipov
fonte
1
Alguém mais está recebendo Warning: Unknown argument --package_file?
11137 ulidtko
3
@ulidtko Há um erro na documentação de uso. A maneira correta é acrescentar o sinal de igual, por exemplo --package_file=packages.txt.
Alex Lipov
Infelizmente, isso não simplifica a tarefa de instalação. Nem todos os programadores do Android realizam suas programações no Linux sem GUI. Alguns de nós fazem isso no Windows e preferem uma interface do usuário executada como qualquer outro aplicativo do Windows. Isso está se movendo para trás em vez de avançar
AaA
2
@AaA Simplifica a tarefa de instalação a partir da linha de comando . O OP declarou explicitamente que ele está procurando uma solução de linha de comando e, portanto, seu comentário é irrelevante nesse contexto.
Alex Lipov 27/02/19
55

As ferramentas de compilação do ADB não serão baixadas automaticamente, por comando android update sdk --no-ui

Portanto, para instalar o tipo Buil-Tool (no console):

android list sdk --all

Lembre-se do número listado antes do item e execute o seguinte:

android update sdk -u --all --filter <number>

Os comandos devem ser digitados em / YourFolder / android-sdk-linux / tools

Também para pasta remota (servidor aberto por ssh, por exemplo), digite:

**./android** list sdk --all
**./android** update sdk -u --all --filter <number>

Para uma lista simples de pacotes ADB, digite no terminal:

android list sdk

para instalar todos os pacotes:

android update sdk --no-ui

Ou com filtros (vírgula é separador):

android update sdk --no-ui --filter 3,5,8,14
Flinbor
fonte
para sdks obsoletos antigos, você deve usar --all. por exemplo, atualização do android sdk --no-ui --all --filter 27 para instalar a plataforma-8
fluke
Como o instalador do SDK continuava travando quando eu estava usando a GUI, tive que mudar para a linha de comando, então isso realmente ajudou. Obrigado.
Yvonne Aburrow
32

Uma excelente fonte de informações que encontrei ao tentar instalar tudo o que o Android SDK relacionava a partir da linha de comando, era esse Dockerfile. Dentro do Dockerfile, você pode ver que o autor executa um único comando para instalar platform toolse build toolssem nenhuma outra interação. No caso de o OP apresentar, o comando seria adaptado para:

echo y | $ANDROID_HOME/tools/android update sdk --all --filter build-tools-21.1.0 --no-ui
geo e
fonte
E se eu não quiser todos os pacotes? Só quero 21.1.0 .
IgorGanapolsky
@IgorGanapolsky Talvez você deve tentar sem a --allbandeira
geoand
21

Eu apenas tive um bom tempo obtendo dependências sdk do Android instaladas via linha de comando e, como a documentação que acompanha as ferramentas e on-line está muito ausente, pensei em publicar o que descobri aqui.

Estou trabalhando android sdk r24.4.1para linux. Existem dois comandos que você pode executar para listar os pacotes disponíveis:

android list sdk

e o mais exaustivo:

android list sdk --all

Os números de pacotes para pacotes específicos diferem para cada comando acima! Por exemplo, o primeiro lista o pacote API 23.1 revision 3como pacote #3e o último o lista como #29.

Agora, existem duas maneiras diferentes de instalar usando o comando android.

tools/android update sdk --no-ui --filter <package number>

e

tools/android update sdk -u -a -t <package number>

Dado que cada um dos comandos de instalação pode levar o número do pacote como parâmetro, qual número de pacote você usa? Após muita pesquisa on-line, tentativa e erro, descobri que

android update sdk --no-ui --filter usa os números de pacote de android list sdk

e

android update sdk -u -a -t usa os números de pacote de android list sdk --all

Em outras palavras - para instalar, API 23.1 revision 3você pode:

android update sdk --no-ui --filter 3

ou

android update sdk -u -a -t 29

Louco, mas funciona.

lps
fonte
1
-aé a versão curta de --all, é por isso que ele está usando esse número de pacote. ( -uÉ curto para --no-uie -té curto para --filter.)
darthmaim
Eu acredito no que diz o Ips. O Google é conhecido por não manter o usage()texto atualizado com a realidade.
Not2qubit #
no ubuntu, executei: $ echo y | $ ANDROID_HOME / tools / atualização do android sdk -u -a -t 27 Agora, como confirmar se fui atualizado para o Android 8?
Ashish Karpe
$ ANDROID_HOME / tools / lista android alvo | grep "Baseado no Android" Baseado no Android 4.0.3 (nível API 15) Baseado no Android 4.1.2 (nível API 16) Baseado no Android 4.2.2 (nível API 17) Baseado no Android 4.3.1 (nível API 18) Baseado no Android 4.4.2 (nível API 19) Baseado no Android 4.4.2 (nível API 19) Baseado no Android 5.0.1 (nível API 21) Baseado no Android 5.1.1 (nível API 22) Baseado no Android 6.0 (API) nível 23) Baseado no Android 7.0 (API nível 24)
Ashish Karpe
Causa ao executar: $ ANDROID_HOME / tools / lista android sdk Pacotes disponíveis para instalação ou atualização: 1 1- Plataforma SDK Android 8.1.0, API 27, revisão 1
Ashish Karpe
20

A maioria das respostas parece ignorar o fato de que talvez você precise executar a atualização em um ambiente decapitado sem direitos de superusuário, o que significa que o script precisa responder a todos os y/nprompts de licença automaticamente.

Aqui está o exemplo que faz o truque.

FILTER=tool,platform,android-20,build-tools-20.0.0,android-19,android-19.0.1

( sleep 5 && while [ 1 ]; do sleep 1; echo y; done ) \
    | android update sdk --no-ui --all \
    --filter ${FILTER}

Não importa quantas solicitações você receba, todas elas serão respondidas. Esse while/sleeploop se parece com a simulação do comando yes e, de fato, é quase bom . O problema yesé que ele inunda stdout com'y' e não há praticamente nenhum atraso entre o envio desses caracteres e a versão com a qual eu tive que lidar não tinha nenhuma opção de tempo limite de nenhum tipo. Ele "poluirá" o stdout e o script falhará ao reclamar de entrada incorreta. A solução é adiar o envio 'y'para stdout, e é exatamente isso que a while/sleepcombinação faz.

expect não está disponível por padrão em algumas distribuições linux e eu não tinha como instalá-lo como parte dos meus scripts de IC; portanto, tive que usar a solução mais genérica e nada pode ser mais genérico do que o simples script bash, certo?

Por uma questão de fato, eu escrevi sobre o blog ( NSBogan ), confira mais detalhes aqui, se você estiver interessado.

i4niac
fonte
--all instalará todos os SDK possíveis. Não é o ideal se você deseja limitar a um filtro específico.
IgorGanapolsky
17

Se você sdkmanagerinstalou (estou usando MAC)

execute sdkmanager --listpara listar os pacotes disponíveis.

Se você deseja instalar ferramentas de construção, copie a versão preferida da lista de pacotes disponíveis.

Para instalar a versão preferida, execute

sdkmanager "build-tools;27.0.3"
Lasithds
fonte
1
Obrigado. Funciona! O comando "android" está obsoleta agora com a versão mais recente do Android-SDK, temos que usar ./sdkmanager do ferramentas / / bin
JLavoie
8

No entanto, é muito lento ao executar

Sim, tive o mesmo problema. Alguns dos downloads de arquivos são extremamente lentos (ou pelo menos foram nos últimos dois dias). Se você deseja fazer o download de tudo, não há muito o que fazer sobre isso.

O resultado é que nada na pasta build-tools, e eu quero, é aapt e apkbuilder, já que eu quero criar apk a partir da linha de comando sem form.

Você deixou a execução completa?

Uma coisa que você pode fazer é filtrar os pacotes que estão sendo baixados usando o -tswitch.

Por exemplo:

tools/android update sdk --no-ui -t platform-tool

Quando tentei isso outro dia, obtive a versão 18.0.0 das ferramentas de compilação instaladas. Por algum motivo, a versão mais recente 18.0.1 não está incluída nesse filtro e a única maneira de obtê-lo era instalar tudo com o --allcomutador.

Dan Dyer
fonte
2
Execute isso para obter os filtros disponíveis: "android update sdk -h" ... Um filtro que limita a atualização aos tipos de pacotes especificados na forma de uma lista separada por vírgula de [plataforma, imagem do sistema, ferramenta, plataforma -ferramenta, doc, amostra, fonte]. Isso também aceita os identificadores retornados por 'list sdk --extended'.
aleb
6

Eu prefiro colocar um script que instale minhas dependências

Algo como:

#!/usr/bin/env bash
#
# Install JUST the required dependencies for the project.
# May be used for ci or other team members.
#

for I in android-25 \
         build-tools-25.0.2  \
         tool \
         extra-android-m2repository \
         extra-android-support \
         extra-google-google_play_services \
         extra-google-m2repository;

 do echo y | android update sdk --no-ui --all --filter $I ; done

https://github.com/caipivara/android-scripts/blob/master/install-android-dependencies.sh

Daniel Gomez Rico
fonte
Obrigado, ajuda para me poupar muito tempo.
utzcoz
4

Acabei de ter esse problema, então finalmente escrevi uma solução de 1 linha do bash dirty lendo e analisando a lista de ferramentas disponíveis:

 tools/android update sdk -u -t $(android list sdk | grep 'Android SDK Build-tools' | sed 's/ *\([0-9]\+\)\-.*/\1/')
Aurélien Lambert
fonte
Mudei meu projeto para executar serviços, ele solicitou licenças de muito mais do que apenas criar ferramentas, portanto essa solução é muito limitada.
Nurettin
Se sente muito mais determinista do que os índices que podem mudar ao longo do tempo como as versões evoluir ...
Augustin Riedinger
4

Inspirado nas respostas de @ i4niac e @ Aurélien Lambert, é isso que eu criei

csv_update_numbers=$(./android list sdk --all | grep 'Android SDK Build-tools' | grep -v 'Obsolete' | sed 's/\(.*\)\- A.*/\1/'|sed '/^$/d'|sed -e 's/^[ \t]*//'| tr '\n' ',')
csv_update_numbers_without_trailing_comma=${csv_update_numbers%?}

( sleep 5 && while [ 1 ]; do sleep 1; echo y; done ) \
    | ./android update sdk --all -u -t $csv_update_numbers_without_trailing_comma

Explicação

  • obtenha uma lista de números separados por vírgula, que são os índices dos pacotes de ferramentas de construção no resultado do android list sdk --allcomando (Ignorando pacotes obsoletos).
  • continue jogando y's no terminal a cada poucos milissegundos para aceitar as licenças.
Vinay W
fonte
4

Faça o download do Android SDK em developer.android.com (atualmente é um arquivo de 149mb para Windows OS). Vale ressaltar que o Android removeu a GUI do sdkmanager, mas possui uma versão em linha de comando do sdkmanager na pasta bin, localizada dentro da pasta tools.

  1. Quando estiver dentro da pasta bin, mantenha pressionada a tecla Shift, clique com o botão direito do mouse e selecione abrir linha de comando aqui. Shift + clique direito >> abrir linha de comando aqui.
  2. Quando a linha de comando abrir, digite sdkmanagerclique em Enter.
  3. Em seguida, execute tipo sdkmanager(espaço), hífen duplo ( --), lista de tipos sdkmanager --list (lista todos os pacotes no gerenciador do SDK)
  4. Digite sdkmanager (space) e, em seguida, nome do pacote, pressione enter. Por exemplo. sdkmanager platform-tools (pressione enter) Carregará o contrato de licença. Com opções (s / n). Digite y para aceitar e ele fará o download do pacote que você especificou.

Para mais referência, siga o documento oficial aqui

Eu espero que isso ajude. :)

philemon uchechukwu
fonte
4

O comando "android" está obsoleto.

Para ferramentas de linha de comando, use tools / bin / sdkmanager e tools / bin / avdmanager

Se você não precisar do Android Studio, poderá fazer o download das ferramentas básicas de linha de comando do Android em developer.android.com na seção Somente ferramentas de linha de comando .

da CLI, deve parecer algo como:

curl --output sdk-tools-linux.zip https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip

ou

wget --output-document sdk-tools-linux.zip https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip

Depois disso, descompacte o arquivo na pasta de destino

unzip sdk-tools-linux.zip

E agora podemos instalar tudo o que você precisa ...

./tools/bin/sdkmanager --install 'build-tools;29.0.2' 'platform-tools' 'platforms;android-29' 'tools'

Você pode obter uma lista completa de pacotes usando o comando ./tools/bin/sdkmanager --list

Alguns pacotes exigem a aceitação do contrato de licença. você pode aceitá-lo interativamente ou simplesmente passar "y" para o fluxo de entrada, como este (dois contratos no caso):

echo -ne "y\ny" | ./tools/bin/sdkmanager --install 'system-images;android-29;default;x86_64'

E, é claro, para sua conveniência, você pode exportar variáveis ​​como ANDROID_HOME ou ANDROID_SDK_ROOT (incluindo fazê-lo em ~ / .profile ou ~ / .bash_profile) ou corrigir a variável PATH - tudo isso a seu critério.

Exemplo de script:

mkdir /opt/android-sdk
cd /opt/android-sdk
curl --output sdk-tools-linux.zip https://dl.google.com/android/repository/sdk-tools-linux-4333796.zip
unzip sdk-tools-linux.zip
echo -ne "y" | ./tools/bin/sdkmanager --install 'build-tools;29.0.2' 'platform-tools' 'platforms;android-29' 'tools'

Requisitos: enrolar (ou wget) e descompactar

Solução de problemas:

se Warning: Could not create settingsvir, você precisa ter o toolsdiretório dentro do cmdline-toolsdiretório dentro do ANDROID_HOME (crie-o se necessário com esse nome exato), consulte Ferramentas de linha de comando do Android sdkmanager sempre mostra: Aviso: não foi possível criar configurações

Максим Шатов
fonte
2

As ferramentas de compilação não puderam ser baixadas automaticamente por padrão, como Nate disse em https://stackoverflow.com/a/19416222/1104031 post.

Mas eu escrevi uma pequena ferramenta que faz tudo para você

Eu usei a ferramenta "expect" como danb no post https://stackoverflow.com/a/17863931/1104031 . Você só precisa android-SDK e python27, expect.

Este script instalará todas as ferramentas de construção, todos os sdks e tudo o que você precisa para a construção automatizada:

import subprocess,re,sys

w = subprocess.check_output(["android", "list", "sdk", "--all"])
lines = w.split("\n")
tools = filter(lambda x: "Build-tools" in x, lines)
filters = []
for tool in tools:
  m = re.search("^\s+([0-9]+)-", tool)
  tool_no = m.group(1)
  filters.append(tool_no)

if len(filters) == 0:
  raise Exception("Not found build tools")


filters.extend(['extra', 'platform', 'platform-tool', 'tool'])

filter = ",".join(filters)

expect= '''set timeout -1;
spawn android update sdk --no-ui --all --filter %s;
expect {
  "Do you accept the license" { exp_send "y\\r" ; exp_continue }
  eof
}''' % (filter)

print expect

ret = subprocess.call(["expect", "-c", expect])
sys.exit(ret)
Jacek Marchwicki
fonte
Que tal echo "yes" | ./android update sdk --no-https --no-ui --filter 1,6?
schemacs
1
Corrija-me se eu estiver errado, mas parece que este script baixa novamente tudo toda vez que é executado. Eu tentei com o parâmetro -u, mas ele não pareceu funcionar: /
gbero
1

Conforme declarado em outras respostas, as ferramentas de construção requerem a instalação do --allsinalizador. Também é melhor usar um -tsinalizador de filtro para evitar a instalação de TODOS os pacotes, mas não há como filtrar todas as ferramentas de construção.

Já existem solicitações de recursos para esses dois pontos no rastreador de erros do AOSP. Sinta-se livre para votar neles, isso pode fazê-los acontecer algum dia:

Sylfo
fonte
1

Eu tentei isso para atualizar tudo, e funcionou!

echo y | $ANDROID_HOME/tools/android update sdk --no-ui
Ting
fonte
0

Experimentar

1. Liste todos os pacotes

android list sdk --all

2. Instale pacotes usando o seguinte comando

android update sdk -u -a -t package1, package2, package3 //comma seperated packages obtained using list command 
Pehlaj - Desenvolvedor de aplicativos móveis
fonte
-1

android update sdk

Este comando atualizará e instalará todas as versões mais recentes das ferramentas SDK Tools, Build Tools, SDK Platform.

É trabalho para mim.

Chirag
fonte