Existe-t-il un moyen d'automatiser l'installation du SDK Android?

207

Maintenant, je dois télécharger et installer le SDK Android et AVD Manager, puis installer les API, les outils via l'interface utilisateur. Existe-t-il un moyen d'automatiser ce processus?

dongshengcn
la source
Copie possible de Comment installer les outils de construction du SDK Android sur la ligne de commande?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
Duplication possible de "android update sdk" sur linux sans tête
phunehehe

Réponses:

392

METTRE À JOUR

Les dernières versions présentent sdkmanagerun outil en ligne de commande qui vous permet d'afficher, d'installer, de mettre à jour et de désinstaller des packages pour le SDK Android.

L' sdkmanageroutil est fourni dans le package Android SDK Tools ( 25.2.3 et supérieur ) et se trouve dans android_sdk/tools/bin/.

  sdkmanager [--uninstall] [<common args>] [--package_file <file>] [<packages>...]
  sdkmanager --update [<common args>]
  sdkmanager --list [<common args>]
  sdkmanager --licenses [<common args>]

In its first form, installs, or uninstalls, or updates packages.
    By default, the listed packages are installed or (if already installed)
    updated to the latest version.

    --uninstall: uninstalled listed 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), all installed packages are
    updated to the latest version.

In its third form, all installed and available packages are printed
    out.

In its fourth form (with --licenses), show and offer the option to
     accept licenses for all available packages that have not already been
     accepted.

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.

donc, pour mettre à jour les packages exécutés

$ sdkmanager --update

accepter les licences

$ yes | sdkmanager --licenses

RÉPONSE ANCIENNE

(Remarque: la commande Android est obsolète!)

Le plus proche de l'automatisation est probablement:

$ android update sdk --no-ui

android fournit ces options pour les mises à jour automatiques:

Action "update sdk":
  Updates the SDK by suggesting new platforms to install if available.
Options:
  -f --force    Forces replacement of a package or its parts, even if something has been modified
  -u --no-ui    Updates from command-line (does not display the GUI)
  -o --obsolete Installs obsolete packages
  -t --filter   A filter that limits the update to the specified types of packages in the form of
                a comma-separated list of [platform, tool, platform-tool, doc, sample, extra]
  -s --no-https Uses HTTP instead of HTTPS (the default) for downloads
  -n --dry-mode Simulates the update but does not download or install anything

Si vous souhaitez répertorier les packages disponibles pour l'installation, vous pouvez utiliser

$ android list sdk

et vous obtiendrez une liste ordonnée de packages, par exemple

Packages available for installation or update: 9
   1- ARM EABI v7a System Image, Android API 15, revision 2
   2- Intel x86 Atom System Image, Android API 15, revision 1
   3- Android Support, revision 8
   4- Google AdMob Ads SDK, revision 6
   5- Google Analytics SDK, revision 2
   6- Google Play APK Expansion Library, revision 1
   7- Google Play Billing Library, revision 2
   8- Google Play Licensing Library, revision 2
   9- Google Web Driver, revision 2

Vous pouvez également limiter la mise à jour uniquement au composant souhaité si vous utilisez l' --filteroption

$ android update sdk --filter <component> --no-ui

où le composant est un ou plusieurs des

  • les nombres renvoyés par android list sdk(c.-à-d. 1 , également index de package )
  • Ajouter
  • doc
  • supplémentaire
  • Plate-forme
  • plate-forme-outil
  • échantillon
  • la source
  • image système
  • outil

ou peut être un ou plusieurs identifiants spécifiques. Par exemple, si vous souhaitez simplement télécharger un petit ensemble de packages spécifiques, vous pouvez le faire:

$ android update sdk -u --filter platform-tools,android-16,extra-android-support

et vous aurez juste les outils de la plateforme, le niveau 16 de l'API et le pot de package de support. C'est vraiment pratique si vous construisez une machine de construction uniquement et devez payer pour télécharger toutes les choses supplémentaires que vous n'utiliserez jamais.

