As ferramentas de linha de comando do Android sdkmanager sempre mostram: Aviso: não foi possível criar configurações

64

Eu uso as novas ferramentas de linha de comando do android porque o antigo repositório sdk-tools do android não está mais disponível. Então mudei meu gitlab-ci para carregar o commandlintools. Mas quando tento executá-lo, recebo o seguinte erro:

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)

Eu já tentei executar esses comandos manualmente, mas recebo o mesmo erro. Além disso, se eu executar sdkmanager --version, o mesmo erro ocorre. Meu gitlab-ci se parece com:

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
fonte

Respostas:

80

Parece ser um erro na maneira como o sdkmanager localiza a pasta de instalação do SDK.

Uma solução alternativa é definir o sinalizador --sdk_root. Você pode mover a declaração ANDROID_HOME para mais alto e usá-la com os comandos subseqüentes.

 - 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

Além disso, moveu o comando de aceitação de licença geral para o primeiro comando para limpar as echo ypeças.

Curiosamente, se você executá- sdkmanager --sdk_root=${ANDROID_HOME} "tools"lo, atualizará as ferramentas de 3.6.0 para 26.1.1 e o sdkmanager não terá mais esse problema. Esta atualização leva tempo e largura de banda e não é exatamente necessária com a solução alternativa.

caller9
fonte
11
funcionou bem, agora recebo um erro com ./gradlew assembleDebug, mas parece que isso não tem mais nada a ver com o sdkmanager. Obrigado!
kaulex 28/02
11
Você pode me dar um exemplo de como posso limpar meu eco? Eu não entendo.
kaulex 29/02
11
Atualizei o snippet na minha resposta original para esclarecer a remoção dos echo ycomandos.
caller9 5/03
11
Obrigado! Ajuda muito!
kaulex 12/03
2
a linha de exportação e depois a parte sdkmanager --sdk_root=${ANDROID_HOME} "tools"fez por mim - obrigado!
gattsbr 23/03
23

Para quem teve dificuldade em instalar o Android Command Line Tools para Appium no Windows 10 / x64, faça o seguinte:

  1. Faça o download das mais recentes ferramentas de linha de comando no android, ou seja, commandlinetools-win-6200805_latest.zip
  2. Descompacte o arquivo baixado
  3. Crie um diretório para armazenar as ferramentas de linha de comando em algum lugar do disco, com o seguinte caminho: android / cmdline-tools / latest Basicamente, quando você descompactar as ferramentas desta linha de Cmd, renomeie o diretório tools para as mais recentes e certifique-se de colocar esta pasta mais recente no android / cmdline de ferramentas em algum lugar do seu disco
  4. Crie a variável de ambiente ANDROID_HOME para o diretório que armazena o local do diretório das ferramentas do cmdline, como: C: \ YourLocationWhereYouStoreTheDirectory \ android \ cmdline-tools \ latest
  5. Crie uma nova entrada na variável de ambiente Path como % ANDROID_HOME% \ bin
ArturS
fonte
2
De onde vem a necessidade deste "android / cmdline-tools / latest"? Código fonte ? algum documento em algum lugar?
Tristan
11
O motivo está descrito neste tópico: stackoverflow.com/questions/60460429/…
ArturS 17/03
No tópico que você está referenciando, a resposta diz "export ANDROID_HOME =" / Usuários / darish / development / sdk / android "" não "mais recente", não "cmdline-tools"
Tristan
11
O @Tristan cmdline-toolsé obrigatório, mas latestnão é obrigatório. E o caminho (ou nome) cmdline-toolsvem do próprio Android SDK. Você pode executar este comando sdkmanager --sdk_root=${ANDROID_HOME} --list, onde os resultados incluem "cmdline-tools; 1.0 | 1.0 | Ferramentas de linha de comando do Android SDK"
Jing Li
Não sei que lógica por trás disso. Mas funciona :-)
Soorya
19

O download das novas ferramentas do cmdline no site do desenvolvedor do Android exige que a seguinte estrutura de diretórios seja respeitada.

