¿Cómo instalar Android SDK Build Tools en la línea de comando?

292

Quiero configurar el entorno de desarrollo de Android desde la línea de comandos y encuentro el siguiente problema:

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

después de extraer el archivo, ejecute

tools/android update sdk --no-ui

Sin embargo, es demasiado lento para correr

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

El resultado es que no hay nada en las herramientas de compilación de carpetas, y lo que quiero es aapt y apkbuilder, ya que quiero compilar apk desde la línea de comandos sin hormiga.

Zhenguo Yang
fuente

Respuestas:

479

De manera predeterminada, el SDK Manager de la línea de comando no incluye las herramientas de compilación en la lista. Están en la categoría "obsoleto". Para ver todas las descargas disponibles, use

android list sdk --all

Y luego, para obtener uno de los paquetes en esa lista desde la línea de comandos, use:

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

Donde -u representa --no-ui, -a representa --todos y -t representa --filtro.

Si necesita instalar varios paquetes, haga lo siguiente:

actualización de Android sdk -u -a -t 1,2,3,4, .., n 

Donde 1,2, .., n es el número de paquete enumerado con el comando de lista anterior

NS G
fuente
44
Si le faltan herramientas de compilación como 18.1.1, esta es la forma correcta de instalarlo utilizando la línea de comandos.
Cray
19
apesta, no mencionaron la --allopción en los consejos oficiales . Gracias.
Alexander Malakhov
44
@DanielJonker Sí, lo es. Simplemente repita "sí" al comando, es decir, repita sí | Android Update SDK --todos --herramientas de filtro --no-ui --force> / dev / null
nsg
44
echo "yes"se puede acortar echo "y", pero eso no funciona en todos los casos de todos modos. En algunos casos, puede obtener más de una solicitud de licencia y / n, según el filtro y los paquetes específicos. echo "y"responderá solo a la primera solicitud, pero no al resto. Estoy tratando de hacerlo funcionar con yescomando sin éxito hasta ahora.
i4niac
3
@AlexanderMalakhov Estoy de acuerdo, si su sistema operativo host tiene la utilidad, usarla es la mejor opción. Primero miré en esperar, pero en mi caso tengo que ejecutar el script en un determinado distribuidor de Linux que se ejecuta en la nube de AWS. Esa distribución no espera que esté instalada y no tengo suficientes derechos para instalarla como parte del plan de compilación. Después de mirar alrededor, la mejor solución que encontré es <pre> <code> # actualizar Android SDK en el servidor sin cabeza FILTER = tool, platform, android-20 (sleep 5 && while [1]; do sleep 1; echo y; done ) \ | actualización de Android SDK --no-ui --todos \ --filter $ {FILTER} </code> </pre>
i4niac
140

Como se menciona en otras respuestas, puede usar la --filteropción para limitar los paquetes instalados:

android update sdk --filter ...

Las otras respuestas no mencionan que puede usar identificadores de cadena constantes en lugar de índices (que cambiarán) para las opciones de filtro. Esto es útil para instalaciones desatendidas o programadas. Hombre para la --filteropción:

... Esto también acepta los identificadores devueltos 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

Luego, puede usar los identificadores de cadena como opciones de filtro para especificar con precisión las versiones que desea:

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

robar
fuente
27
+1 para la --extendedopción, dejando en claro qué instalar para los scripts de CI.
nhaarman
16
android updatetambién requerirá la --allopción, de lo contrario se mostrará la ayuda de uso. Por ejemplo: android update sdk --no-ui --all --filter build-tools-21.1.0(y +1 para la --extendedopción que le permite ver los alias como build-tools-21.1.0)
Petrus Repo
1
¿Dónde está el hombre para el --filtery --extendedopciones?
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
2
Estoy de acuerdo en que es mucho mejor usar la cadena en lugar del número, que no es fijo.
wisbucky
1
Estaba buscando esa --extendedopción para poder escribir un script y usarlo en mi servidor de integración continua, donde puede actualizar los recursos SDK. Buen consejo!
osayilgan
73

La versión 25.2.3 (y superior) del Android SDK Toolspaquete contiene una nueva herramienta, sdkmanager , que simplifica esta tarea de instalar herramientas de compilación desde la línea de comandos.
Se encuentra en la android_sdk/tools/bincarpeta.

Uso (de la documentación ):

sdkmanager packages [options]

El packagesargumento es una ruta de estilo SDK, entre comillas (por ejemplo, "build-tools;25.0.0"o "platforms;android-25"). Puede pasar múltiples rutas de paquetes, separadas por un espacio, pero cada una debe estar envuelta en su propio conjunto de comillas.

