Comment installer Android SDK Build Tools sur la ligne de commande?


292

Je souhaite configurer l'environnement de développement Android à partir de la ligne de commande et rencontrer le problème suivant:

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

après avoir extrait le fichier, exécutez

tools/android update sdk --no-ui

Cependant, son exécution est trop lente

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

Le résultat est que rien dans les outils de construction de dossier, et je veux, n'est aapt et apkbuilder, car je veux construire apk à partir de la ligne de commande sans ant.

Réponses:


479

Par défaut, le SDK Manager à partir de la ligne de commande n'inclut pas les outils de génération dans la liste. Ils sont dans la catégorie "obsolète". Pour voir tous les téléchargements disponibles, utilisez

android list sdk --all

Et puis, pour obtenir l'un des packages de cette liste à partir de la ligne de commande, utilisez:

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

Où -u signifie --no-ui, -a signifie --all et -t signifie --filter.

Si vous devez installer plusieurs packages, procédez comme suit:

mise à jour android sdk -u -a -t 1,2,3,4, .., n 

Où 1,2, .., n est le numéro de package répertorié avec la commande list ci-dessus


4
Si vous manquez des outils de compilation comme 18.1.1, c'est la bonne façon de l'installer en utilisant la ligne de commande.
Cray

19
ça craint un peu, ils n'ont pas mentionné l' --alloption dans les conseils officiels . Je vous remercie.
Alexander Malakhov

4
@DanielJonker Oui, ça l'est. Echo juste "oui" à la commande, ie echo oui | mise à jour android sdk --all --filter tools --no-ui --force> / dev / null
nsg

4
echo "yes"peut être raccourci echo "y", mais cela ne fonctionne pas dans tous les cas de toute façon. Dans certains cas, vous pouvez obtenir plusieurs invites de licence y / n, selon le filtre et les packages spécifiques. echo "y"répondra uniquement à la première invite, mais pas au reste. J'essaie de le faire fonctionner avec la yescommande sans succès jusqu'à présent.
i4niac

3
@AlexanderMalakhov Je suis d'accord, si votre système d'exploitation hôte en a l'utilité, son utilisation est la meilleure option. J'ai regardé attendre d'abord, mais dans mon cas, je dois exécuter le script sur une certaine distribution Linux exécutée dans le cloud AWS. Cette distribution n'a pas prévu d'être installée et je n'ai pas assez de droits pour l'installer dans le cadre du plan de build. Après avoir regardé autour de moi, la meilleure solution que j'ai trouvée est <pre> <code> # update Android SDK on headless server FILTER = tool, platform, android-20 (sleep 5 && while [1]; do sleep 1; echo y; done ) \ | mise à jour android sdk --no-ui --all \ --filter $ {FILTER} </code> </pre>
i4niac

140

Comme mentionné dans d'autres réponses, vous pouvez utiliser l' --filteroption pour limiter les packages installés:

android update sdk --filter ...

Les autres réponses ne mentionnent pas que vous pouvez utiliser des identificateurs de chaîne constants au lieu d'index (qui changeront) pour les options de filtre. Cela est utile pour les installations sans assistance ou par script. Homme pour --filteroption:

... Ceci accepte également les identifiants renvoyés par '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

Ensuite, vous pouvez utiliser les ID de chaîne comme options de filtre pour spécifier précisément les versions que vous souhaitez:

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


27
+1 pour l' --extendedoption, indiquant clairement ce qu'il faut installer pour les scripts CI.
nhaarman