ImperadorSid
fonte
2
Por que é necessário? De onde isto vem ? Código fonte ? doc?
Tristan
11
Eu configurei meu IC para usar essa estrutura e, embora ele permita executar o sdkmanager, quando meu projeto é construído com gradle, ele não sabe como localizar plataformas e licenças corretamente e tudo falha.
Matt Wolfe
18

Em vez de passar o argumento --sdk_rootpara cada execução de comando único, vamos nos aprofundar na causa real.

A partir das Ferramentas de linha de comando do Android SDK 1.0.0 (6200805) , em contraste com o Android SDK 26.1.1 (4333796) , a toolshierarquia de diretórios foi alterada. Anteriormente, ele foi colocado dentro ANDROID_HOME, agora ainda é nomeado como tools(a única coisa que você terá depois de descompactar o arquivo zip baixado commandlinetools ), mas, diferentemente, você deve colocá-lo dentro de um diretório chamado cmdline-toolspor conta própria. O nome cmdline-toolsvem do nome do pacote, onde você pode obter listando o comando packages sdkmanager --list, cujas saídas incluem cmdline-tools;1.0 | 1.0 | Android SDK Command-line Tools.

O agrupamento do toolsdiretório dentro do cmdline-toolsdiretório o faria funcionar e o ajudaria a se livrar do --sdk_rootargumento irritante . Mas e as outras partes?

Bem, isso é tudo que você precisa mudar. Deixe-me explicar mais.

  • O rei - sdkmanager vive dentrocmdline-tools/tools/bin , é melhor definir PATHa variável de ambiente
  • cmdline-tools não deve ser definido como ANDROID_HOME . Como mais tarde, ao atualizar o Android SDK ou instalar mais pacotes, os outros pacotes serão colocados abaixo ANDROID_HOME, mas não abaixo cmdline-tools.
  • A completa, definitiva ANDROID_HOMEestrutura de diretórios deve ser semelhante a seguir, consistem em algumas sub-diretórios: build-tools, cmdline-tools, emulator, licenses, patcher, platform-tools, platforms, system-images. Você pode facilmente apontar quebuild-tools ecmdline-tools são irmãos, todos sentados dentro dos pais ANDROID_HOME.

Deixe-me recapitular de uma maneira simples:

  • Defina o seu preferido ANDROID_HOME (como antes)
  • Faça o download e descompacte o arquivo zip do commandlinetools em um diretório chamadocmdline-tools , que está dentroANDROID_HOME
  • Anexe o diretório $ANDROID_HOME/cmdline-tools/tools/binà variável de ambiente PATH, para que o sistema saiba onde encontrarsdkmanager
Jing Li
fonte
Essa é a resposta correta. Diferentemente das outras respostas, isso mantém o diretório "tools", que é realmente o que está no arquivo zip.
SystemParadox
Muito obrigado, você respondeu à minha pergunta :)
R-obert
ótima resposta que "realmente" resolve o problema!
mohamnag
5

Tem o mesmo problema, veio aqui pelo Google. De acordo com o AndroidStudio Archive , hoje foi o lançamento do 4.1. Suponho que não seja coincidência.

Este guia completamente independente possui um link físico para uma versão mais antiga do sdk-tools for linux . Você pode alterar o URL para Windows ou Mac para outros sistemas operacionais. Vou usar isso como um hotfix por enquanto.

(isso deveria ser um comentário, não uma solução)

jnnks
fonte
Os links não estão funcionando, eu já tentei usar uma versão antiga, mas utilizo novos recursos na minha base de código para não poder mais usar a antiga. Portanto, esta solução não funciona para mim.
kaulex 28/02
5

O sdkmanager tenta descobrir o caminho do android-sdk com base em onde é descompactado, sem usar as variáveis ​​de ambiente, como ANDROID_SDK_ROOT. Mas fica pior, porque ela tem uma pasta pai codificada chamada cmdline-tools e se você descompactar commandlinetools dentro de uma pasta com outro nome, ela não funcionará, forçando-nos a usar o parâmetro sdk_root para alimentar a variável interna corretamente.

Portanto, com isso em mente, podemos usar a seguinte abordagem para resolver isso.