Ejemplo de uso (en mi 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/

También puede especificar varias opciones , por ejemplo para forzar todas las conexiones a usar HTTP ( --no_https), o para usar el servidor proxy ( --proxy_host=addressy --proxy_port=port).

Para verificar las opciones disponibles, use la --helpbandera. En mi máquina (Mac), el resultado es el siguiente:

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
fuente
1
¿Alguien más está recibiendo Warning: Unknown argument --package_file?
ulidtko
3
@ulidtko Hay un error en la documentación de uso. La forma correcta es agregar el signo igual, por ejemplo --package_file=packages.txt.
Alex Lipov
Lamentablemente no simplifica la tarea de instalación. No todos los programadores de Android realizan sus programaciones en Linux sin GUI. Algunos de nosotros lo hacemos en Windows y preferimos una interfaz de usuario que se ejecute como cualquier otra aplicación de Windows. Esto se mueve hacia atrás en lugar de hacia adelante
AaA
2
@AaA Simplifica la tarea de instalación desde la línea de comandos . OP declaró explícitamente que está buscando una solución de línea de comandos y, por lo tanto, su comentario es irrelevante en este contexto.
Alex Lipov
55

ADB Build-Tools no se descargará automáticamente, mediante el comando android update sdk --no-ui

Entonces, para instalar el tipo Buil-Tool (en la consola):

android list sdk --all

Recuerde el número que aparece antes del artículo y ejecute lo siguiente:

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

los comandos deben escribirse en / YourFolder / android-sdk-linux / tools

También para la carpeta remota (servidor abierto por ssh, por ejemplo) escriba:

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

Para una lista simple de paquetes ADB, escriba en la terminal:

android list sdk

para instalar todos los paquetes:

android update sdk --no-ui

O con filtros (la coma es un separador):

android update sdk --no-ui --filter 3,5,8,14
Flinbor
fuente
para los SDK obsoletos antiguos debe usar --todos. por ejemplo, la actualización de Android SDK --no-ui --todos --filter 27 para instalar la plataforma-8
Fluke
Como el instalador del SDK seguía fallando cuando estaba usando la GUI, tuve que cambiar a la línea de comandos, así que esto realmente ayudó. Gracias.
Yvonne Aburrow
32

Una gran fuente de información que encontré al intentar instalar todo el SDK de Android relacionado desde la línea de comandos, fue este Dockerfile. Dentro del Dockerfile puede ver que el autor ejecuta un solo comando para instalar platform toolsy build toolssin ninguna otra interacción. En el caso del OP, el comando se adaptaría a:

echo y | $ANDROID_HOME/tools/android update sdk --all --filter build-tools-21.1.0 --no-ui
geoand
fuente
¿Qué pasa si no quiero todos los paquetes? Solo quiero 21.1.0 .
IgorGanapolsky
@IgorGanapolsky Quizás deberías probar sin la --allbandera
geoand
21

Me costó muchísimo instalar las dependencias SDK de Android a través de la línea de comandos y, dado que la documentación que viene con las herramientas y en línea es lamentablemente escasa, pensé en publicar lo que descubrí aquí.

Estoy trabajando android sdk r24.4.1para linux. Hay dos comandos que puede ejecutar para enumerar los paquetes disponibles:

android list sdk

y el más exhaustivo:

android list sdk --all

¡Los números de paquete para paquetes específicos difieren para cada comando anterior! Por ejemplo, el primero enumera el paquete API 23.1 revision 3como paquete #3y el último lo enumera como #29.

Ahora, hay dos formas diferentes de instalar usando el comando de Android.

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

y

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

Dado que los comandos de instalación pueden tomar el paquete # como parámetro, ¿qué número de paquete utiliza? Después de mucha búsqueda en línea y prueba y error, descubrí que

android update sdk --no-ui --filter utiliza los números de paquete de android list sdk

y

android update sdk -u -a -t utiliza los números de paquete de android list sdk --all

En otras palabras, para instalar API 23.1 revision 3puede hacer lo siguiente:

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

o

android update sdk -u -a -t 29

Loco, pero funciona.

lps
fuente
1
-aes la versión corta de --all, por eso está usando ese número de paquete. ( -ues la abreviatura --no-uiy -tes la abreviatura de --filter).
darthmaim
Creo lo que dice Ips. Se sabe que Google no mantiene su usage()texto actualizado con la realidad.
not2qubit el
en ubuntu ejecuté: $ echo y | $ ANDROID_HOME / tools / android update sdk -u -a -t 27 Ahora, ¿cómo confirmar que me actualicé a Android 8?
Ashish Karpe
$ ANDROID_HOME / tools / destino de la lista de Android | grep "Basado en Android" Basado en Android 4.0.3 (API nivel 15) Basado en Android 4.1.2 (API nivel 16) Basado en Android 4.2.2 (API nivel 17) Basado en Android 4.3.1 (API nivel 18) Basado en Android 4.4.2 (API nivel 19) Basado en Android 4.4.2 (API nivel 19) Basado en Android 5.0.1 (API nivel 21) Basado en Android 5.1.1 (API nivel 22) Basado en Android 6.0 (API nivel 23) Basado en Android 7.0 (API nivel 24)
Ashish Karpe
Porque cuando ejecuté: $ ANDROID_HOME / tools / android list sdk Paquetes disponibles para instalación o actualización: 1 1- SDK Platform Android 8.1.0, API 27, revisión 1
Ashish Karpe
20

La mayoría de las respuestas parecen ignorar el hecho de que es posible que deba ejecutar la actualización en un entorno sin cabeza sin derechos de superusuario, lo que significa que el script debe responder a todas las y/nsolicitudes de licencia automáticamente.

Aquí está el ejemplo que hace el truco.

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}

