Android-Befehlszeilentools sdkmanager zeigt immer Folgendes an: Warnung: Es konnten keine Einstellungen erstellt werden

64

Ich benutze die neuen Kommandozeilen-Tools von Android, weil das alte SDK-Tools-Repository von Android nicht mehr verfügbar ist. Also habe ich mein gitlab-ci geändert, um die commandlintools zu laden. Aber wenn ich versuche, es auszuführen, erhalte ich den folgenden Fehler:

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)

Ich habe bereits versucht, diese Befehle von Hand auszuführen, aber ich erhalte den gleichen Fehler. Auch wenn ich laufe sdkmanager --version, tritt der gleiche Fehler auf. Mein gitlab-ci sieht aus wie:

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
quelle

Antworten:

80

Dies scheint ein Fehler bei der Art und Weise zu sein, wie sdkmanager den SDK-Installationsordner findet.

Eine Problemumgehung besteht darin, das Flag zu setzen --sdk_root. Sie können die ANDROID_HOME-Deklaration höher verschieben und dann mit den nachfolgenden Befehlen verwenden.

 - 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

Außerdem wurde der Befehl zur Annahme einer Pauschallizenz in den ersten Befehl zum Bereinigen der echo yTeile verschoben .

Seltsamerweise sdkmanager --sdk_root=${ANDROID_HOME} "tools"werden die Tools von 3.6.0 auf 26.1.1 aktualisiert, und sdkmanager hat dieses Problem nicht mehr. Dieses Update benötigt Zeit und Bandbreite und ist bei der Umgehung nicht unbedingt erforderlich.

caller9
quelle
1
hat gut funktioniert, jetzt bekomme ich eine Fehlermeldung mit ./gradlew assembleDebug, aber es scheint, dass dies nichts mehr mit dem sdkmanager zu tun hat. Vielen Dank!
Kaulex
1
Können Sie mir bitte ein Beispiel geben, wie ich mein Echo aufräumen kann? Ich verstehe es nicht
Kaulex
1
Ich habe das Snippet in meiner ursprünglichen Antwort aktualisiert, um das Entfernen der echo yBefehle zu verdeutlichen .
Anrufer9
1
Vielen Dank! Hilft sehr!
Kaulex
2
Die Exportlinie und dann das sdkmanager --sdk_root=${ANDROID_HOME} "tools"bisschen hat es für mich getan - danke!
Gattsbr
23

Für diejenigen, die Probleme mit der Installation der Android-Befehlszeilentools für Appium unter Windows 10 / x64 haben, gehen Sie wie folgt vor:

  1. Laden Sie die neuesten Befehlszeilentools von Android herunter, z. B. commandlinetools-win-6200805_latest.zip
  2. Entpacken Sie die heruntergeladene Datei
  3. Erstellen Sie ein Verzeichnis zum Speichern von Befehlszeilentools irgendwo auf Ihrer Festplatte, mit folgendem Pfad: android / cmdline-tools / latest Wenn Sie diese Cmd-Zeilen-Tools entpacken, benennen Sie das Tools- Verzeichnis einfach in " Neueste" um und stellen Sie sicher, dass Sie diesen neuesten Ordner in " Android / cmdline" ablegen -tools Verzeichnis irgendwo auf Ihrer Festplatte
  4. Erstellen Sie die Umgebungsvariable ANDROID_HOME für das Verzeichnis, in dem der Verzeichnisspeicherort der cmdline-Tools gespeichert ist, z. B.: C: \ YourLocationWhereYouStoreTheDirectory \ android \ cmdline-tools \ latest
  5. Erstellen Sie einen neuen Eintrag in der Umgebungsvariablen Pfad als % ANDROID_HOME% \ bin
ArturS
quelle
2
Woher kommt der Bedarf an diesem "android / cmdline-tools / latest"? Quellcode ? Irgendwo ein Doc?
Tristan
1
Der Grund wird unter diesem Thema beschrieben: stackoverflow.com/questions/60460429/…
ArturS
In dem Thema, auf das Sie verweisen, lautet die Antwort "export ANDROID_HOME =" / Users / darish / development / sdk / android "" no "latest", no "cmdline-tools"
Tristan
1
@Tristan cmdline-toolsist ein Muss, ist aber latestnicht erforderlich. Der Pfad (oder Name) von cmdline-toolsstammt aus dem Android SDK selbst. Sie können diesen Befehl ausführen sdkmanager --sdk_root=${ANDROID_HOME} --list, wobei die Ergebnisse "cmdline-tools; 1.0 | 1.0 | Android SDK-Befehlszeilentools"
Jing Li
Ich weiß nicht, welche Logik dahinter steckt. Aber es funktioniert :-)
Soorya
19

Für das Herunterladen der neuen cmdline-Tools von der Android Developer-Website muss die folgende Verzeichnisstruktur eingehalten werden.