Assumirei que estamos usando o Ubuntu OS; portanto, se você não estiver, adapte algumas dessas instruções.

  1. Instale o Android-SDK.

    sudo apt install android-sdk

    Após a instalação, você terá uma pasta chamada android-sdk em / usr / lib

  2. Crie uma pasta chamada cdmline-tools dentro da pasta android-sdk

    sudo mkdir /usr/lib/android-sdk/cmdline-tools
  3. Faça o download do zip das ferramentas de linha de comando do Android aqui ( https://developer.android.com/studio?hl=en-419#downloads )
  4. Descompacte o arquivo que você acabou de baixar 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. Vá para o diretório home e edite seu perfil.

    nano .profile
  6. Crie uma variável ANDROID_SDK_ROOT

    export ANDROID_SDK_ROOT=/usr/lib/android-sdk
  7. Coloque a pasta sdkmanager no seu caminho

    export PATH=$ANDROID_SDK_ROOT/cmdline-tools/tools/bin:$PATH
  8. Salvar e sair
  9. Atualizar seu perfil

    . ~/.profile
  10. Corre

    sdkmanager --version

Você deve ver a versão impressa no seu terminal.

awquadros
fonte
11
Funcionou como um encanto! obrigado novamente por esta solução completa
Vivian
4

Encontrei a solução para usar as mais recentes ferramentas de linha de comando, seguindo estas etapas:

1 - Extraindo as ferramentas de linha de comando em uma pasta com esta estrutura: por exemplo: $HOME/Development/android/cmdline-tools/latest (essa pasta deve conter lib , bin , notice.txt e source.properties )

2 - Definindo ANDROID_HOME como uma variável de ambiente:

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

3 - Carregar no PATH :

PATH="$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/tools/lib:$ANDROID_HOME/tools/bin:$ANDROID_HOME/platform-tools"
Kaio Cesar Koerich
fonte
Informações contraditórias: "mais recente (esta pasta deve conter lib, bin, ...)", ANDROID_HOME = "... / mais recente" PATH = "... $ ANDROID_HOME / tools / lib
Tristan
lib está em ferramentas ou em ANDROID_HOME?
Tristan
Esta deve ser a resposta aceita
Shivam Jha 27/03
cmdline-toolsé um deve ter, no entanto, latestnão é necessário.
Jing Li
3

Eu gostaria de compartilhar minha experiência.

No começo, tento explicar por que a estrutura de diretórios tem que parecer da maneira mostrada nesta resposta - https://stackoverflow.com/a/60460681/1758733 . https://stackoverflow.com/users/668455/tristan pediu explicações várias vezes, então espero esclarecer a situação com a próxima experiência:

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.

Pode-se encontrar outro problema - Preso em ".android / repositories.cfg não pôde ser carregado."

Outras questões e fatos:

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 a seguinte receita para desenvolvimento com Qt pode ser composta:

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
fonte
0

Esta página da documentação do Unity 2018 também tem uma boa explicação para resolver esse problema, incluindo pontos como:

  1. Instalando o Android SDK sem o Android Studio.
  2. Solução alternativa para “Aviso: não foi possível criar configurações” e “java.lang.IllegalArgumentException”
  3. O truque para o Android Studio versão 3.6 ou mais recente.
  4. Aviso sobre o Java 9 ou posterior, um JDK deve ser a versão 8.

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

Andrei Hryshanovich
fonte
0

Isso aconteceu comigo ao baixar as ferramentas de linha de comando independentes ( commandlinetools-mac-6200805_latest) em um novo Mac.

Com base em todas as respostas aqui, consegui fazê-lo funcionar assim

# 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

Os documentos para a --sdk_rootopção dizem "Use a raiz do SDK especificada em vez do SDK que contém esta ferramenta ". Isso me fez pensar que, apesar de ser enviada de forma independente, a ferramenta espera fazer parte de um pacote em que o SDK também está instalado.

mokagio
fonte
0

O primeiro requisito para instalar o SDK (Qualquer método) é instalar Java e definir o caminho JAVA_HOME .

Em seguida, as ferramentas de linha de comando do SDK precisam do caminho de instalação sem o qual ele lança NullPointerException.
Para superar isso, basta passar o caminho em que você deseja instalar o SDK com o argumento "--sdk_root"
. sdkmanager.bat "platform-tools" "plataformas; android-" --sdk_root =

Ecos
fonte