16
android updatenécessitera également l' --alloption, sinon l'aide à l'utilisation s'affiche. Par exemple: android update sdk --no-ui --all --filter build-tools-21.1.0(et +1 pour l' --extendedoption qui vous permet de voir les alias comme build-tools-21.1.0)
Petrus Repo

1
Où est l'homme pour les options --filteret --extended?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

2
Je suis d'accord, c'est beaucoup mieux d'utiliser la chaîne plutôt que le nombre, qui n'est pas fixe.
wisbucky

1
Je cherchais cette --extendedoption pour pouvoir écrire un script et l'utiliser dans mon serveur d'intégration continue où il peut actualiser les ressources sdk lui-même. Bon conseil!
osayilgan

73

La version 25.2.3 (et supérieure) du Android SDK Toolspackage contient un nouvel outil - sdkmanager - qui simplifie cette tâche d'installation des outils de construction à partir de la ligne de commande.
Il se trouve dans le android_sdk/tools/bindossier.

Utilisation (à partir de la documentation ):

sdkmanager packages [options]

L' packagesargument est un chemin de style SDK, entouré de guillemets (par exemple, "build-tools;25.0.0"ou "platforms;android-25"). Vous pouvez transmettre plusieurs chemins d'accès aux packages, séparés par un espace, mais ils doivent chacun être enveloppés dans leur propre ensemble de guillemets.

Exemple d'utilisation (sur mon 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/

Vous pouvez également spécifier diverses options , par exemple pour forcer toutes les connexions à utiliser HTTP ( --no_https), ou pour utiliser le serveur proxy ( --proxy_host=addresset --proxy_port=port).

Pour vérifier les options disponibles, utilisez l' --helpindicateur. Sur ma machine (Mac), la sortie est la suivante:

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
Quelqu'un d'autre reçoit Warning: Unknown argument --package_file?
ulidtko

3
@ulidtko Il y a un bug dans la documentation d'utilisation. La bonne façon consiste à ajouter le signe égal, par exemple --package_file=packages.txt.
Alex Lipov

Malheureusement, cela ne simplifie pas la tâche d'installation. Tous les programmeurs Android ne font pas leurs programmations sur Linux sans interface graphique. Certains d'entre nous le font sous Windows et préfèrent une interface utilisateur qui fonctionne comme toutes les autres applications Windows. Cela recule au lieu d'avancer
AaA

2
@AaA Il simplifie la tâche d'installation à partir de la ligne de commande . OP a explicitement déclaré qu'il recherchait une solution en ligne de commande , et donc votre commentaire n'est pas pertinent dans ce contexte.
Alex Lipov

55

ADB Build-Tools ne sera pas téléchargé automatiquement, par la commande android update sdk --no-ui

Donc, pour installer le type Buil-Tool (dans la console):

android list sdk --all

N'oubliez pas le numéro qui est répertorié avant l'élément et exécutez ce qui suit:

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

les commandes doivent être saisies dans / YourFolder / android-sdk-linux / tools

Aussi pour le dossier distant (serveur ouvert par ssh par exemple) tapez:

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

Pour une liste simple des packages ADB, saisissez dans le terminal:

android list sdk

pour installer tous les packages:

android update sdk --no-ui

Ou avec des filtres (la virgule est le séparateur):

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

pour les anciens sdks obsolètes, vous devez utiliser --all. par exemple, la mise à jour Android sdk --no-ui --all --filter 27 pour installer la plateforme-8
fluke

comme le programme d'installation du SDK ne cessait de planter lorsque j'utilisais l'interface graphique, j'ai dû passer en ligne de commande, donc cela a vraiment aidé. Merci.
Yvonne Aburrow

32

Ce Dockerfile était une excellente source d'informations que j'ai rencontrée en essayant d'installer tout le SDK Android lié à la ligne de commande . À l'intérieur du Dockerfile, vous pouvez voir que l'auteur exécute une seule commande à installer platform toolset build toolssans aucune autre interaction. Dans le cas où l'OP aurait avancé, la commande serait adaptée pour:

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

Et si je ne veux pas tous les packages? Je veux juste 21.1.0 .
IgorGanapolsky

@IgorGanapolsky Vous devriez peut-être essayer sans le --alldrapeau
geoand

21

J'ai juste eu beaucoup de temps à installer les dépendances sdk android via la ligne de commande et comme la documentation fournie avec les outils et en ligne fait cruellement défaut, j'ai pensé publier ce que j'ai découvert ici.

Je travaille avec android sdk r24.4.1pour linux. Il existe deux commandes que vous pouvez exécuter pour répertorier les packages disponibles:

android list sdk

et le plus exhaustif:

android list sdk --all

Les numéros de package pour des packages spécifiques diffèrent pour chaque commande ci-dessus! Par exemple, le premier répertorie le package en API 23.1 revision 3tant que package #3et le second le répertorie en tant que #29.

Maintenant, il existe deux façons différentes d'installer à l'aide de la commande Android.

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

et

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

Étant donné que les commandes d'installation peuvent chacune prendre le package # comme paramètre, quel numéro de package utilisez-vous? Après beaucoup de recherches en ligne et d'essais et d'erreurs, j'ai découvert que

android update sdk --no-ui --filter utilise les numéros de package de android list sdk

et

android update sdk -u -a -t utilise les numéros de package de android list sdk --all

En d'autres termes - pour installer, API 23.1 revision 3vous pouvez faire soit:

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

ou

android update sdk -u -a -t 29

Fou, mais ça marche.


1
-aest la version courte de --all, c'est pourquoi il utilise ce numéro de package. ( -uest l'abréviation de --no-uiet -test l'abréviation de --filter.)
darthmaim

Je crois ce que dit Ips. Google est connu pour ne pas garder son usage()texte à jour avec la réalité.
not2qubit

sur ubuntu j'ai couru: $ echo y | $ ANDROID_HOME / tools / android update sdk -u -a -t 27 Maintenant, comment confirmer que j'ai été mis à jour vers Android 8?
Ashish Karpe,

$ ANDROID_HOME / tools / cible de la liste android | grep "Basé sur Android" Basé sur Android 4.0.3 (API niveau 15) Basé sur Android 4.1.2 (API niveau 16) Basé sur Android 4.2.2 (API niveau 17) Basé sur Android 4.3.1 (API niveau 18) Basé sur Android 4.4.2 (API niveau 19) Basé sur Android 4.4.2 (API niveau 19) Basé sur Android 5.0.1 (API niveau 21) Basé sur Android 5.1.1 (API niveau 22) Basé sur Android 6.0 (API niveau 23) Basé sur Android 7.0 (API niveau 24)
Ashish Karpe

Cause lorsque j'ai exécuté: $ ANDROID_HOME / tools / android list sdk Packages disponibles pour l'installation ou la mise à jour: 1 1- SDK Platform Android 8.1.0, API 27, révision 1
Ashish Karpe

20

La plupart des réponses semblent ignorer le fait que vous devrez peut-être exécuter la mise à jour dans un environnement sans tête sans droits de superutilisateur, ce qui signifie que le script doit répondre à toutes les y/n automatiquement invites de licence.

Voici l'exemple qui fait l'affaire.

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}

