Las herramientas de línea de comandos de Android sdkmanager siempre muestran: Advertencia: no se pudo crear la configuración

64

Uso las nuevas herramientas de línea de comandos de Android porque el antiguo repositorio de herramientas SDK de Android ya no está disponible. Así que cambié mi gitlab-ci para cargar las herramientas de comando. Pero cuando intento ejecutarlo me sale el siguiente error:

Warning: Could not create settings
java.lang.IllegalArgumentException
    at com.android.sdklib.tool.sdkmanager.SdkManagerCliSettings.<init>(SdkManagerCliSettings.java:428)
    at com.android.sdklib.tool.sdkmanager.SdkManagerCliSettings.createSettings(SdkManagerCliSettings.java:152)
    at com.android.sdklib.tool.sdkmanager.SdkManagerCliSettings.createSettings(SdkManagerCliSettings.java:134)
    at com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:57)
    at com.android.sdklib.tool.sdkmanager.SdkManagerCli.main(SdkManagerCli.java:48)

Ya intenté ejecutar esos comandos a mano, pero obtengo el mismo error. Además, si ejecuto sdkmanager --version, se produce el mismo error. Mi gitlab-ci se ve así:

image: openjdk:9-jdk

variables:
  ANDROID_COMPILE_SDK: "29"
  ANDROID_BUILD_TOOLS: "29.0.3"
  ANDROID_SDK_TOOLS:   "6200805"

before_script:
  - apt-get --quiet update --yes
  - apt-get --quiet install --yes wget tar unzip lib32stdc++6 lib32z1
  - wget --quiet --output-document=android-sdk.zip https://dl.google.com/android/repository/commandlinetools-linux-${ANDROID_SDK_TOOLS}_latest.zip
  - unzip -d android-sdk-linux android-sdk.zip
  - echo y | android-sdk-linux/tools/bin/sdkmanager "platform-tools" "platforms;android-${ANDROID_COMPILE_SDK}" >/dev/null
  #- echo y | android-sdk-linux/tools/bin/sdkmanager "platform-tools" >/dev/null
  - echo y | android-sdk-linux/tools/bin/sdkmanager "build-tools;${ANDROID_BUILD_TOOLS}" >/dev/null
  - export ANDROID_HOME=$PWD/android-sdk-linux
  - export PATH=$PATH:$PWD/android-sdk-linux/platform-tools/
  - chmod +x ./gradlew
  # temporarily disable checking for EPIPE error and use yes to accept all licenses
  - set +o pipefail
  - yes | android-sdk-linux/tools/bin/sdkmanager --licenses
  - set -o pipefail

stages:
  - build
  - test

lintDebug:
  stage: build
  script:
    - ./gradlew -Pci --console=plain :app:lintDebug -PbuildDir=lint

assembleDebug:
  stage: build
  script:
    - ./gradlew assembleDebug
  artifacts:
    paths:
    - app/build/outputs/

debugTests:
  stage: test
  script:
    - ./gradlew -Pci --console=plain :app:testDebug
kaulex
fuente

Respuestas:

80

Esto parece ser un error con la forma en que sdkmanager ubica la carpeta de instalación del SDK.

Una solución alternativa es establecer la bandera --sdk_root. Puede mover la declaración ANDROID_HOME más arriba y luego usarla con los comandos posteriores.

 - export ANDROID_HOME=$PWD/android-sdk-linux
 - yes | android-sdk-linux/tools/bin/sdkmanager --sdk_root=${ANDROID_HOME} --licenses
 - android-sdk-linux/tools/bin/sdkmanager --sdk_root=${ANDROID_HOME} "platform-tools" "platforms;android-${ANDROID_COMPILE_SDK}" >/dev/null

Además, se movió el comando de aceptación de licencia general al primer comando para limpiar las echo ypiezas.

Por extraño que parezca, si lo ejecuta sdkmanager --sdk_root=${ANDROID_HOME} "tools", actualizará las herramientas de 3.6.0 a 26.1.1 y sdkmanager ya no tiene este problema. Esta actualización requiere tiempo y ancho de banda y no es exactamente necesaria con la solución.

llamador9
fuente
1
funcionó bien, ahora recibo un error con ./gradlew assembleDebug, pero parece que esto ya no tiene nada que ver con el sdkmanager. ¡Gracias!
kaulex
1
¿Me puede dar un ejemplo de cómo puedo limpiar mi eco? No lo entiendo
kaulex
1
He actualizado el fragmento en mi respuesta original para aclarar la eliminación de los echo ycomandos.
llamador9
1
¡Gracias! ¡Ayuda mucho!
kaulex
2
la línea de exportación y luego el sdkmanager --sdk_root=${ANDROID_HOME} "tools"bit lo hizo por mí, ¡gracias!
gattsbr
23

