¿Hay alguna manera de automatizar la instalación de Android SDK?

Respuestas:

392

ACTUALIZAR

Presentamos las últimas versiones sdkmanager, una herramienta de línea de comandos que le permite ver, instalar, actualizar y desinstalar paquetes para el SDK de Android.

La sdkmanagerherramienta se proporciona en el paquete de herramientas del SDK de Android ( 25.2.3 y superior ) y se encuentra en 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.

entonces, para actualizar los paquetes ejecutados

$ sdkmanager --update

aceptar las licencias

$ yes | sdkmanager --licenses

ANTIGUA RESPUESTA

(Tenga en cuenta: ¡El comando de Android está en desuso!)

Probablemente, más cerca de la automatización esté:

$ android update sdk --no-ui

Android proporciona estas opciones para actualizaciones automáticas:

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 desea enumerar qué paquetes están disponibles para la instalación, puede usar

$ android list sdk

y obtendrá una lista ordenada de paquetes, por ejemplo

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

También puede limitar la actualización solo a un componente deseado si usa la --filteropción

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

donde componente es uno o más de

  • los números devueltos por android list sdk(es decir , 1 , también conocido como índice de paquete )
  • Añadir
  • Doc
  • extra
  • plataforma
  • herramienta de plataforma
  • muestra
  • fuente
  • imagen del sistema
  • herramienta

o puede ser uno o más identificadores específicos. Por ejemplo, si solo desea descargar un pequeño conjunto de paquetes específicos, puede hacer esto:

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

y solo obtendrá las herramientas de la plataforma, el nivel 16 de la API y el paquete de soporte jar. Esto es realmente útil si solo está construyendo una máquina de compilación y tendría que pagar por descargar todas las cosas adicionales que nunca usará.

Para ver las opciones disponibles, puede usar --help, por ejemplo

$ 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
fuente
1
Recibo todas estas indicaciones de "Autenticación del sitio" de terceros donde tengo que presionar enter para continuar / omitir, ¿hay alguna forma de deshacerme de ellas?
Somatik
2
No veo un "android.exe" para el SDK de Windows. ¿Cómo automatizaría la instalación y configuración del SDK en Windows?
Trevor Sullivan
1
Tenga en cuenta que en caso de que un paquete ya esté instalado, obtendrá el error sin sentido como Error: Ignoring unknown package filter 'tools'o Error: Ignoring unknown package filter 'android-17'.
Ivan Vučica
32
Para aceptar la licencia automáticamente, la próxima versión agregará una --accept-licensebandera. Mientras tanto puedesecho "y" | android update sdk --no--ui
Snicolas
2
@Snicolas He escrito un archivo MAKE que usa "esperar" para aceptar automáticamente los acuerdos de licencia por ahora. Está en github ( github.com/ken-noland/android-autoget-makefile )
Kenneth Noland
50

Esto no funcionó para mí ...

echo "y" | android ....

así que terminé aquí:

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
fuente
2
Esto se parece mucho a la solución provista aquí: stackoverflow.com/a/6674626/3063884 ... ¿se requiere atribución?
CJBS
2
@CJBS No. Llegué a la misma conclusión que ese tipo. Una vez que aprenda "esperar", este resultado es prácticamente el único que se le puede ocurrir ... pero gracias por proporcionar la atribución de todos modos.
danb
44
Gracias por el simple script de esperar, esto funciona mientras que sí no.
clase
Esto solo funcionó después de eliminar sudo y luego corregir la ruta de la herramienta de Android.
Pellet
44

Lo uso para instalar y actualizar el SDK en 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
fuente
¡Funciona bien! Gracias.
gilm
2
Para mí, la opción -a también era necesaria para poder encontrar todos los paquetes especificados en el filtro.
alfoks
16

Para responder a todas las licencias con 'y', puede probar esto en el script:

(while :
do
  echo 'y'
  sleep 2
done) | android update sdk -u .....
npstr
fuente
10
No puedo confirmar que esto funcione. Recibo un error que suena como "'aaaaaaaa' no es una respuesta válida", por eso recurrí a la solución con un sueño en medio.
npstr
5

Para cualquiera que todavía esté buscando un método para descargar todos los paquetes de Android, he escrito un script para hacerlo. Descargará todos los paquetes no obsoletos .

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

