Las herramientas de línea de comandos de Android sdkmanager siempre muestran: Advertencia: no se pudieron crear configuraciones
Utilizo las nuevas herramientas de línea de comandos para Android porque el antiguo repositorio sdk-tools de Android ya no está disponible. Así que cambié mi gitlab-ci para cargar el archivo commandlintools
. 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 aparece el mismo error. Además, si ejecuto sdkmanager --version
, ocurre el mismo error. Mi gitlab-ci se parece a:
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
En lugar de pasar el argumento --sdk_root
para cada ejecución de comando, profundicemos en la causa real.
A partir de Android SDK Command-line Tools 1.0.0 (6200805) , a diferencia de Android SDK 26.1.1 (4333796)tools
, se ha cambiado la jerarquía de directorios. Anteriormente se colocaba justo dentro ANDROID_HOME
(lo cual está en desuso, usaremos el término ANDROID_SDK_ROOT
para el resto del párrafo), ahora todavía se llama así tools
(lo único que obtendrá después de descomprimir el archivo zip de commandlinetools descargado ), pero de manera diferente, Tienes que colocarlo dentro de un directorio llamado cmdline-tools
por tu cuenta. El nombre cmdline-tools
proviene del nombre de su paquete, donde puede obtenerlo al enumerar el comando de paquetes sdkmanager --list
, cuyas salidas incluyen cmdline-tools;1.0 | 1.0 | Android SDK Command-line Tools
.
Envolver tools
el directorio dentro cmdline-tools
del directorio haría que funcione y le ayudaría a deshacerse del molesto --sdk_root
argumento. Pero ¿qué pasa con las otras partes?
Bueno, eso es todo lo que tienes que cambiar. Déjame explicarte más.
- El rey:
sdkmanager
vive dentrocmdline-tools/tools/bin
, será mejor que lo establezcas enPATH
la variable de entorno cmdline-tools
no debe establecerse comoANDROID_SDK_ROOT
. Porque más adelante, al actualizar el SDK de Android o instalar más paquetes, los otros paquetes se colocarán enANDROID_SDK_ROOT
, pero no encmdline-tools
.- La estructura de directorios final y completa
ANDROID_SDK_ROOT
debería verse como a continuación y constar de bastantes subdirectorios:build-tools
,cmdline-tools
,emulator
,licenses
,patcher
,platform-tools
,platforms
,system-images
. Puedes señalar fácilmente quebuild-tools
ycmdline-tools
son hermanos, todos se sientan dentro del padreANDROID_SDK_ROOT
.
Permítanme resumir de una manera sencilla:
- Establece tu preferido
ANDROID_SDK_ROOT
(como antes) - Descargue y descomprima el archivo zip de commandlinetools en un directorio llamado
cmdline-tools
, que se encuentra dentroANDROID_SDK_ROOT
- Agregue el directorio
$ANDROID_SDK_ROOT/cmdline-tools/tools/bin
a la variable de entornoPATH
, para que el sistema sepa dónde encontrarlosdkmanager
!!¡¡ACTUALIZAR!!
El comportamiento ha cambiado nuevamente desde la compilación 6858069
(Herramientas de línea de comandos del SDK de Android 3.0):
- Después de descomprimir el paquete, el directorio superior que obtendrá es
cmdline-tools
. - Cambie el nombre del directorio descomprimido de
cmdline-tools
atools
y colóquelo debajo$ANDROID_SDK_ROOT/cmdline-tools
, de modo que ahora debería verse así:$ANDROID_SDK_ROOT/cmdline-tools/tools
. Y en su interior deberías tener:NOTICE.txt bin lib source.properties
. En realidad, según el documento oficial de herramientas de línea de comandos , la estructura de árbol debería serandroid_sdk/cmdline-tools/version/bin/
, pero lo he comprobado, usarversion
otools
no hace ninguna diferencia aquí. - Para su variable de entorno
PATH
, le recomendaría que la configure de esta manera:,PATH=$PATH:$ANDROID_SDK_ROOT/cmdline-tools/latest/bin:$ANDROID_SDK_ROOT/cmdline-tools/tools/bin
porque después de la actualización posterior, obtendrá la últimasdkmanager
versión debajo de$ANDROID_SDK_ROOT/cmdline-tools/latest/bin
, si la coloca al frente, tendrá mayor prioridad.
Esto parece ser un error en la forma en que sdkmanager localiza la carpeta de instalación del SDK.
Una solución alternativa es establecer la bandera --sdk_root
. Puede mover la declaración ANDROID_HOME hacia arriba y luego usarla con los comandos siguientes.
- 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 general de aceptación de licencia al primer comando para limpiar las echo y
piezas.
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 alternativa.
Para aquellos que tuvieron problemas para instalar las herramientas de línea de comandos de Android para Appium en Windows 10/x64, simplemente hagan lo siguiente:
- Descargue las últimas herramientas de línea de comandos de Android, es decir, commandlinetools-win-6200805_latest.zip
- Descomprime el archivo descargado
- 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 de comandos, simplemente cambie el nombre del directorio de herramientas al más reciente y asegúrese de colocar esta última carpeta en android/cmdline. -directorio de herramientas en algún lugar de su disco
- 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
- Cree una nueva entrada en la variable de entorno Ruta como %ANDROID_HOME%\bin
Intenta sdkmanager
descubrir la ruta del SDK de Android en función del lugar donde está descomprimido, sin utilizar las variables de entorno, como ANDROID_SDK_ROOT
. Pero es peor, porque tiene una carpeta principal codificada con un nombre cmdline-tools
y si descomprimes 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 esto en mente, podemos utilizar el siguiente enfoque para resolver esto.
Asumiré que estamos usando el sistema operativo Ubuntu, por lo que si no es así, deberías adaptar algunas de esas instrucciones.
Instale el SDK de Android.
sudo apt install android-sdk
Después de la instalación tendrás una carpeta llamada android-sdk en /usr/lib
Cree una carpeta llamada cdmline-tools dentro de la carpeta android-sdk
sudo mkdir /usr/lib/android-sdk/cmdline-tools
Descargue el zip de las herramientas de línea de comandos de Android desde aquí ( https://developer.android.com/studio?hl=en-419#downloads )
Desempaquete 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
Vaya a su directorio de inicio y edite su .profile
nano .profile
Crear una variable ANDROID_SDK_ROOT
export ANDROID_SDK_ROOT=/usr/lib/android-sdk
Coloque la carpeta sdkmanager en su ruta
export PATH=$ANDROID_SDK_ROOT/cmdline-tools/tools/bin:$PATH
Guardar y Salir
Recarga tu perfil
. ~/.profile
Correr
sdkmanager --version
Deberías ver la versión impresa en tu terminal.