Peu importe le nombre d'invites que vous obtenez, toutes ces réponses recevront une réponse. Cette while/sleepboucle ressemble à une simulation de la commande yes , et en fait, c'est presque le cas . Le problème, yesc'est qu'il inonde stdout 'y'et il n'y a pratiquement aucun délai entre l'envoi de ces caractères et la version avec laquelle je devais faire face n'avait aucune option de timeout d'aucune sorte. Il "polluera" la sortie standard et le script échouera en se plaignant d'une entrée incorrecte. La solution est de mettre un délai entre l'envoi 'y'vers stdout, et c'est exactement ce que fait le while/sleepcombo.

expect n'est pas disponible par défaut sur certaines distributions Linux et je n'avais aucun moyen de l'installer dans le cadre de mes scripts CI, donc j'ai dû utiliser la solution la plus générique et rien ne peut être plus générique qu'un simple script bash, non?

En fait, j'ai blogué à ce sujet ( NSBogan ), consultez-le pour plus de détails ici si vous êtes intéressé.


--all installera tous les sdk possibles. Pas idéal si vous souhaitez vous limiter à un filtre spécifique.
IgorGanapolsky

17

Si tu as sdkmanager installé (j'utilise MAC)

courir sdkmanager --list pour répertorier les packages disponibles.

Si vous souhaitez installer des outils de génération, copiez la version préférée de la liste des packages disponibles.

Pour installer la version préférée, exécutez

sdkmanager "build-tools;27.0.3"

1
Merci. Ça marche! La commande "android" est désormais obsolète avec la dernière version d'Android-sdk, nous devons utiliser ./sdkmanager du répertoire / tools / bin
JLavoie

8

Cependant, son exécution est trop lente

Oui, j'ai eu le même problème. Certains téléchargements de fichiers sont extrêmement lents (ou du moins ils l'ont été au cours des deux derniers jours). Si vous voulez tout télécharger, vous ne pouvez pas faire grand-chose à ce sujet.

Le résultat est que rien dans les outils de construction de dossier, et je veux, n'est aapt et apkbuilder, car je veux construire apk à partir de la ligne de commande sans ant.

L'avez-vous laissé fonctionner?

Une chose que vous pouvez faire est de filtrer les packages en cours de téléchargement à l'aide du -t commutateur.

Par exemple:

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

Lorsque j'ai essayé cela l'autre jour, j'ai installé la version 18.0.0 des outils de construction. Pour une raison quelconque, la dernière version 18.0.1 n'est pas incluse par ce filtre et la seule façon de l'obtenir était de tout installer avec le --allcommutateur.


2
Exécutez ceci pour obtenir les filtres disponibles: "android update sdk -h" ... Un filtre qui limite la mise à jour aux types de packages spécifiés sous la forme d'une liste séparée par des virgules de [plateforme, image système, outil, plateforme -tool, doc, sample, source]. Cela accepte également les identifiants renvoyés par 'list sdk --extended'.
Aleb

6

Je préfère mettre un script qui installe mes dépendances

Quelque chose comme:

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


Merci, aidez-moi à gagner beaucoup de temps.
utzcoz

4

Je viens d'avoir ce problème, j'ai donc finalement écrit une solution sale bash 1 ligne en lisant et en analysant la liste des outils disponibles:

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

J'ai changé mon projet pour jouer aux services, il demandait des licences bien plus que de simples outils de construction, donc cette solution est très limitée.
nurettin

Se sent beaucoup plus déterministe que les index qui peuvent changer avec le temps à mesure que les versions évoluent ...
Augustin Riedinger

4

Inspiré des réponses de @ i4niac & @ Aurélien Lambert, voici ce que j'ai trouvé

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

