Les outils de ligne de commande Android sdkmanager affiche toujours: Avertissement: impossible de créer des paramètres


65

J'utilise les nouveaux outils de ligne de commande d'Android car l'ancien référentiel sdk-tools d'Android n'est plus disponible. J'ai donc changé mon gitlab-ci pour charger les commandlintools. Mais lorsque j'essaie de l'exécuter, j'obtiens l'erreur suivante:

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)

J'ai déjà essayé d'exécuter ces commandants à la main, mais j'obtiens la même erreur. Aussi, si je cours sdkmanager --version, la même erreur se produit. Mon gitlab-ci ressemble à:

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

Réponses:


80

Cela semble être un bogue avec la façon dont sdkmanager localise le dossier d'installation du SDK.

Une solution de contournement consiste à définir le drapeau --sdk_root. Vous pouvez déplacer la déclaration ANDROID_HOME plus haut, puis l'utiliser avec les commandes suivantes.

 - 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

Vous avez également déplacé la commande d'acceptation de licence globale vers la première commande pour nettoyer les echo ypièces.

Curieusement, si vous l'exécutez, sdkmanager --sdk_root=${ANDROID_HOME} "tools"il mettra à niveau les outils de 3.6.0 vers 26.1.1 et sdkmanager n'a plus ce problème. Cette mise à jour prend du temps et de la bande passante et n'est pas exactement nécessaire avec la solution de contournement.


1
a bien fonctionné, maintenant j'obtiens une erreur avec ./gradlew assembleDebug, mais il semble que cela n'a plus rien à voir avec sdkmanager. Je vous remercie!
kaulex

1
Pouvez-vous s'il vous plaît me donner un exemple sur la façon de nettoyer mon écho? Je ne comprends pas.
kaulex

1
J'ai mis à jour l'extrait de code dans ma réponse d'origine pour clarifier la suppression des echo ycommandes.
appelant9

1
Je vous remercie! Aide beaucoup!
Kaulex

2
la ligne d'exportation et puis le sdkmanager --sdk_root=${ANDROID_HOME} "tools"bit l'a fait pour moi - merci!
gattsbr

23

Pour ceux qui ont eu du mal à installer les outils de ligne de commande Android pour Appium sur Windows 10 / x64, procédez comme suit:

  1. Téléchargez les derniers outils de ligne de commande depuis Android, c'est-à-dire commandlinetools-win-6200805_latest.zip
  2. Décompressez le fichier téléchargé
  3. Créez un répertoire pour stocker les outils de ligne de commande quelque part sur votre disque, avec le chemin suivant inclus: android / cmdline-tools / latest Fondamentalement, lorsque vous décompressez ces outils de ligne Cmd, renommez simplement le répertoire tools en dernier et assurez-vous de placer ce dernier dossier dans android / cmdline -tools répertoire quelque part sur votre disque
  4. Créez la variable d'environnement ANDROID_HOME pour le répertoire qui stocke l'emplacement du répertoire des outils cmdline comme: C: \ YourLocationWhereYouStoreTheDirectory \ android \ cmdline-tools \ latest
  5. Créer une nouvelle entrée dans la variable d'environnement Path en tant que % ANDROID_HOME% \ bin

2
D'où vient le besoin de ce "android / cmdline-tools / latest"? code source ? un doc quelque part?
Tristan

1
La raison est décrite sous ce sujet: stackoverflow.com/questions/60460429/…
ArturS

Dans le sujet auquel vous faites référence, la réponse dit "export ANDROID_HOME =" / Users / darish / development / sdk / android "" no "latest", no "cmdline-tools"
Tristan

1
@Tristan cmdline-toolsest indispensable, mais latestn'est pas obligatoire. Et le chemin (ou nom) de cmdline-toolsvient du SDK Android lui-même. Vous pouvez exécuter cette commande sdkmanager --sdk_root=${ANDROID_HOME} --list, où les résultats incluent "cmdline-tools; 1.0 | 1.0 | Outils de ligne de commande SDK Android"
Jing Li

Je ne sais pas quelle logique derrière cela. Mais ça marche :-)
Soorya

20

Au lieu de passer l'argument --sdk_rootpour chaque exécution de commande unique, approfondissons la cause réelle.

