Come installare Android SDK Build Tools sulla riga di comando?


292

Voglio configurare l'ambiente di sviluppo Android dalla riga di comando e riscontrare il seguente problema:

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

dopo aver estratto il file, eseguire

tools/android update sdk --no-ui

Tuttavia, l'esecuzione è troppo lenta

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

Il risultato è che nulla negli strumenti di compilazione delle cartelle e che voglio è aapt e apkbuilder, poiché voglio creare apk dalla riga di comando senza formica.

Risposte:


479

Per impostazione predefinita, SDK Manager dalla riga di comando non include gli strumenti di compilazione nell'elenco. Sono nella categoria "obsoleta". Per vedere tutti i download disponibili, utilizzare

android list sdk --all

E quindi per ottenere uno dei pacchetti in quell'elenco dalla riga di comando, utilizzare:

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

Dove -u sta per --no-ui, -a sta per --all e -t sta per --filter.

Se è necessario installare più pacchetti:

aggiornamento android sdk -u -a -t 1,2,3,4, .., n 

Dove 1,2, .., n è il numero del pacchetto elencato con il comando list sopra


4
Se ti mancano strumenti di compilazione come 18.1.1, questo è il modo giusto per installarlo usando la riga di comando.
Cray,

19
fa un po 'schifo, non hanno menzionato l' --allopzione nei consigli ufficiali . Grazie.
Alexander Malakhov,

4
@DanielJonker Sì, lo è. Basta echo "yes" al comando, ovvero echo yes | android update sdk --all --filter tools --no-ui --force> / dev / null
nsg

4
echo "yes"può essere abbreviato echo "y", ma comunque non funziona in tutti i casi. In alcuni casi è possibile ottenere più di un prompt di licenza y / n, a seconda del filtro e dei pacchetti specifici. echo "y"risponderà solo al primo prompt, ma non al resto. Sto provando a farlo funzionare con yescomando senza successo finora.
i4niac,

3
@AlexanderMalakhov Sono d'accordo, se il tuo SO host ha l'utilità, usarla è l'opzione migliore. Prima ho aspettato, ma nel mio caso devo eseguire lo script su un determinato distributore Linux in esecuzione nel cloud AWS. Quella distro non si aspetta che sia installata e non ho abbastanza diritti per installarla come parte del piano di compilazione. Dopo aver guardato intorno, la migliore soluzione che ho trovato è <pre> <code> # aggiorna SDK Android sul server senza testa FILTER = strumento, piattaforma, android-20 (sleep 5 && while [1]; do sleep 1; echo y; done ) \ | aggiornamento android sdk --no-ui --all \ --filter $ {FILTER} </code> </pre>
i4niac

140

Come menzionato in altre risposte, è possibile utilizzare l' --filteropzione per limitare i pacchetti installati:

android update sdk --filter ...

Le altre risposte non menzionano che è possibile utilizzare identificatori di stringa costanti anziché indici (che cambieranno) per le opzioni di filtro. Ciò è utile per installazioni non presidiate o con script. Uomo per --filteropzione:

... Questo accetta anche gli identificatori restituiti da '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

Quindi è possibile utilizzare gli ID stringa come opzioni di filtro per specificare con precisione le versioni desiderate:

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


27
+1 per l' --extendedopzione, chiarendo cosa installare per gli script CI.
nhaarman,