Pour voir les options disponibles, vous pouvez utiliser --help, par exemple

$ android --help list sdk

       Usage:
       android [global options] list sdk [action options]
       Global options:
  -h --help       : Help on a specific command.
  -v --verbose    : Verbose mode, shows errors, warnings and all messages.
     --clear-cache: Clear the SDK Manager repository manifest cache.
  -s --silent     : Silent mode, shows errors only.

                   Action "list sdk":
  Lists remote SDK repository.
Options:
  -o --obsolete  : Deprecated. Please use --all instead.
  -a --all       : Lists all available packages (including obsolete and
                   installed ones)
     --proxy-host: HTTP/HTTPS proxy host (overrides settings if defined)
     --proxy-port: HTTP/HTTPS proxy port (overrides settings if defined)
  -s --no-https  : Uses HTTP instead of HTTPS (the default) for downloads.
  -e --extended  : Displays extended details on each package
  -u --no-ui     : Displays list result on console (no GUI) [Default: true]
Diego Torres Milano
la source
1
Je reçois toutes ces invites tierces "Authentification du site" où je dois appuyer sur Entrée pour continuer / sauter, existe-t-il un moyen de s'en débarrasser?
Somatik
2
Je ne vois pas de "android.exe" pour le SDK Windows - comment automatiseriez-vous l'installation et la configuration du SDK sous Windows?
Trevor Sullivan
1
Notez que dans le cas où un package est déjà installé, vous obtenez l'erreur absurde telle que Error: Ignoring unknown package filter 'tools'ou Error: Ignoring unknown package filter 'android-17'.
Ivan Vučica
32
Pour accepter la licence automatiquement, la prochaine version ajoutera un --accept-licenseindicateur. Pendant ce temps, vous pouvezecho "y" | android update sdk --no--ui
Snicolas
2
@Snicolas J'ai écrit un makefile qui utilise "expect" pour accepter automatiquement les accords de licence pour l'instant. C'est sur github ( github.com/ken-noland/android-autoget-makefile )
Kenneth Noland
50

Cela n'a pas fonctionné pour moi ...

echo "y" | android ....

donc je me suis retrouvé ici:

expect -c '
set timeout -1   ;
spawn sudo /opt/android-sdk/tools/android update sdk -u; 
expect { 
    "Do you accept the license" { exp_send "y\r" ; exp_continue }
    eof
}
'
danb
la source
2
Cela ressemble beaucoup à la solution fournie ici: stackoverflow.com/a/6674626/3063884 ... une attribution est-elle requise?
CJBS
2
@CJBS Nope. Je suis arrivé à la même conclusion que ce type. Une fois que vous apprenez "attendez" ce résultat est à peu près le seul que vous pouvez trouver ... mais merci d'avoir fourni l'attribution quand même.
danb
4
Merci pour le script expect simple, cela fonctionne alors que oui ne fonctionne pas.
cours du
Cela n'a fonctionné qu'après avoir supprimé sudo puis corrigé le chemin de l'outil Android.
Pellet
44

je l'utilise pour installer et mettre à jour le sdk sur travis-ci

curl --location http://dl.google.com/android/android-sdk_r22.3-linux.tgz | tar -x -z -C $HOME
export ANDROID_HOME=$HOME/android-sdk-linux
export PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools
( sleep 5 && while [ 1 ]; do sleep 1; echo y; done ) | android update sdk --no-ui --filter platform-tool,android-19,sysimg-19,build-tools-19.0.1
Elmer
la source
Fonctionne bien! Je vous remercie.
gilm
2
Pour moi, l'option -a était également nécessaire pour que tous les packages spécifiés dans le filtre soient trouvés.
alfoks
16

Pour répondre à toutes les licences avec 'y', vous pouvez essayer ceci dans le script:

(while :
do
  echo 'y'
  sleep 2
done) | android update sdk -u .....
npstr
la source
10
Je ne peux pas confirmer ce fonctionnement. J'obtiens une erreur ressemblant à "'yyyyyyyy' n'est pas une réponse valide", c'est pourquoi je suis retombé dans la solution avec un sommeil entre les deux.
npstr
5