Para aquellos que tuvieron dificultades para instalar las herramientas de línea de comandos de Android para Appium en Windows 10 / x64, simplemente haga lo siguiente:

  1. Descargue las últimas herramientas de línea de comandos desde Android, es decir, commandlinetools-win-6200805_latest.zip
  2. Descomprima el archivo descargado
  3. Cree un directorio para almacenar herramientas de línea de comandos en algún lugar de su disco, con la siguiente ruta incluida: android / cmdline-tools / latest Básicamente, cuando descomprima estas herramientas de línea Cmd, simplemente cambie el nombre del directorio de herramientas a último y asegúrese de poner esta última carpeta en android / cmdline -tools directorio en algún lugar de su disco
  4. Cree la variable de entorno ANDROID_HOME para el directorio que almacena la ubicación del directorio de herramientas cmdline como: C: \ YourLocationWhereYouStoreTheDirectory \ android \ cmdline-tools \ latest
  5. Cree una nueva entrada en la variable de entorno Path como % ANDROID_HOME% \ bin
ArturS
fuente
2
¿De dónde viene la necesidad de este "android / cmdline-tools / latest"? código fuente ? algún documento en alguna parte?
Tristán
1
La razón se describe en este tema: stackoverflow.com/questions/60460429/…
ArturS
En el tema al que hace referencia, la respuesta dice "export ANDROID_HOME =" / Users / darish / development / sdk / android "" no "latest", no "cmdline-tools"
Tristan
1
@Tristan cmdline-toolses imprescindible, pero latestno es obligatorio. Y la ruta (o nombre) cmdline-toolsproviene del propio SDK de Android. Puede ejecutar este comando sdkmanager --sdk_root=${ANDROID_HOME} --list, donde los resultados incluyen "cmdline-tools; 1.0 | 1.0 | Android SDK Command-line Tools"
Jing Li
No sé qué lógica hay detrás de esto. Pero funciona :-)
Soorya
19

La descarga de las nuevas herramientas cmdline del sitio web para desarrolladores de Android requiere que se respete la siguiente estructura de directorios.

ImperadorSid
fuente
2
¿Por qué se requiere? De donde viene esto ? código fuente ? Doc ?
Tristán
1
Configuré mi CI para usar esta estructura y, si bien me permite ejecutar sdkmanager, cuando mi proyecto se construye con gradle, no sabe cómo ubicar las plataformas y las licencias correctamente y todo falla.
Matt Wolfe
19

En lugar de pasar el argumento --sdk_rootpara cada ejecución de comando individual, profundicemos en la causa real.

A partir de Android SDK Command-line Tools 1.0.0 (6200805) , en contraste con Android SDK 26.1.1 (4333796) , la toolsjerarquía de directorios ha cambiado. Anteriormente se colocó justo dentro ANDROID_HOME, ahora todavía se llama como tools(lo único que obtendrá después de desempacar el archivo zip descargado de la línea de comandos ), pero de manera diferente, debe colocarlo dentro de un directorio llamado cmdline-toolspor su cuenta. El nombre cmdline-toolsproviene de su nombre de paquete, donde puede obtenerlo del comando de listado de paquetes sdkmanager --list, cuyas salidas incluyen cmdline-tools;1.0 | 1.0 | Android SDK Command-line Tools.

Ajustar el toolsdirectorio dentro del cmdline-toolsdirectorio lo haría funcionar, y lo ayudaría a deshacerse del --sdk_rootargumento molesto . ¿Pero qué hay de las otras partes?

Bueno, eso es todo lo que tienes que cambiar. Déjame explicarte más.

  • El rey: sdkmanagervive dentro cmdline-tools/tools/bin, será mejor que establezcas PATHuna variable de entorno
  • cmdline-toolsno debe establecerse como ANDROID_HOME. Porque más tarde, al actualizar el SDK de Android o al instalar más paquetes, los otros paquetes se colocarán debajo ANDROID_HOME, pero no debajo cmdline-tools.
  • El, completa última ANDROID_HOMEestructura de directorios debe ser similar a continuación, consistirá en un buen número de subdirectorios: build-tools, cmdline-tools, emulator, licenses, patcher, platform-tools, platforms, system-images. Puede señalarlo fácilmente build-toolsy cmdline-toolsson hermanos, todos se sientan dentro de los padres ANDROID_HOME.