À partir d' Android SDK Command-line Tools 1.0.0 (6200805) , contrairement à Android SDK 26.1.1 (4333796) , la toolshiérarchie des répertoires a été modifiée. Auparavant, il était placé juste à l'intérieur ANDROID_HOME, maintenant il est toujours nommé comme tools(la seule chose que vous obtiendrez après avoir déballé le fichier zip commandlinetools téléchargé ), mais différemment, vous devez le placer dans un répertoire appelé cmdline-toolspar vous-même. Le nom cmdline-toolsprovient de son nom de package, que vous pouvez obtenir à partir de la commande listing packages sdkmanager --list, dont les sorties incluent cmdline-tools;1.0 | 1.0 | Android SDK Command-line Tools.

Envelopper le toolsrépertoire dans le cmdline-toolsrépertoire le ferait fonctionner et vous aiderait à vous débarrasser de l' --sdk_rootargument ennuyeux . Mais qu'en est-il des autres parties?

Eh bien, c'est tout ce que vous avez à changer. Laissez-moi vous expliquer plus.

  • Le roi - sdkmanagervit à l'intérieur cmdline-tools/tools/bin, vous feriez mieux de définir PATHla variable d'environnement
  • cmdline-toolsne doit pas être défini comme ANDROID_HOME. Parce que plus tard, lors de la mise à jour du SDK Android ou de l'installation de plusieurs packages, les autres packages seront placés sous ANDROID_HOME, mais pas sous cmdline-tools.
  • La finale, complète la ANDROID_HOMEstructure du répertoire devrait ressembler comme ci - dessous, se composent d'un bon nombre de sous-répertoires: build-tools, cmdline-tools, emulator, licenses, patcher, platform-tools, platforms, system-images. Vous pouvez facilement souligner que build-toolset que vous cmdline-toolsêtes frères et sœurs, tous sont assis à l'intérieur du parent ANDROID_HOME.

Permettez-moi de récapituler de manière simple:

  • Définissez votre préférence ANDROID_HOME(comme avant)
  • Téléchargez et décompressez le fichier zip commandlinetools dans un répertoire appelé cmdline-tools, qui se trouve à l'intérieurANDROID_HOME
  • Ajoutez le répertoire $ANDROID_HOME/cmdline-tools/tools/binà la variable d'environnement PATH, afin que le système sache où trouversdkmanager

Ceci est la bonne réponse. Contrairement aux autres réponses, cela conserve le répertoire "tools", qui est en fait ce qui se trouve dans le fichier zip.
SystemParadox

Merci beaucoup, vous avez répondu à ma question :)
R-obert

excellente réponse qui "résout" réellement le problème!
mohamnag il y a

19

Le téléchargement des nouveaux outils cmdline à partir du site Web des développeurs Android nécessite le respect de la structure de répertoires suivante.


2
Pourquoi est-ce obligatoire? D'où est-ce que ça vient ? code source ? doc?
Tristan

1
J'ai configuré mon CI pour utiliser cette structure et bien qu'elle me permette d'exécuter sdkmanager, lorsque mon projet est construit avec gradle, il ne sait pas comment localiser correctement les plates-formes et les licences et tout échoue.
Matt Wolfe

5

Vous avez le même problème, venu ici par Google. Selon les archives AndroidStudio , c'est aujourd'hui la sortie de la version 4.1. Je suppose que ce n'est pas une coïncidence.

Ce guide complètement indépendant a un lien dur pour une ancienne version des outils sdk pour linux . Vous pouvez changer l'URL en windows ou mac pour d'autres OS. Je vais l'utiliser comme correctif pour l'instant.