Pour ceux qui recherchent toujours une méthode pour télécharger tous les packages Android, j'ai écrit un script pour le faire. Il téléchargera tous les packages non obsolètes .

#!/binbash
# Install all non-obsolete android sdk packages.
# author: Tai Le Tien (letientai299 at gmail.com)

function install_sdk {
  android update sdk -u -s -a -t "$1"
}

function fetch_non_obsoled_package_indices {
  # Fetch the sdk list using non-https connections
  android list sdk -u -s -a |\
    # Filter obsoleted packages
    sed '/\(Obsolete\)/d' |\
    # Filter to take only the index number of package
    sed 's/^[ ]*\([0-9]*\).*/\1/' |\
    # Remove the empty lines
    sed -n 's/^[^ $]/\0/p'
}

for package_index in  $(fetch_non_obsoled_package_indices)
do
  echo "====================================================================="
  echo "Start to install package:  ${package_index}"
  echo "====================================================================="
  # Auto accept license
  echo -e "y" | install_sdk "${package_index}"
  echo
  echo
done

Vous pouvez également le voir sur mon repo Github

Le bon:

  • Ne dépend pas de expect .
  • Sans tête.

Les inconvénients:

  • Vous devez toujours installer le SDK de base manuellement et mettre android sur votre chemin.
  • Le script ne fonctionne que sur unix.
Tai Le
la source
4

Dans les versions Android plus récentes (par exemple 25.2.5), nous devrions utiliser sdkmanager (au lieu de la androidcommande)

Exemple d'installation d'un package:

android-sdk/tools/bin/sdkmanager "extras;android;m2repository"

Commande pour obtenir une liste de tous les packages disponibles:

 android-sdk/tools/bin/sdkmanager --verbose --list

Cette page Web répertorie les liens de téléchargement des outils SDK:

Voici un lien vers un référentiel open-source docker-android qui peut installer android dans une image Docker.

Vous pouvez également trouver les réponses dans cette question SO: Accepter automatiquement toutes les licences SDK utiles.

TmTron
la source
3

À partir du plug-in Android pour Gradle version 2.2.0, les composants SDK manquants sont téléchargés automatiquement .

sschuberth
la source
2
Ils le font, mais les licences ne sont pas acceptées automatiquement, ce qui en fait une utilisation minimale pour CI.
eAi
Mon deuxième lien contient des instructions explicites sur la façon "d'exporter vos licences en copiant le répertoire des licences acceptées". C'est quelque chose que vous pouvez facilement faire pour vos nœuds de construction CI.
sschuberth
0

J'ai mis en place un script ruby ​​qui télécharge et installe le SDK sans invite, ce qui pourrait aider. https://github.com/ayvazj/andenv

ayvazj
la source
0

Encore un autre script à télécharger uniquement les packages non {obsolute, source, emulator-image, doc} nécessaires:

#!/bin/bash
set -e

# cd into where tools/android can be found
if [[ -d "$ANDROID_HOME" ]]; then
  cd "$ANDROID_HOME"
elif [[ -x "$(dirname "$0")/tools/android" ]]; then
  cd "$(dirname "$0")"
else
  echo "FAILED: Cannot find ANDROID_HOME/tools/android"
  exit 1
fi

android () {
  "$(dirname $0)/tools/android" "$@"
}

needed_packages () {
  android list sdk -u -s -e         \
    | grep '^id:'                   \
    | cut -d'"' -f2                 \
    | grep -v 'source'              \
    | grep -v 'sys-img'             \
    | grep -v 'doc'                 \
    | paste -d, -s -
}

main () {
  (while : ; do
  echo 'y'
  sleep 1
  done) | android update sdk -u -s -a -t "$(needed_packages)"
}

main

Certaines parties sont extraites d'autres réponses de ce fil.

Jokester
la source
0