Permítanme recapitular de una manera simple:

  • Establezca su preferido ANDROID_HOME(como antes)
  • Descargue y descomprima el archivo zip de commandlinetools en un directorio llamado cmdline-tools, que está dentroANDROID_HOME
  • Agregue el directorio $ANDROID_HOME/cmdline-tools/tools/bina la variable de entorno PATH, de modo que el sistema sepa dónde encontrarsdkmanager
Jing Li
fuente
Esta es la respuesta correcta. A diferencia de las otras respuestas, esto mantiene el directorio "herramientas", que en realidad es lo que está en el archivo zip.
SystemParadox
Muchas gracias, has respondido mi pregunta :)
R-obert
gran respuesta que "en realidad" resuelve el problema!
mohamnag hace
5

Tengo el mismo problema, vino aquí por Google. Según el AndroidStudio Archive , hoy fue el lanzamiento de 4.1. Supongo que no es casualidad.

Esta guía completamente no relacionada tiene un enlace duro para una versión anterior de las herramientas SDK para Linux . Puede cambiar la URL a Windows o Mac para otros sistemas operativos. Lo usaré como revisión por ahora.

(se suponía que era un comentario, no una solución)

jnnks
fuente
Los enlaces no funcionan, ya intenté usar una versión anterior, pero uso nuevas funciones en mi base de código, así que ya no puedo usar la anterior. Entonces esta solución no funciona para mí.
kaulex
5

El sdkmanager intenta descubrir la ruta android-sdk en función de dónde está desempaquetado, sin usar las variables de entorno, como ANDROID_SDK_ROOT. Pero empeora, porque tiene una carpeta principal codificada llamada cmdline-tools y si descomprime las herramientas de línea de comandos dentro de una carpeta con otro nombre, no funciona, lo que nos obliga a usar el parámetro sdk_root para alimentar la variable interna correctamente.

Entonces, con eso en mente, podemos usar el siguiente enfoque para resolver esto.

Asumiré que estamos usando Ubuntu OS, por lo que si no lo está, debe adaptar algunas de esas instrucciones.

  1. Instale Android-SDK.

    sudo apt install android-sdk

    Después de la instalación, tendrá una carpeta llamada android-sdk en / usr / lib

  2. Cree una carpeta llamada cdmline-tools dentro de la carpeta android-sdk

    sudo mkdir /usr/lib/android-sdk/cmdline-tools
  3. Descargue el zip de las herramientas de línea de comandos de Android desde aquí ( https://developer.android.com/studio?hl=es-419#downloads )
  4. Descomprima el archivo que acaba de descargar dentro de / usr / lib / android-sdk / cmdline-tools

    sudo unzip /path/for/commandlinetools-linux-6200805_latest.zip -d /usr/lib/android-sdk/cmdline-tools
  5. Ve a tu directorio de inicio y edita tu .profile

    nano .profile
  6. Crear una variable ANDROID_SDK_ROOT

    export ANDROID_SDK_ROOT=/usr/lib/android-sdk
  7. Pon la carpeta sdkmanager en tu camino

    export PATH=$ANDROID_SDK_ROOT/cmdline-tools/tools/bin:$PATH
  8. Guardar y Salir
  9. Recarga tu perfil

    . ~/.profile
  10. correr

    sdkmanager --version

Debería ver la versión impresa en su terminal.

awquadros
fuente
1
¡Funcionó a las mil maravillas! gracias de nuevo por esta solución completa
Vivian
4

Encontré la solución para usar las últimas herramientas de línea de comandos siguiendo estos pasos:

1 - Extracción de las herramientas de línea de comandos en una carpeta con esta estructura: por ejemplo: $HOME/Development/android/cmdline-tools/latest (esta carpeta debe contener lib , bin , Notice.txt y source.properties )

2 - Definición de ANDROID_HOME como una variable de entorno:

ANDROID_HOME="$HOME/Development/android/cmdline-tools/latest"

3 - Cargando en RUTA :

PATH="$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/tools/lib:$ANDROID_HOME/tools/bin:$ANDROID_HOME/platform-tools"
Kaio Cesar Koerich
fuente
Información contradictoria: "último (esta carpeta debe contener lib, bin, ...)", ANDROID_HOME = "... / latest" PATH = "... $ ANDROID_HOME / tools / lib
Tristan
lib está en herramientas o en ANDROID_HOME?
Tristan
Esta debería ser la respuesta aceptada
Shivam Jha
cmdline-toolses imprescindible, sin embargo, no latestes obligatorio.
Jing Li
3

Me gustaría compartir mi experiencia.

Al principio trato de explicar por qué la estructura de directorios tiene que verse como se muestra en esta respuesta: https://stackoverflow.com/a/60460681/1758733 . https://stackoverflow.com/users/668455/tristan pidió una explicación varias veces, así que espero aclarar la situación con el próximo experimento:

1. unpack cmdline-tools to any path, for example c:\Android\tools;
2. create a folder for SDK, let it be c:\Android\SDK;
3. install cmdline-tools (yes, we install cmdline-tools again =)):
    c:\Android\tools\bin\sdkmanager --sdk_root=c:\Android\SDK "cmdline-tools;latest"