Explication

  • obtenir une liste de nombres séparés par des virgules qui sont les index des packages d'outils de construction dans le résultat de la android list sdk --allcommande (Ignorer les packages obsolètes).
  • Continuez à lancer des y au terminal toutes les quelques millisecondes pour accepter les licences.

4

Téléchargez le SDK Android depuis developer.android.com (il s'agit actuellement d'un fichier de 149 Mo pour le système d'exploitation Windows). Il est à noter qu'Android a supprimé l'interface graphique de sdkmanager mais a une version en ligne de commande de sdkmanager dans le dossier bin qui se trouve à l'intérieur du dossier tools.

  1. Lorsque vous êtes dans le dossier bin, maintenez la touche Maj enfoncée, faites un clic droit, puis sélectionnez ouvrir la ligne de commande ici. Maj + clic droit >> ouvrir la ligne de commande ici.
  2. Lorsque la ligne de commande s'ouvre, tapez sdkmanagercliquez sur Entrée.
  3. Exécutez ensuite type sdkmanager(espace), double trait d'union ( --), type list sdkmanager --list (cela répertorie tous les packages dans le gestionnaire du SDK)
  4. Tapez sdkmanager (espace) puis le nom du package, appuyez sur entrée. Par exemple. sdkmanager platform-tools (appuyez sur entrée) Il chargera l'accord de licence. Avec options (o / n). Entrez y pour accepter et il téléchargera le package que vous avez spécifié.

Pour plus de référence, suivez le document officiel ici

J'espère que ça aide. :)


4

La commande "android" est obsolète.

Pour les outils de ligne de commande, utilisez tools / bin / sdkmanager et tools / bin / avdmanager

Si vous n'avez pas besoin d'Android Studio, vous pouvez télécharger les outils de ligne de commande Android de base de developer.android.com dans la section Outils de ligne de commande uniquement .

de CLI, il devrait être comme:

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

Après cela, décompressez l'archive dans le dossier cible

unzip sdk-tools-linux.zip

Et maintenant, nous pouvons installer tout ce dont vous avez besoin ...

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

Vous pouvez obtenir une liste complète des packages à l'aide de la commande ./tools/bin/sdkmanager --list

Certains packages nécessitent l'acceptation du contrat de licence. vous pouvez l'accepter de manière interactive ou simplement passer "y" au flux d'entrée, comme ceci (deux accords au cas où):

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

Et bien sûr, pour votre commodité, vous pouvez exporter des variables telles que ANDROID_HOME ou ANDROID_SDK_ROOT (y compris en le faisant dans ~ / .profile ou ~ / .bash_profile) ou patcher la variable PATH - tout cela est à votre discrétion.

Exemple 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'

Exigences: curl (ou wget) et décompressez

Dépannage:

si vous voyez Warning: Could not create settings, vous devez avoir le toolsrépertoire dans le cmdline-toolsrépertoire à l'intérieur de ANDROID_HOME (créez-le si nécessaire avec ce nom exact) voir les outils de ligne de commande Android sdkmanager affiche toujours: Avertissement: impossible de créer des paramètres


2

Les outils de construction ne pouvaient pas être téléchargés automatiquement par défaut, comme l'a dit Nate dans https://stackoverflow.com/a/19416222/1104031 message .

Mais j'ai écrit un petit outil qui fait tout pour toi

J'ai utilisé l'outil "expect" comme danb dans le post https://stackoverflow.com/a/17863931/1104031 . Vous avez seulement besoin android-sdk et python27, expect.

Ce script installera tous les outils de construction, tous les sdks et tout ce dont vous avez besoin pour une construction automatisée:

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)

Et alors echo "yes" | ./android update sdk --no-https --no-ui --filter 1,6?
schemacs

1
Corrigez-moi si je me trompe, mais il semble que ce script re-télécharge tout à chaque fois qu'il est exécuté. J'ai essayé avec le paramètre -u mais cela ne semblait pas fonctionner: /
gbero

1

Comme indiqué dans d'autres réponses, les outils de génération nécessitent que l' --allindicateur soit installé. Vous pouvez également utiliser un -tindicateur de filtre pour éviter d'installer TOUS les packages, mais il n'y a aucun moyen de filtrer tous les outils de génération.

Il existe déjà des demandes de fonctionnalités pour ces deux points dans le traqueur de bogues AOSP. N'hésitez pas à voter pour eux, cela pourrait les réaliser un jour:


1

J'ai essayé cela pour tout mettre à jour, et cela a fonctionné!

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

0

Essayer

1. Liste de tous les packages

android list sdk --all

2. Installez les packages à l'aide de la commande suivante

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

-1

mise à jour android sdk

Cette commande mettra à jour et installera toutes les dernières versions des outils SDK, Build Tools et SDK platform tools.

C'est du travail pour moi.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.