ImperadorSid
quelle
2
Warum ist es erforderlich? woher kommt das ? Quellcode ? doc?
Tristan
1
Ich richte mein CI so ein, dass es diese Struktur verwendet, und obwohl es mir erlaubt, sdkmanager auszuführen, weiß mein Projekt beim Erstellen mit gradle nicht, wie Plattformen und Lizenzen richtig zu finden sind, und alles schlägt fehl.
Matt Wolfe
18

Anstatt das Argument --sdk_rootfür jede einzelne Befehlsausführung zu übergeben, wollen wir uns eingehend mit der wahren Ursache befassen.

Ab Android SDK Command-Line Tools 1.0.0 (6200805) wurde im Gegensatz zu Android SDK 26.1.1 (4333796) die toolsVerzeichnishierarchie geändert. Früher wurde es direkt im Inneren abgelegt ANDROID_HOME, jetzt heißt es immer noch als tools(das einzige, was Sie nach dem Entpacken der heruntergeladenen ZIP-Datei für commandlinetools erhalten ), aber anders müssen Sie es in einem Verzeichnis ablegen , das Sie selbst aufgerufen haben cmdline-tools. Der Name cmdline-toolsstammt von seinem Paketnamen, den Sie über den Befehl "Listings packages" abrufen können sdkmanager --list, zu dessen Ausgaben gehören cmdline-tools;1.0 | 1.0 | Android SDK Command-line Tools.

Wenn Sie das toolsVerzeichnis in das cmdline-toolsVerzeichnis einschließen, funktioniert es und Sie können das nervige --sdk_rootArgument loswerden . Aber was ist mit den anderen Teilen?

Das ist alles, was Sie ändern müssen. Lassen Sie mich mehr erklären.

  • Der König - sdkmanagerlebt im Inneren cmdline-tools/tools/bin, Sie sollten besser die PATHUmgebungsvariable einstellen
  • cmdline-toolssollte nicht als eingestellt werden ANDROID_HOME. Denn später, wenn Sie das Android SDK aktualisieren oder weitere Pakete installieren, werden die anderen Pakete unter ANDROID_HOME, aber nicht unter platziert cmdline-tools.
  • Die endgültige, vollständige ANDROID_HOMEVerzeichnisstruktur wie folgt aussehen soll, besteht aus ganz wenigen Unterverzeichnissen: build-tools, cmdline-tools, emulator, licenses, patcher, platform-tools, platforms, system-images. Sie können leicht darauf hinweisen build-toolsund cmdline-toolssind Geschwister, alle sitzen im Elternteil ANDROID_HOME.

Lassen Sie mich auf einfache Weise zusammenfassen:

  • Stellen Sie Ihre bevorzugten ein ANDROID_HOME(genau wie zuvor)
  • Downloaden und entpacken Sie die commandlinetools Datei in ein Verzeichnis zip genannt cmdline-tools, die im Inneren istANDROID_HOME
  • Hängen Sie das Verzeichnis $ANDROID_HOME/cmdline-tools/tools/binan die Umgebungsvariable an PATH, damit das System weiß, wo es zu finden istsdkmanager
Jing Li
quelle
Dies ist die richtige Antwort. Im Gegensatz zu den anderen Antworten bleibt hier das Verzeichnis "tools" erhalten, das sich tatsächlich in der Zip-Datei befindet.
SystemParadox
Vielen Dank, Sie haben meine Frage beantwortet :)
R-obert
tolle Antwort, die "tatsächlich" das Problem löst!
mohamnag vor
5

Habe das gleiche Problem, kam hier von Google. Laut dem AndroidStudio-Archiv war heute die Veröffentlichung von 4.1. Ich nehme an, das ist kein Zufall.

Diese völlig unabhängige Anleitung enthält einen Hardlink für eine ältere Version der SDK-Tools für Linux . Sie können die URL für andere Betriebssysteme in Windows oder Mac ändern. Ich werde das vorerst als Hotfix verwenden.

(das sollte ein Kommentar sein, keine Lösung)

jnnks
quelle
Links funktionieren nicht, ich habe bereits versucht, eine alte Version zu verwenden, aber ich verwende neue Funktionen in meiner Codebasis, sodass ich die alte nicht mehr verwenden kann. Diese Lösung funktioniert also bei mir nicht.
Kaulex
5

Der sdkmanager versucht, den android-sdk-Pfad basierend auf dem Entpackungsort zu ermitteln, ohne die Umgebungsvariablen wie ANDROID_SDK_ROOT zu verwenden. Aber es wird schlimmer, weil es einen fest codierten übergeordneten Ordner namens cmdline-tools hat und wenn Sie Befehlslinientools in einem Ordner mit einem anderen Namen entpacken, funktioniert dies nicht und zwingt uns, den Parameter sdk_root zu verwenden, um die innere Variable korrekt einzugeben.

In diesem Sinne können wir den folgenden Ansatz verwenden, um dies zu lösen.