16
android updaterichiederà anche l' --allopzione, altrimenti verrà visualizzata la guida all'uso. Ad esempio: android update sdk --no-ui --all --filter build-tools-21.1.0(e +1 per l' --extendedopzione che ti permette di vedere gli alias simili build-tools-21.1.0)
Petrus Repo,

1
Dov'è l'uomo per le opzioni --filtere --extended?
Ciro Santilli 10 冠状 病 六四 事件 法轮功

2
Sono d'accordo che è molto meglio usare la stringa piuttosto che il numero, che non è stato risolto.
Wisbucky,

1
Stavo cercando --extendedquell'opzione per poter scrivere uno script e usarlo nel mio Continuous Integration Server dove può aggiornare le risorse SDK stesso. Bel consiglio!
Osayilgan,

73

La versione 25.2.3 (e successive) del Android SDK Toolspacchetto contiene un nuovo strumento - sdkmanager - che semplifica questa attività di installazione di strumenti di build dalla riga di comando.
Si trova nella android_sdk/tools/bincartella.

Utilizzo (dalla documentazione ):

sdkmanager packages [options]

L' packagesargomento è un percorso in stile SDK, racchiuso tra virgolette (ad esempio, "build-tools;25.0.0"o "platforms;android-25"). È possibile passare più percorsi di pacchetto, separati da uno spazio, ma ognuno di essi deve essere racchiuso nel proprio set di virgolette.

Esempio di utilizzo (sul mio 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/

È inoltre possibile specificare varie opzioni , ad esempio per forzare tutte le connessioni a utilizzare HTTP ( --no_https) o per utilizzare il server proxy ( --proxy_host=addresse --proxy_port=port).

Per verificare le opzioni disponibili, utilizzare la --helpbandiera. Sul mio computer (Mac), l'output è il seguente:

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.

1
Qualcun altro sta ottenendo Warning: Unknown argument --package_file?
Ulidtko

3
@ulidtko C'è un bug nella documentazione di utilizzo. Il modo corretto è quello di aggiungere il segno di uguale, ad es --package_file=packages.txt.
Alex Lipov,

Purtroppo non semplifica l'installazione. Non tutti i programmatori Android eseguono le loro programmazioni su Linux senza GUI. Alcuni di noi lo fanno su Windows e preferiscono un'interfaccia utente che funziona come qualsiasi altra applicazione Windows. Si sta spostando indietro invece che in avanti
AaA

2
@AaA Semplifica l'attività di installazione dalla riga di comando . OP ha dichiarato esplicitamente che sta cercando una soluzione a riga di comando , e quindi il tuo commento è irrilevante in questo contesto.
Alex Lipov,

55

ADB Build-Tools non verrà scaricato automaticamente, con il comando android update sdk --no-ui

Quindi, per installare il tipo Buil-Tool (nella console):

android list sdk --all

Ricorda il numero elencato prima dell'elemento ed esegui quanto segue:

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

i comandi devono essere digitati in / YourFolder / android-sdk-linux / tools

Anche per cartella remota (server aperto da ssh per esempio) digitare:

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

Per un semplice elenco di pacchetti ADB digitare nel terminale:

android list sdk

per installare tutti i pacchetti:

android update sdk --no-ui

O con filtri (la virgola è un separatore):

android update sdk --no-ui --filter 3,5,8,14

per i vecchi sdk obsoleti devi usare --all. ad esempio aggiornamento android sdk --no-ui --all - filtro 27 per installare platform-8
fluke

dal momento che il programma di installazione dell'SDK continuava a bloccarsi quando stavo usando la GUI, ho dovuto passare alla riga di comando, quindi questo mi ha davvero aiutato. Grazie.
Yvonne Aburrow,

32

Una grande fonte di informazioni che ho trovato mentre cercavo di installare tutto l'SDK di Android relativo alla riga di comando, era questo Dockerfile. All'interno del Dockerfile puoi vedere che l'autore esegue un singolo comando per l'installazione platform toolse build toolssenza altre interazioni. Nel caso in cui l'OP abbia presentato, il comando sarebbe adattato a:

echo y | $ANDROID_HOME/tools/android update sdk --all --filter build-tools-21.1.0 --no-ui

Cosa succede se non desidero tutti i pacchetti? Voglio solo 21.1.0 .
IgorGanapolsky,

@IgorGanapolsky Forse dovresti provare senza la --allbandiera
geoand

21

Ho avuto un sacco di tempo per installare le dipendenze di Android SDK tramite la riga di comando e poiché la documentazione fornita con gli strumenti e online è terribilmente carente, ho pensato di pubblicare ciò che ho scoperto qui.

Sto lavorando con android sdk r24.4.1per linux. Esistono due comandi che è possibile eseguire per elencare i pacchetti disponibili:

android list sdk

e il più completo:

android list sdk --all

I numeri dei pacchetti per pacchetti specifici differiscono per ciascun comando sopra! Ad esempio, il primo elenca il pacchetto API 23.1 revision 3come pacchetto #3e il secondo lo elenca come #29.

Ora, ci sono due modi diversi per installare usando il comando android.

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

e

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

Dato che ciascuno dei comandi di installazione può prendere il pacchetto # come parametro, quale numero di pacchetto usi? Dopo molte ricerche online, prove ed errori, l'ho scoperto

android update sdk --no-ui --filter usa i numeri dei pacchetti da android list sdk

e

android update sdk -u -a -t usa i numeri dei pacchetti da android list sdk --all

In altre parole, per installare API 23.1 revision 3è possibile eseguire:

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

o

android update sdk -u -a -t 29

Pazzo, ma funziona.


1
-aè la versione breve di --all, ecco perché utilizza quel numero di pacchetto. ( -uè l'abbreviazione di --no-uied -tè l'abbreviazione di --filter.)
darthmaim il

Credo a ciò che dice Ips. Google è noto per non mantenere aggiornato il proprio usage()testo con la realtà.
not2qubit

su Ubuntu ho eseguito: $ echo y | $ ANDROID_HOME / tools / android update sdk -u -a -t 27 Ora come confermare che sono stato aggiornato ad Android 8?
Ashish Karpe,

$ ANDROID_HOME / tools / target elenco Android | grep "Basato su Android" Basato su Android 4.0.3 (livello API 15) Basato su Android 4.1.2 (livello API 16) Basato su Android 4.2.2 (livello API 17) Basato su Android 4.3.1 (livello API 18) Basato su Android 4.4.2 (livello API 19) Basato su Android 4.4.2 (livello API 19) Basato su Android 5.0.1 (livello API 21) Basato su Android 5.1.1 (livello API 22) Basato su Android 6.0 (API livello 23) Basato su Android 7.0 (livello API 24)
Ashish Karpe,

Causa quando ho eseguito: $ ANDROID_HOME / tools / android list sdk Pacchetti disponibili per l'installazione o l'aggiornamento: 1 1- Piattaforma SDK Android 8.1.0, API 27, revisione 1
Ashish Karpe

20

La maggior parte delle risposte sembra ignorare il fatto che potrebbe essere necessario eseguire l'aggiornamento in un ambiente senza testa senza diritti di superutente, il che significa che lo script deve rispondere automaticamente a tutte le y/nrichieste di licenza.

Ecco l'esempio che fa il trucco.

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}

Indipendentemente dal numero di richieste ricevute, a tutte queste risposte verrà data risposta. Questo while/sleepciclo sembra una simulazione del comando yes , e in effetti lo è, beh quasi . Il problema yesè che inonda stdout 'y'e non c'è praticamente alcun ritardo tra l'invio di quei personaggi e la versione con cui ho avuto a che fare non ha avuto opzioni di timeout di alcun tipo. "Inquinerà" stdout e lo script non si lamenterà di input errati. La soluzione è di ritardare l'invio 'y'a stdout, ed è esattamente quello che while/sleepfa la combo.

expect non è disponibile per impostazione predefinita su alcune distribuzioni Linux e non ho avuto modo di installarlo come parte dei miei script CI, quindi ho dovuto usare la soluzione più generica e nulla può essere più generico del semplice script bash, giusto?

È un dato di fatto, ho scritto sul blog ( NSBogan ), controlla qui per maggiori dettagli se sei interessato.


--all installerà tutti i possibili SDK. Non è l'ideale se si desidera limitare a un filtro specifico.
IgorGanapolsky,

17

Se hai sdkmanagerinstallato (sto usando MAC)

eseguire sdkmanager --listper elencare i pacchetti disponibili.

Se si desidera installare strumenti di compilazione, copiare la versione preferita dall'elenco dei pacchetti disponibili.

Per installare la versione preferita eseguire

sdkmanager "build-tools;27.0.3"

1
Grazie. Funziona! Il comando "android" ora è deprecato con l'ultima versione di Android-sdk, dobbiamo usare ./sdkmanager dalla directory / tools / bin
JLavoie

8

Tuttavia, l'esecuzione è troppo lenta

Sì, ho avuto lo stesso problema. Alcuni dei download di file sono estremamente lenti (o almeno lo sono stati negli ultimi due giorni). Se vuoi scaricare tutto, non c'è molto che puoi fare al riguardo.

Il risultato è che nulla negli strumenti di compilazione delle cartelle e che voglio è aapt e apkbuilder, poiché voglio creare apk dalla riga di comando senza formica.

L'hai lasciato correre fino al completamento?

Una cosa che puoi fare è filtrare i pacchetti che vengono scaricati usando lo -tswitch.

Per esempio:

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

Quando l'ho provato l'altro giorno ho installato la versione 18.0.0 degli strumenti di compilazione. Per qualche motivo l'ultima versione 18.0.1 non è inclusa da questo filtro e l'unico modo per ottenerlo era installare tutto con lo --allswitch.


2
Esegui questo per ottenere i filtri disponibili: "android update sdk -h" ... Un filtro che limita l'aggiornamento ai tipi di pacchetti specificati sotto forma di un elenco separato da virgole di [piattaforma, immagine di sistema, strumento, piattaforma -tool, doc, sample, source]. Ciò accetta anche gli identificativi restituiti da 'list sdk --extended'.
aleb,

6

Preferisco mettere uno script che installi le mie dipendenze

Qualcosa di simile a:

#!/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


Grazie, aiutami a risparmiare un sacco di tempo.
utzcoz,

4

Ho appena avuto questo problema, quindi ho finalmente scritto una soluzione sporca bash di 1 riga leggendo e analizzando l'elenco di strumenti disponibili:

 tools/android update sdk -u -t $(android list sdk | grep 'Android SDK Build-tools' | sed 's/ *\([0-9]\+\)\-.*/\1/')

Ho convertito il mio progetto in servizi, mi ha chiesto licenze molto più che semplici strumenti di costruzione, quindi questa soluzione è molto limitata.
Nurettin,

Sembra molto più deterministico degli indici che possono cambiare nel tempo con l'evoluzione delle versioni ...
Augustin Riedinger,

4

Ispirato alle risposte di @ i4niac e @ Aurélien Lambert, questo è quello che mi è venuta in mente

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

Spiegazione

  • ottenere un elenco separato da virgole di numeri che sono gli indici dei pacchetti degli strumenti di compilazione nel risultato del android list sdk --allcomando (Ignora i pacchetti obsoleti).
  • continua a lanciare "y" al terminal ogni pochi millisecondi per accettare le licenze.

4

Scarica Android SDK da developer.android.com (al momento è un file 149mb per sistema operativo Windows). È degno di nota che Android ha rimosso la GUI di sdkmanager ma ha una versione da riga di comando di sdkmanager nella cartella bin che si trova all'interno della cartella degli strumenti.

  1. All'interno della cartella bin, tenere premuto il tasto Maiusc, fare clic con il tasto destro, quindi selezionare Apri riga di comando qui. Maiusc + clic destro >> apri la riga di comando qui.
  2. Quando si apre la riga di comando, digitare sdkmanagerfare clic su Invio.
  3. Quindi eseguire type sdkmanager(spazio), doppio trattino ( --), digitare list sdkmanager --list (questo elenca tutti i pacchetti nel gestore SDK)
  4. Digita sdkmanager (spazio) quindi il nome del pacchetto, premi Invio. Per esempio. sdkmanager platform-tools (premi invio) Caricherà il contratto di licenza. Con opzioni (y / n). Immettere y per accettare e scaricherà il pacchetto specificato.

Per ulteriori riferimenti, seguire il documento ufficiale qui

Spero che aiuti. :)


