Gli strumenti della riga di comando di Android mostrano sempre sdkmanager: Avviso: impossibile creare le impostazioni


64

Uso i nuovi strumenti della riga di comando di Android perché il vecchio repository sdk-tools di Android non è più disponibile. Quindi ho cambiato il mio gitlab-ci per caricare i commandlintools. Ma quando provo a eseguirlo ottengo il seguente errore:

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)

Ho già provato a eseguire questi comandi a mano, ma ottengo lo stesso errore. Anche se corro sdkmanager --version, si verifica lo stesso errore. Il mio gitlab-ci assomiglia 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

Risposte:


80

Questo sembra essere un bug nel modo in cui sdkmanager individua la cartella di installazione dell'SDK.

Una soluzione è impostare la bandiera --sdk_root. Puoi spostare la dichiarazione ANDROID_HOME in alto, quindi utilizzarla con i comandi successivi.

 - 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

Inoltre, è stato spostato il comando di accettazione della licenza generale sul primo comando per ripulire le echo yparti.

Stranamente, se lo esegui sdkmanager --sdk_root=${ANDROID_HOME} "tools", aggiornerà gli strumenti da 3.6.0 a 26.1.1 e sdkmanager non ha più questo problema. Questo aggiornamento richiede tempo e larghezza di banda e non è esattamente necessario con la soluzione.


1
ha funzionato bene, ora ho un errore con ./gradlew assembleDebug, ma sembra che questo non abbia più nulla a che fare con lo sdkmanager. Grazie!
Kaulex,

1
Potete per favore farmi un esempio di come posso ripulire la mia eco? Non capisco
Kaulex,

1
Ho aggiornato lo snippet nella mia risposta originale per chiarire la rimozione dei echo ycomandi.
caller9

1
Grazie! Aiuta molto!
Kaulex

2
la linea di esportazione e poi la parte l'ha sdkmanager --sdk_root=${ANDROID_HOME} "tools"fatto per me - grazie!
Gattsbr,

23

Per coloro che hanno avuto difficoltà con l'installazione di Strumenti da riga di comando Android per Appium su Windows 10 / x64, basta fare come segue:

  1. Scarica gli ultimi strumenti della riga di comando da android ie commandlinetools-win-6200805_latest.zip
  2. Decomprimi il file scaricato
  3. Crea una directory per archiviare gli strumenti da riga di comando da qualche parte sul tuo disco, con il seguente percorso incluso: android / cmdline-tools / latest Fondamentalmente quando decomprimere questi strumenti della linea Cmd, basta rinominare la directory degli strumenti con l' ultima e assicurarsi di mettere questa ultima cartella in android / cmdline -tools directory da qualche parte sul tuo disco
  4. Crea una variabile d'ambiente ANDROID_HOME per la directory che memorizza la posizione della directory degli strumenti cmdline come: C: \ YourLocationWhereYouStoreTheDirectory \ android \ cmdline-tools \ latest
  5. Crea una nuova voce nella variabile d'ambiente Path come % ANDROID_HOME% \ bin

2
Da dove viene la necessità di questo "android / cmdline-tools / latest"? codice sorgente ? qualche documento da qualche parte?
Tristan,

1
La ragione è descritta in questo argomento: stackoverflow.com/questions/60460429/...
Arturs

Nell'argomento a cui fai riferimento, la risposta dice "export ANDROID_HOME =" / Users / darish / development / sdk / android "" no "latest", no "cmdline-tools"
Tristan

1
@Tristan cmdline-toolsè un must, tuttavia latestnon è richiesto. E il percorso (o il nome) di cmdline-toolsproviene dallo stesso SDK Android. È possibile eseguire questo comando sdkmanager --sdk_root=${ANDROID_HOME} --list, dove i risultati includono "cmdline-tools; 1.0 | 1.0 | Strumenti della riga di comando dell'SDK Android"
Jing Li

Non so quale logica ci sia dietro. Ma funziona :-)
Soorya

19

Il download dei nuovi strumenti cmdline dal sito Web degli sviluppatori Android richiede il rispetto della seguente struttura di directory.


2
Perché è richiesto? da dove viene? codice sorgente ? doc?
Tristan,

1
Configuro il mio CI per utilizzare questa struttura e mentre mi consente di eseguire sdkmanager, quando il mio progetto viene realizzato con gradle non sa come individuare correttamente piattaforme e licenze e tutto fallisce.
Matt Wolfe,