No importa cuántas indicaciones recibas, todas serán respondidas. Este while/sleepbucle parece una simulación del comando yes , y de hecho lo es, bueno, casi . El problema yeses que se inunda con stdout 'y'y prácticamente no hay demora entre el envío de esos caracteres y la versión con la que tuve que lidiar no tenía ninguna opción de tiempo de espera de ningún tipo. "Contaminará" stdout y el script fallará quejándose de una entrada incorrecta. La solución es retrasar el envío 'y'a stdout, y eso es exactamente lo que while/sleephace el combo.

expect no está disponible de forma predeterminada en algunas distribuciones de Linux y no tenía forma de instalarlo como parte de mis scripts de CI, así que tuve que usar la solución más genérica y nada puede ser más genérico que un simple script de bash, ¿verdad?

De hecho, escribí un blog sobre esto ( NSBogan ), échale un vistazo para obtener más detalles aquí si estás interesado.

i4niac
fuente
--todos instalarán todos los SDK posibles. No es ideal si desea limitar a un filtro específico.
IgorGanapolsky
17

Si lo has sdkmanagerinstalado (estoy usando MAC)

ejecutar sdkmanager --listpara enumerar los paquetes disponibles.

Si desea instalar herramientas de compilación, copie la versión preferida de la lista de paquetes disponibles.

Para instalar la versión preferida, ejecute

sdkmanager "build-tools;27.0.3"
Lasithds
fuente
1
Gracias. ¡Funciona! El comando "android" está en desuso ahora con la última versión de Android-sdk, tenemos que usar ./sdkmanager desde el directorio / tools / bin
JLavoie
8

Sin embargo, es demasiado lento para correr

Sí, tuve el mismo problema. Algunas de las descargas de archivos son extremadamente lentas (o al menos lo han sido en los últimos días). Si quieres descargar todo, no hay mucho que puedas hacer al respecto.

El resultado es que no hay nada en las herramientas de compilación de carpetas, y lo que quiero es aapt y apkbuilder, ya que quiero compilar apk desde la línea de comandos sin hormiga.

¿Lo dejaste correr hasta su finalización?

Una cosa que puede hacer es filtrar los paquetes que se descargan con el -tinterruptor.

Por ejemplo:

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

Cuando probé esto el otro día, instalé la versión 18.0.0 de las herramientas de compilación. Por alguna razón, la última versión 18.0.1 no está incluida en este filtro y la única forma de obtenerla fue instalar todo con el --allconmutador.

Dan Dyer
fuente
2
Ejecute esto para obtener los filtros disponibles: "android update sdk -h" ... Un filtro que limita la actualización a los tipos especificados de paquetes en forma de una lista separada por comas de [plataforma, imagen del sistema, herramienta, plataforma -tool, doc, muestra, fuente]. Esto también acepta los identificadores devueltos por 'list sdk --extended'.
aleb
6

Prefiero poner un script que instale mis dependencias

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
fuente
Gracias, ayuda para ahorrarme mucho tiempo.
utzcoz
4

Acabo de tener este problema, así que finalmente escribí una solución sucia de bash de 1 línea leyendo y analizando la lista de herramientas disponibles:

 tools/android update sdk -u -t $(android list sdk | grep 'Android SDK Build-tools' | sed 's/ *\([0-9]\+\)\-.*/\1/')
Aurélien Lambert
fuente
Cambié mi proyecto a servicios de reproducción, pedía licencias de mucho más que solo herramientas de construcción, por lo que esta solución es muy limitada.
nurettin
Se siente mucho más determinista que los índices que pueden cambiar con el tiempo a medida que evolucionan las versiones ...
Augustin Riedinger
4

Inspirado en las respuestas de @ i4niac y @ Aurélien Lambert, esto es lo que se me ocurrió.

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