4

Il comando "android" è obsoleto.

Per gli strumenti da riga di comando, usa tools / bin / sdkmanager e tools / bin / avdmanager

Se non è necessario Android Studio, è possibile scaricare gli strumenti di base della riga di comando Android da developer.android.com nella sezione Solo strumenti della riga di comando .

dalla CLI dovrebbe essere somfing come:

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

o

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

Dopodiché basta decomprimere l'archivio nella cartella di destinazione

unzip sdk-tools-linux.zip

E ora possiamo installare tutto il necessario ...

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

Puoi ottenere un elenco completo di pacchetti usando il comando ./tools/bin/sdkmanager --list

Alcuni pacchetti richiedono l'accettazione del contratto di licenza. puoi accettarlo in modo interattivo o semplicemente passare "y" al flusso di input, in questo modo (due accordi nel caso):

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

E, naturalmente, per tua comodità, puoi esportare variabili come ANDROID_HOME o ANDROID_SDK_ROOT (incluso farlo in ~ / .profile o ~ / .bash_profile) o patchare la variabile PATH - tutto questo è a tua discrezione.

Esempio di 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'

Requisiti: arricciare (o wget) e decomprimere

Risoluzione dei problemi:

se vedi Warning: Could not create settings, devi avere la toolsdirectory all'interno della cmdline-toolsdirectory all'interno di ANDROID_HOME (creala se necessario con questo nome esatto) vedi gli strumenti della riga di comando di Android che sdkmanager mostra sempre: Avviso: Impossibile creare le impostazioni