19

Invece di passare l'argomento --sdk_rootper ogni singolo comando, immergiamoci nella causa reale.

A partire da Android SDK Command-Line Tools 1.0.0 (6200805) , a differenza di Android SDK 26.1.1 (4333796) , la toolsgerarchia delle directory è stata modificata. In precedenza era posizionato proprio all'interno ANDROID_HOME, ora è ancora chiamato come tools(l'unica cosa che otterrai dopo aver decompresso il file zip commandlinetools scaricato ), ma in modo diverso, devi inserirlo in una directory chiamata cmdline-toolsda solo. Il nome cmdline-toolsderiva dal nome del pacchetto, dove è possibile ottenere dal comando elenco pacchetti sdkmanager --list, i cui output includonocmdline-tools;1.0 | 1.0 | Android SDK Command-line Tools .

Il wrapping della toolsdirectory all'interno della cmdline-toolsdirectory lo farebbe funzionare e ti aiuterà a sbarazzarti del fastidioso--sdk_root argomento. Ma per quanto riguarda le altre parti?

Bene, questo è tutto ciò che devi cambiare. Lasciami spiegare di più.

  • Il re - sdkmanagervive dentro cmdline-tools/tools/bin, è meglio che tu sia impostato nella PATHvariabile d'ambiente
  • cmdline-toolsnon dovrebbe essere impostato come ANDROID_HOME. Perché in seguito, durante l'aggiornamento di Android SDK o l'installazione di più pacchetti, gli altri pacchetti verranno inseriti in ANDROID_HOME, ma non in cmdline-tools.
  • Il completo finale ANDROID_HOMEstruttura di directory dovrebbe essere simile di seguito, sono costituiti da un bel po 'sotto-directory: build-tools, cmdline-tools, emulator, licenses, patcher, platform-tools, platforms, system-images. Puoi facilmente far notare che sono fratelli build-toolse cmdline-toolssorelle, tutti seduti all'interno del genitore ANDROID_HOME.

Consentitemi di ricapitolare in modo semplice:

  • Imposta il tuo preferito ANDROID_HOME(proprio come prima)
  • Scarica e decomprime il file zip commandlinetools in una directory chiamata cmdline-tools, che si trova all'internoANDROID_HOME
  • Aggiungi la directory $ANDROID_HOME/cmdline-tools/tools/binalla variabile d'ambiente PATH, in modo che il sistema sappia dove trovaresdkmanager

Questa è la risposta corretta A differenza delle altre risposte, ciò mantiene la directory "tools", che in realtà è quella che si trova nel file zip.
SystemParadox,

Grazie mille, hai risposto alla mia domanda :)
R-obert,

ottima risposta che "in realtà" risolve il problema!
Mohamnag

5

Ha lo stesso problema, è venuto qui da Google. Secondo il archivio AndroidStudio , oggi è stata la versione 4.1. Suppongo che non sia una coincidenza.

Questa guida completamente indipendente ha un hardlink per una versione precedente di sdk-tools per linux . È possibile modificare l'URL in Windows o Mac per altri sistemi operativi. Per ora lo userò come hotfix.

(quello doveva essere un commento, non una soluzione)


Collegamenti non funzionanti, ho già provato a utilizzare una versione precedente, ma utilizzo nuove funzionalità nella mia base di codice, quindi non posso più utilizzare quella precedente. Quindi questa soluzione non funziona per me.
Kaulex,

5

Sdkmanager cerca di capire il percorso android-sdk in base al punto in cui è stato decompresso, senza usare le variabili di ambiente, come ANDROID_SDK_ROOT. Ma peggiora, perché ha una cartella principale codificata denominata cmdline-tools e se decomprimi commandlinetools all'interno di una cartella con un altro nome, non funziona, costringendoci a utilizzare il parametro sdk_root per alimentare correttamente la variabile interna.

Quindi, tenendo presente ciò, possiamo usare il seguente approccio per risolvere questo problema.