Pour automatiser l' sdkmanager.bat --licensesinvite sur Windows (par exemple, vous installez via l'automatisation pour l'infrastructure de construction) ... Ne l'exécutez pas. Ne perdez pas de temps à essayer de comprendre comment y accéder y. J'ai essayé; abject échouent.

Plutôt - exécutez-le une fois, vous-même et notez qu'il génère des fichiers dans c:\android\android-sdk\licenses(où vous exécutezc:\android\android-sdk\tools\bin\sdkmanager.bat - votre racine d'installation peut varier).

Prenez ces fichiers et placez-les quelque part où vous pouvez les récupérer dans vos scripts de configuration automatisée. Personnellement, l'ansible est mon poison, donc:

# Note to future-us:
# These are magical files generated by running `c:/android/android-sdk/tools/bin/sdkmanager.bat --licenses`
# This, delightfully, is interactive, and wants to _actually_ read the keyboard buffer.
# That's reputedly possible via SendKeys. I elected to not try that.
# So, instead:
# 1) remote to an instance like a cave-dweller
# 2) run `c:/android/android-sdk/tools/bin/sdkmanager.bat --licenses` in a prompt.
# 3) _actually type_ `y` however many godforsaken times you need to.
# 4) meticulously harvest `c:/android/android-sdk/licenses/*` to this task.
#    (you don't need the newline that they thoughtfully put before the hash in each file).
- name: set up android licenses by hand
  win_lineinfile:
    path: c:/android/android-sdk/licenses/{{ item.name }}
    line: "{{ item.line }}"
    create: true
  with_items:
    - {name: "android-googletv-license", line: "SOME HASH"}
    - {name: "android-sdk-license", line: "SOME OTHER HASH"}
    ...
Peter Mounce
la source
0

J'ai également été frustré par cela et j'ai créé un plugin Gradle nommé com.quittle.setup-android-sdkqui détectera et installera ce dont vous avez besoin. Il fonctionne sur Windows, OSX et Linux et ne nécessite aucune dépendance supplémentaire si vous construisez avec Gradle.

Si vous êtes intéressé, vous pouvez consulter mes documents ici: https://github.com/quittle/gradle-setup-android-sdk

quittle
la source
-1

Pour un développeur Android débutant, mais un développeur Java expérimenté, il est vraiment déconcertant de savoir QUELLES dépendances, MÊME si vous surmontez tous les cauchemars ci-dessus. Un de mes collègues m'a conseillé d'utiliser Android Studio (basé sur Intellij :-) spécifiquementà cause des cauchemars ci-dessus. J'ai suivi ses conseils. Mais je n'ai pas accepté les paramètres par défaut de l'installation et j'ai essayé de l'installer dans un de mes logiciels. Cela s'est avéré être un cauchemar. La boîte de dialogue SDK semblait se bloquer et n'était pas du tout intuitive. C'est pourquoi je me suis retrouvé ici. Après avoir lu ce qui précède, j'ai donné un autre essai à Studio, et cette fois, j'ai accepté TOUS les paramètres par défaut pour l'installation. Hé PRESTO ... il a pris en charge toutes les dépendances du SDK (celles du cœur je suppose) dans quelques dialogues sans être invité, à savoir Ctl-Shift-S et le SKD. Je le recommanderais donc pour un débutant. Voici la preuve du pudding lors du téléchargement: entrez la description de l'image ici

La version de sudio que j'ai téléchargée et installée: entrez la description de l'image ici Version de Windows: entrez la description de l'image ici Et ici, après, elle a fait son bon travail: entrez la description de l'image ici

J'espère sincèrement que cela fonctionne pour vous !!

Beezer
la source
Donc, ce que j'ai trouvé par la suite, c'est que cela n'a rien à voir avec le dossier dans lequel il est installé. Assurez-vous que votre connexion Internet et, par déduction, le proxy sont correctement configurés. Sinon, vous ne verrez rien de disponible à installer. C'était ça le problème.
Beezer