2

Gli strumenti di costruzione non possono essere scaricati automaticamente per impostazione predefinita, come ha detto Nate nel post https://stackoverflow.com/a/19416222/1104031 .

Ma ho scritto un piccolo strumento che fa tutto per te

Ho usato lo strumento "aspetta" come danb nel post https://stackoverflow.com/a/17863931/1104031 . Hai solo bisogno di android-sdk e python27, expect.

Questo script installa tutti gli strumenti di compilazione, tutti gli sdk e tutto il necessario per la compilazione automatizzata:

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)

Che ne dici echo "yes" | ./android update sdk --no-https --no-ui --filter 1,6?
Schemacs

1
Correggimi se sbaglio, ma sembra che questo script scarichi di nuovo tutto ogni volta che viene eseguito. Ho provato con il parametro -u ma non ha funzionato: /
gbero il

1

Come indicato in altre risposte, gli strumenti di compilazione richiedono l' --allinstallazione del flag. È inoltre consigliabile utilizzare un -tflag di filtro per evitare l'installazione di TUTTI i pacchetti, ma non è possibile filtrare tutti gli strumenti di compilazione.

Esistono già richieste di funzionalità per questi due punti nel bug tracker AOSP. Sentiti libero di votare per loro, questo potrebbe farli accadere un giorno:


1

Ho provato questo per aggiornare tutto, e ha funzionato!

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

0

Provare

1. Elenca tutti i pacchetti

android list sdk --all

2. Installare i pacchetti usando il seguente comando

android update sdk -u -a -t package1, package2, package3 //comma seperated packages obtained using list command 

-1

aggiornamento android sdk

Questo comando aggiornerà e installerà tutte le ultime versioni di SDK Tools, Build Tools, SDK Platform Tools.

È lavoro per me.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.