Ich gehe davon aus, dass wir Ubuntu OS verwenden. Wenn Sie dies nicht tun, sollten Sie einige dieser Anweisungen anpassen.

  1. Installieren Sie das Android-SDK.

    sudo apt install android-sdk

    Nach der Installation haben Sie einen Ordner namens android-sdk in / usr / lib

  2. Erstellen Sie einen Ordner namens cdmline-tools im android-sdk-Ordner

    sudo mkdir /usr/lib/android-sdk/cmdline-tools
  3. Laden Sie die Zip-Datei für Android-Befehlszeilentools von hier herunter ( https://developer.android.com/studio?hl=de-419#downloads ).
  4. Entpacken Sie die gerade heruntergeladene Datei in / usr / lib / android-sdk / cmdline-tools

    sudo unzip /path/for/commandlinetools-linux-6200805_latest.zip -d /usr/lib/android-sdk/cmdline-tools
  5. Gehen Sie zu Ihrem Home-Verzeichnis und bearbeiten Sie Ihr .profile

    nano .profile
  6. Erstellen Sie eine ANDROID_SDK_ROOT-Variable

    export ANDROID_SDK_ROOT=/usr/lib/android-sdk
  7. Legen Sie den Ordner sdkmanager in Ihren Pfad

    export PATH=$ANDROID_SDK_ROOT/cmdline-tools/tools/bin:$PATH
  8. Speichern und schließen
  9. Laden Sie Ihr Profil neu

    . ~/.profile
  10. Lauf

    sdkmanager --version

Sie sollten die Version in Ihrem Terminal sehen.

Awquadros
quelle
1
es hat wie ein Zauber funktioniert!
Vivian
4

Ich habe die Lösung gefunden, um die neuesten Befehlszeilentools mithilfe der folgenden Schritte zu verwenden:

1 - Extrahieren der Befehlszeilentools in einen Ordner mit folgender Struktur: Beispiel: $HOME/Development/android/cmdline-tools/latest (Dieser Ordner muss lib , bin , Notice.txt und source.properties enthalten. )

2 - Definieren von ANDROID_HOME als Umgebungsvariable:

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

3 - Laden auf PATH :

PATH="$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/tools/lib:$ANDROID_HOME/tools/bin:$ANDROID_HOME/platform-tools"
Kaio Cesar Koerich
quelle
Widersprüchliche Informationen: "Neueste (dieser Ordner muss lib, bin, ... enthalten)", ANDROID_HOME = "... / neueste" PATH = "... $ ANDROID_HOME / tools / lib
Tristan
lib ist in tools oder in ANDROID_HOME?
Tristan
Dies sollte die akzeptierte Antwort sein
Shivam Jha
cmdline-toolsist ein Muss, ist aber latestnicht erforderlich.
Jing Li
3

Ich möchte meine Erfahrungen teilen.

Zuerst versuche ich zu erklären, warum die Verzeichnisstruktur so aussehen muss, wie in dieser Antwort gezeigt - https://stackoverflow.com/a/60460681/1758733 . https://stackoverflow.com/users/668455/tristan hat mehrmals um Erklärung gebeten, also hoffe ich, dass ich die Situation mit dem nächsten Experiment klären werde:

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.

Möglicherweise tritt ein anderes Problem auf - Es bleibt bei ".android / repositories.cfg konnte nicht geladen werden" hängen.

Andere Probleme & Fakten:

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

Zusammenfassend lässt sich folgendes Rezept für die Entwicklung mit Qt zusammenstellen:

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

Diese Seite aus der Unity 2018-Dokumentation enthält auch eine gute Erklärung zur Behebung dieses Problems, einschließlich folgender Punkte:

  1. Installieren des Android SDK ohne Android Studio.
  2. Problemumgehung für "Warnung: Einstellungen konnten nicht erstellt werden" und "java.lang.IllegalArgumentException"
  3. Der Trick für Android Studio Version 3.6 oder neuer.
  4. Warnung vor Java 9 oder höher, ein JDK muss Version 8 sein.

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

Andrei Hryshanovich
quelle
0

Dies ist mir beim Herunterladen der eigenständigen Befehlszeilentools ( commandlinetools-mac-6200805_latest) auf einen neuen Mac passiert .

Aufgrund all der Antworten hier konnte ich dafür sorgen, dass es so funktioniert

# 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

In den Dokumenten für die --sdk_rootOption heißt es "Verwenden Sie das angegebene SDK-Stammverzeichnis anstelle des SDK, das dieses Tool enthält ". Dies ließ mich denken, dass das Tool, obwohl es eigenständig ausgeliefert wird, voraussichtlich Teil eines Bundles sein wird, in dem auch das SDK installiert ist.

Mokagio
quelle
0

Die erste Voraussetzung für die Installation von SDK (Beliebige Methode) ist die Installation von Java und das Festlegen des JAVA_HOME- Pfads.

Dann benötigen SDK-Befehlszeilentools einen Installationspfad, ohne den NullPointerException ausgelöst wird.
Um dies zu überwinden, übergeben Sie einfach den Pfad, in dem Sie das SDK installieren möchten, mit dem Argument "--sdk_root"
. sdkmanager.bat "Plattform-Tools" "Plattformen; android-" --sdk_root =

Ecos
quelle