4. at this moment we can examine c:\Android\SDK and locate
    the path c:\Android\SDK\cmdline-tools\latest. If we compare
    this folder with the previous version c:\Android\tools we find out
    that they are identical. The new installed c:\Android\SDK\cmdline-tools\latest\sdkmanager works
    without --sdk_root argument so we could initially unpack cmdline-tools
    to cmdline-tools\latest.

Uno puede encontrar otro problema: bloqueado en ".android / repositories.cfg no se pudo cargar".

Otros asuntos y hechos:

1. QtCreator works with another sdkmanager that placed in SDK_ROOT/tools/bin
2. SDK_ROOT/tools/bin/sdkmanager works only with JDK 8
3. Java uses its own storage for certificates and it's not convinient usually.
    Thus one may want to use Windows certificate store. Unfortunately Grandle has the
    issue - https://stackoverflow.com/a/59056537 - so use the following:
    set JAVA_OPTS=-Djavax.net.ssl.trustStoreType=Windows-ROOT -Djavax.net.ssl.trustStore=NUL

Para resumir, se puede componer la siguiente receta para el desarrollo con Qt:

1. download commandlinetools-win-6200805_latest.zip
2. extract cmdline-tools so there will be hierarchy
    SDKROOT
        - cmdline-tools
            - latest
                - bin
                    - sdkmanager.bat
                    - ...
                - lib
                - ...
3. install JDK 8. set JAVA_HOME=c:\path\to\java so that %JAVA_HOME%/bin/java.exe exists.
4. set JAVA_OPTS=-Djavax.net.ssl.trustStoreType=Windows-ROOT -Djavax.net.ssl.trustStore=NUL
5. NDK may be downloaded manually or installed with sdkmanager
6. install required components:
    SDKROOT\cmdline-tools\latest\bin\sdkmanager "tools" "build-tools;BUILD_TOOLS_VERSION" "platform-tools" "platforms;ANDROID_VERSION"
7. run qtcreator from console so JAVA_OPTS is taken into account (or set it globaly for windows user or even station)
8. tools -> options -> devices set paths to JDK 8, SDKROOT and NDK
gshep
fuente
0

Esta página de la documentación de Unity 2018 también tiene una buena explicación para resolver este problema, incluidos puntos como:

  1. Instalación del SDK de Android sin Android Studio.
  2. Solución alternativa para "Advertencia: no se pudo crear la configuración" y "java.lang.IllegalArgumentException"
  3. El truco para Android Studio versión 3.6 o posterior.
  4. Advertencia sobre Java 9 o posterior, un JDK debe ser la versión 8.

https://docs.unity3d.com/2018.4/Documentation/Manual/android-sdksetup.html

Andrei Hryshanovich
fuente
0

Esto me sucedió al descargar las herramientas de línea de comandos independientes ( commandlinetools-mac-6200805_latest) en una nueva Mac.

Basado en todas las respuestas aquí, pude hacer que funcione así

# Define ANDROID_HOME, if not defined already
export ANDROID_HOME="~/Library/Android/sdk"

# Create the folder if missing
mkdir -p $ANDROID_HOME

# Let the tool know that it should use that SDK location. 
sdkmanager --list --sdk_root=$ANDROID_HOME

Los documentos de la --sdk_rootopción dicen "Usar la raíz del SDK especificada en lugar del SDK que contiene esta herramienta ". Esto me hizo pensar que, a pesar de ser enviado de forma independiente, la herramienta espera ser parte de un paquete donde también se instala el SDK.

mokagio
fuente
0

El primer requisito para instalar SDK (Cualquier método) es instalar Java y configurar la ruta JAVA_HOME .

Luego, las herramientas de línea de comandos del SDK necesitan una ruta de instalación sin la cual arroja NullPointerException.
Para superar esto, simplemente pase la ruta donde desea instalar SDK con el argumento "--sdk_root"
Ej. sdkmanager.bat "plataforma-herramientas" "plataformas; android-" --sdk_root =

Ecos
fuente