(c'était censé être un commentaire et non une solution)


Les liens ne fonctionnent pas, j'ai déjà essayé d'utiliser une ancienne version, mais j'utilise de nouvelles fonctionnalités dans ma base de code donc je ne peux plus utiliser l'ancienne. Donc, cette solution ne fonctionne pas pour moi.
kaulex

5

Le sdkmanager essaie de comprendre le chemin android-sdk en fonction de l'endroit où il est décompressé, sans utiliser les variables d'environnement, comme ANDROID_SDK_ROOT. Mais c'est pire, car il a un dossier parent codé en dur nommé cmdline-tools et si vous décompressez commandlinetools dans un dossier avec un autre nom, cela ne fonctionne pas, nous obligeant à utiliser le paramètre sdk_root pour alimenter correctement la variable interne.

Donc, avec cela à l'esprit, nous pouvons utiliser l'approche suivante pour résoudre ce problème.

Je suppose que nous utilisons Ubuntu OS, donc si vous ne l'êtes pas, vous devriez adapter certaines de ces instructions.

  1. Installez Android-SDK.

    sudo apt install android-sdk

    Après l'installation, vous aurez un dossier appelé android-sdk dans / usr / lib

  2. Créez un dossier appelé cdmline-tools dans le dossier android-sdk

    sudo mkdir /usr/lib/android-sdk/cmdline-tools
  3. Téléchargez le zip des outils de ligne de commande Android à partir d'ici ( https://developer.android.com/studio?hl=en-419#downloads )
  4. Décompressez le fichier que vous venez de télécharger dans / usr / lib / android-sdk / cmdline-tools

    sudo unzip /path/for/commandlinetools-linux-6200805_latest.zip -d /usr/lib/android-sdk/cmdline-tools
  5. Allez dans votre répertoire d'accueil et modifiez votre .profile

    nano .profile
  6. Créer une variable ANDROID_SDK_ROOT

    export ANDROID_SDK_ROOT=/usr/lib/android-sdk
  7. Mettez le dossier sdkmanager sur votre chemin

    export PATH=$ANDROID_SDK_ROOT/cmdline-tools/tools/bin:$PATH
  8. Sauvegarder et quitter
  9. Recharger votre profil

    . ~/.profile
  10. Courir

    sdkmanager --version

Vous devriez voir la version imprimée dans votre terminal.


1
Ça a marché comme sur des roulettes! merci encore pour cette solution complète
Vivian

4

J'ai trouvé la solution pour utiliser les derniers outils de ligne de commande en suivant ces étapes:

1 - Extraire les outils de ligne de commande dans un dossier avec cette structure: par exemple: $HOME/Development/android/cmdline-tools/latest (ce dossier doit contenir lib , bin , notice.txt et source.properties )

2 - Définition d' ANDROID_HOME comme variable d'environnement:

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

3 - Chargement sur PATH :

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

Informations contradictoires: "dernier (ce dossier doit contenir lib, bin, ...)", ANDROID_HOME = "... / dernier" PATH = "... $ ANDROID_HOME / tools / lib
Tristan

lib est dans les outils ou dans ANDROID_HOME?
Tristan

Cela devrait être la réponse acceptée
Shivam Jha

cmdline-toolsest un must have, mais latestn'est pas requis.
Jing Li

3

Je voudrais partager mon expérience.

Au début, j'essaie d'expliquer pourquoi la structure du répertoire doit ressembler à celle indiquée dans cette réponse - https://stackoverflow.com/a/60460681/1758733 . https://stackoverflow.com/users/668455/tristan a demandé plusieurs fois des explications, alors j'espère que je clarifierai la situation avec la prochaine expérience:

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.

On peut rencontrer un autre problème - coincé dans ".android / repositories.cfg n'a pas pu être chargé."

Autres problèmes et faits:

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

Pour résumer, la recette de développement suivante avec Qt peut être composée:

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

Cette page de la documentation Unity 2018 a également une bonne explication de la résolution de ce problème, y compris des points tels que:

  1. Installation du SDK Android sans Android Studio.
  2. Solution de contournement pour «Avertissement: impossible de créer des paramètres» et «java.lang.IllegalArgumentException»
  3. L'astuce pour Android Studio version 3.6 ou plus récente.
  4. Avertissement concernant Java 9 ou version ultérieure, un JDK doit être la version 8.

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


0

Cela m'est arrivé lors du téléchargement des outils de ligne de commande autonomes ( commandlinetools-mac-6200805_latest) sur un nouveau Mac.

Sur la base de toutes les réponses ici, j'ai pu le faire fonctionner comme ça

# 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

Les documents de l' --sdk_rootoption indiquent "Utiliser la racine SDK spécifiée au lieu du SDK contenant cet outil ". Cela m'a fait penser que, malgré son expédition autonome, l'outil s'attend à faire partie d'un ensemble où le SDK est également installé.


0

La première exigence de l'installation du SDK (toute méthode) consiste à installer Java et à définir le chemin JAVA_HOME .

Ensuite, les outils de ligne de commande du SDK ont besoin d'un chemin d'installation sans lequel il lève NullPointerException.
Pour surmonter cela, passez simplement le chemin où vous souhaitez installer le SDK avec l'argument "--sdk_root"
Par exemple. sdkmanager.bat "platform-tools" "platformes; android-" --sdk_root =

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.