Presumo che stiamo usando Ubuntu OS, quindi se non lo sei, dovresti adattare alcune di queste istruzioni.

  1. Installa Android-SDK.

    sudo apt install android-sdk

    Dopo l'installazione avrai una cartella chiamata android-sdk in / usr / lib

  2. Crea una cartella chiamata cdmline-tools all'interno della cartella android-sdk

    sudo mkdir /usr/lib/android-sdk/cmdline-tools
  3. Scarica lo zip degli strumenti della riga di comando di Android da qui ( https://developer.android.com/studio?hl=en-419#downloads )
  4. Decomprimi il file che hai appena scaricato all'interno di / usr / lib / android-sdk / cmdline-tools

    sudo unzip /path/for/commandlinetools-linux-6200805_latest.zip -d /usr/lib/android-sdk/cmdline-tools
  5. Vai alla tua home directory e modifica il tuo .profile

    nano .profile
  6. Crea una variabile ANDROID_SDK_ROOT

    export ANDROID_SDK_ROOT=/usr/lib/android-sdk
  7. Inserisci la cartella sdkmanager nel tuo percorso

    export PATH=$ANDROID_SDK_ROOT/cmdline-tools/tools/bin:$PATH
  8. Salva ed esci
  9. Ricarica il tuo profilo

    . ~/.profile
  10. Correre

    sdkmanager --version

Dovresti vedere la versione stampata sul tuo terminale.


1
Ha funzionato come un fascino! grazie ancora per questa soluzione completa
Vivian

4

Ho trovato la soluzione per utilizzare gli ultimi strumenti della riga di comando seguendo questi passaggi:

1 - Estrarre gli strumenti da riga di comando in una cartella con questa struttura: ad es .: $HOME/Development/android/cmdline-tools/latest (questa cartella deve contenere lib , bin , notice.txt e source.properties )

2 - Definire ANDROID_HOME come variabile d'ambiente:

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

3 - Caricamento su PATH :

PATH="$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/tools/lib:$ANDROID_HOME/tools/bin:$ANDROID_HOME/platform-tools"

Informazioni contraddittorie: "latest (questa cartella deve contenere lib, bin, ...)", ANDROID_HOME = "... / latest" PATH = "... $ ANDROID_HOME / tools / lib
Tristan

lib è negli strumenti o in ANDROID_HOME?
Tristan,

Questa dovrebbe essere la risposta accettata
Shivam Jha il

cmdline-toolsè un must, tuttavia latestnon è richiesto.
Jing Li,

3

Vorrei condividere la mia esperienza.

All'inizio provo a spiegare perché la struttura delle directory deve apparire come mostrato in questa risposta - https://stackoverflow.com/a/60460681/1758733 . https://stackoverflow.com/users/668455/tristan ha chiesto spiegazioni più volte, quindi spero di chiarire la situazione con il prossimo esperimento:

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.

Si potrebbe verificare un altro problema: bloccato su ".android / repositories.cfg non può essere caricato."

Altre questioni e fatti:

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

Per riassumere la seguente ricetta per lo sviluppo con Qt può essere 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

0

Questa pagina della documentazione di Unity 2018 contiene anche una buona spiegazione della risoluzione di questo problema, inclusi punti come:

  1. Installazione di Android SDK senza Android Studio.
  2. Soluzione alternativa per "Avviso: impossibile creare le impostazioni" e "java.lang.IllegalArgumentException"
  3. Il trucco per Android Studio versione 3.6 o successiva.
  4. Avviso su Java 9 o versioni successive, un JDK deve essere la versione 8.

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


0

Questo mi è successo quando ho scaricato gli strumenti della riga di comando autonomi ( commandlinetools-mac-6200805_latest) su un nuovo Mac.

Sulla base di tutte le risposte qui, sono stato in grado di farlo funzionare in questo modo

# 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

I documenti per l' --sdk_rootopzione dicono "Usa la radice SDK specificata invece dell'SDK contenente questo strumento ". Questo mi ha fatto pensare che, nonostante sia stato spedito da solo, lo strumento prevede di far parte di un pacchetto in cui è installato anche l'SDK.


0

Il primo requisito per installare SDK (qualsiasi metodo) è installare Java e impostare il percorso JAVA_HOME .

Quindi, gli strumenti da riga di comando SDK necessitano del percorso di installazione senza il quale genera NullPointerException.
Per ovviare a questo, basta passare il percorso in cui si desidera installare SDK con l'argomento "--sdk_root"
Ad es. sdkmanager.bat "piattaforme-strumenti" "piattaforme; android-" --sdk_root =

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.