También puedes verlo en mi repositorio de Github

El bueno:

  • No depende de expect.
  • Sin cabeza.

Los inconvenientes:

  • Todavía tiene que instalar SDK básico manualmente y ponerlo androiden su camino.
  • El script solo funciona en Unix.
Tai Le
fuente
4

En las versiones más recientes de Android (por ejemplo 25.2.5), deberíamos usar sdkmanager (en lugar del androidcomando)

Ejemplo de instalación de un paquete:

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

Comando para obtener una lista de todos los paquetes disponibles:

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

Esta página web enumera los enlaces de descarga para las herramientas del SDK:

Aquí hay un enlace a un repositorio de código abierto docker-android que puede instalar android en una imagen Docker.

También puede encontrar las respuestas en esta pregunta SO: acepta automáticamente todas las licencias de SDK útiles.

TmTron
fuente
3

A partir de Android Plugin para Gradle versión 2.2.0, los componentes faltantes del SDK se descargan automáticamente .

sschuberth
fuente
2
Lo hacen, pero las licencias no se aceptan automáticamente, lo que lo convierte en un uso mínimo para CI.
eAi el
Mi segundo enlace tiene instrucciones explícitas sobre cómo "exportar sus licencias copiando sobre el directorio de licencias aceptadas". Esto es algo que puede hacer fácilmente para sus nodos de compilación de CI.
sschuberth
0

Otro script para descargar solo es necesario, paquetes no {obsolute, source, emulator-image, doc}:

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

Algunas partes están tomadas de otras respuestas en este hilo.

Bromista
fuente
0

Para automatizar el sdkmanager.bat --licensesaviso en Windows (digamos que está instalando a través de la automatización para la infraestructura de compilación) ... No lo ejecute. No pierdas el tiempo tratando de descubrir cómo canalizary . Lo intenté; Abye fallar.

Más bien, ejecútelo una vez, usted mismo, y tenga en cuenta que genera archivos en c:\android\android-sdk\licenses(donde está ejecutandoc:\android\android-sdk\tools\bin\sdkmanager.bat , su raíz de instalación puede variar).

Tome esos archivos y colóquelos en un lugar donde pueda obtenerlos en sus scripts de configuración automatizados. Personalmente, ansible es mi veneno, así que:

# 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
fuente
0

También me sentí frustrado con esto y construí un complemento Gradle llamado com.quittle.setup-android-sdkque detectará e instalará lo que necesita. Funciona en Windows, OSX y Linux y no requiere ninguna dependencia adicional si compila con Gradle.

Si está interesado, puede consultar mis documentos aquí: https://github.com/quittle/gradle-setup-android-sdk

quittle
fuente
-1

Para un desarrollador novato de Android, pero un desarrollador experimentado de Java, es realmente desconcertante saber QUÉ dependencias, INCLUSO si supera todas las pesadillas anteriores. Un colega mío me aconsejó usar Android Studio (que está basado en Intellij :-) específicamentedebido a las pesadillas anteriores. Seguí su consejo. Pero no acepté los valores predeterminados para la instalación e intenté instalarlo en una unidad de software mía. Resultó ser una pesadilla. El diálogo del SDK parecía bloquearse y no era intuitivo en absoluto. Por eso terminé aquí. Después de leer lo anterior, le di otra oportunidad a Studio, y esta vez acepté TODOS los valores predeterminados para la instalación. Hola PRESTO ... se ocupó de todas las dependencias del SDK (las principales, supongo) en un par de diálogos sin que se les solicite, es decir, Ctl-Shift-S y el SKD. Por lo tanto, lo recomendaría para un novato. Aquí la prueba del budín mientras se descarga: ingrese la descripción de la imagen aquí

La versión de sudio que descargué e instalé: ingrese la descripción de la imagen aquí Versión de Windows: ingrese la descripción de la imagen aquí Y aquí, después de que hizo sus cosas buenas: ingrese la descripción de la imagen aquí

Sinceramente espero que funcione para ti!

Beezer
fuente
Entonces, lo que encontré posteriormente fue que en realidad no tiene nada que ver con la carpeta en la que está instalado. Asegúrese de que su conexión a Internet y, por inferencia, el proxy estén configurados correctamente. De lo contrario, no verá nada disponible para instalar. Ese fue el problema.
Beezer