Explicación

  • obtenga una lista de números separados por comas que son los índices de los paquetes de herramientas de compilación en el resultado del android list sdk --allcomando (Ignorando los paquetes obsoletos).
  • sigue tirando 'y' en la terminal cada pocos milisegundos para aceptar las licencias.
Vinay W
fuente
4

Descargue el SDK de Android desde developer.android.com (actualmente es un archivo 149mb para el sistema operativo Windows). Vale la pena señalar que Android ha eliminado la GUI de sdkmanager pero tiene una versión de línea de comandos del sdkmanager en la carpeta bin que se encuentra dentro de la carpeta de herramientas.

  1. Cuando esté dentro de la carpeta bin, mantenga presionada la tecla Mayús, haga clic con el botón derecho y luego seleccione Abrir línea de comando aquí. Shift + clic derecho >> abrir línea de comando aquí.
  2. Cuando se abra la línea de comando, escriba sdkmanagerclic enter.
  3. Luego, ejecute type sdkmanager(space), double guhen ( --), type list sdkmanager --list (esto enumera todos los paquetes en el administrador de SDK)
  4. Escriba sdkmanager (espacio) y luego el nombre del paquete, presione enter. P.ej. sdkmanager platform-tools (presione enter) Se cargará el acuerdo de licencia. Con opciones (y / n). Ingrese y para aceptar y descargará el paquete que especificó.

Para más referencia, siga el documento oficial aquí.

Espero que esto ayude. :)

philemon uchechukwu
fuente
4

El comando "android" está en desuso.

Para herramientas de línea de comandos, use tools / bin / sdkmanager y tools / bin / avdmanager

Si no necesita Android Studio, puede descargar las herramientas básicas de línea de comandos de Android desde developer.android.com en la sección Herramientas de línea de comandos solamente .

desde CLI debería ser algo así como:

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

Después de eso simplemente descomprima el archivo en la carpeta de destino

unzip sdk-tools-linux.zip

Y ahora podemos instalar todo lo que necesita ...

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

Puede obtener una lista completa de paquetes con el comando ./tools/bin/sdkmanager --list

Algunos paquetes requieren la aceptación del acuerdo de licencia. puede aceptarlo de forma interactiva o simplemente pasar "y" a la secuencia de entrada, de esta manera (dos acuerdos por si acaso):

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

Y, por supuesto, para su conveniencia, puede exportar variables como ANDROID_HOME o ANDROID_SDK_ROOT (incluido hacerlo en ~ / .profile o ~ / .bash_profile) o parchear la variable PATH , todo esto es a su discreción.

Ejemplo de guión:

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: curl (o wget) y descomprimir

Solución de problemas:

si ve Warning: Could not create settings, debe tener el toolsdirectorio dentro del cmdline-toolsdirectorio dentro de ANDROID_HOME (créelo si es necesario con este nombre exacto), vea las herramientas de línea de comandos de Android que sdkmanager siempre muestra: Advertencia: no se pudo crear la configuración

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

Las herramientas de compilación no se podían descargar automáticamente de forma predeterminada, como dijo Nate en la publicación https://stackoverflow.com/a/19416222/1104031 .

Pero escribí una pequeña herramienta que hace todo por ti

Utilicé la herramienta "esperar" como danb en https://stackoverflow.com/a/17863931/1104031 publicación. Sólo es necesario android-sdk y python27, expect.

Este script instalará todas las herramientas de compilación, todos los sdks y todo lo que necesita para la compilación 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
fuente
¿Qué tal echo "yes" | ./android update sdk --no-https --no-ui --filter 1,6?
schemacs
1
Corrígeme si me equivoco, pero parece que este script vuelve a descargar todo cada vez que se ejecuta. Intenté con el parámetro -u pero no pareció funcionar: /
gbero
1

Como se indicó en otras respuestas, las herramientas de compilación requieren --allque se instale el indicador. También es mejor usar un -tindicador de filtro para evitar instalar TODOS los paquetes, pero no hay forma de filtrar todas las herramientas de compilación.

Ya hay solicitudes de características para estos dos puntos en el rastreador de errores AOSP. Siéntase libre de votar por ellos, esto podría hacer que sucedan algún día:

Sylfo
fuente
1

Intenté esto para actualizar todo, ¡y funcionó!

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

Tratar

1. Listar todos los paquetes

android list sdk --all

2. Instale paquetes usando el siguiente comando

android update sdk -u -a -t package1, package2, package3 //comma seperated packages obtained using list command 
Pehlaj - Desarrollador de aplicaciones móviles
fuente
-1

actualización de Android SDK

Este comando actualizará e instalará la última versión de SDK Tools, Build Tools, SDK platform tools.

Es trabajo para mi.

Chirag
fuente