Narzędzia wiersza poleceń systemu Android sdkmanager zawsze pokazuje: Ostrzeżenie: Nie można utworzyć ustawień

64

Korzystam z nowych narzędzi Android wiersza poleceń, ponieważ stare repozytorium sdk-tools Androida nie jest już dostępne. Więc zmieniłem moją gitlab-ci, aby załadować narzędzia CommandLintools. Ale kiedy próbuję go uruchomić, pojawia się następujący błąd:

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)

Próbowałem już wykonać te polecenia ręcznie, ale pojawia się ten sam błąd. Również jeśli uruchomię sdkmanager --version, wystąpi ten sam błąd. Mój gitlab-ci wygląda następująco:

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
źródło

Odpowiedzi:

79

To wydaje się być błędem w sposobie, w jaki sdkmanager lokalizuje folder instalacyjny SDK.

Obejściem problemu jest ustawienie flagi --sdk_root. Możesz przenieść deklarację ANDROID_HOME wyżej, a następnie użyć jej z kolejnymi poleceniami.

 - 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

Przeniesiono także polecenie akceptacji licencji zbiorczej na pierwsze polecenie czyszczenia echo yczęści.

Dziwne, że jeśli uruchomisz sdkmanager --sdk_root=${ANDROID_HOME} "tools", zaktualizuje narzędzia z 3.6.0 do 26.1.1 i sdkmanager nie będzie już miał tego problemu. Ta aktualizacja wymaga czasu i przepustowości i nie jest dokładnie konieczna w przypadku obejścia problemu.

osoba dzwoniąca 9
źródło
1
działało dobrze, teraz pojawia się błąd z ./gradlew assembleDebug, ale wygląda na to, że nie ma to już nic wspólnego z sdkmanager. Dziękuję Ci!
kaulex
1
Czy możesz mi podać przykład, jak mogę wyczyścić moje echo? Nie rozumiem
kaulex
1
Zaktualizowałem fragment kodu w mojej oryginalnej odpowiedzi, aby wyjaśnić usuwanie echo ypoleceń.
dzwoniący9
1
Dziękuję Ci! Bardzo pomaga!
kaulex
2
linia eksportu, a potem sdkmanager --sdk_root=${ANDROID_HOME} "tools"kawałek mi to zrobił - dzięki!
gattsbr
23

Dla tych, którzy mieli problemy z instalacją narzędzi wiersza poleceń Androida dla Appium w systemie Windows 10 / x64, wykonaj następujące czynności:

  1. Pobierz najnowsze narzędzia wiersza poleceń z Androida, tj. Commandlinetools-win-6200805_latest.zip
  2. Rozpakuj pobrany plik
  3. Utwórz katalog do przechowywania narzędzi wiersza poleceń gdzieś na dysku, z następującą ścieżką: android / cmdline-tools / latest Zasadniczo po rozpakowaniu tego narzędzia wiersza poleceń cmdline , po prostu zmień nazwę katalogu narzędzi na najnowszy i upewnij się, że umieściłeś ten najnowszy folder w systemie Android / cmdline -tools katalog gdzieś na dysku
  4. Utwórz zmienną środowiskową ANDROID_HOME dla katalogu, w którym znajduje się lokalizacja katalogu narzędzi cmdline, takich jak: C: \ YourLocationWhereYouStoreTheDirectory \ android \ cmdline-tools \ latest
  5. Utwórz nowy wpis w zmiennej środowiskowej Path jako % ANDROID_HOME% \ bin
ArturS
źródło
2
Skąd bierze się potrzeba tego „Androida / cmdline-tools / najnowsze”? kod źródłowy ? jakiś doktor gdzieś?
Tristan
1
Przyczynę opisano w tym temacie: stackoverflow.com/questions/60460429/…
ArturS
W temacie, do którego się odwołujesz, odpowiedź brzmi: „eksport ANDROID_HOME =” / Users / darish / development / sdk / android ”„ brak ”najnowszego”, brak „cmdline-tools”
Tristan
1
@Tristan cmdline-toolsjest koniecznością, jednak latestnie jest wymagany. A ścieżka (lub nazwa) cmdline-toolspochodzi z samego zestawu SDK systemu Android. Możesz uruchomić to poleceniesdkmanager --sdk_root=${ANDROID_HOME} --list , w którym wyniki zawierają „cmdline-tools; 1.0 | 1.0 | Android SDK Narzędzia wiersza polecenia”
Jing Li
Nie wiem, jaka to logika. Ale to działa :-)
Soorya
19

Pobieranie nowych narzędzi cmdline ze strony Android Developer wymaga przestrzegania następującej struktury katalogów.

ImperadorSid
źródło
2
Dlaczego jest to wymagane? Skąd to pochodzi ? kod źródłowy ? doc?
Tristan
1
Konfiguruję CI do korzystania z tej struktury i chociaż pozwala mi to uruchomić sdkmanager, kiedy mój projekt jest budowany z gradem, nie wie jak poprawnie zlokalizować platformy i licencje i wszystko się nie udaje.
Matt Wolfe
16

Zamiast przekazać argument --sdk_root dla każdego wykonania pojedynczego polecenia, zagłębmy się w prawdziwą przyczynę.

Wychodząc z Android SDK wiersza polecenia Tools 1.0.0 (6200805) , w przeciwieństwie do Android SDK 26.1.1 (4333796) The toolshierarchia katalogu została zmieniona. Wcześniej był umieszczony bezpośrednio w środku ANDROID_HOME, teraz jest nadal nazywany tools(jedyną rzeczą, którą dostaniesz po rozpakowaniu pobranego pliku zip z narzędziami Commandlinetools ), ale inaczej musisz umieścić go w katalogu nazywanym cmdline-toolswłasnym. Nazwa cmdline-toolspochodzi od nazwy pakietu, z której można uzyskać polecenie wyświetlania list pakietów sdkmanager --list, których wyniki obejmują cmdline-tools;1.0 | 1.0 | Android SDK Command-line Tools.

Zawijanie toolskatalogu do cmdline-toolskatalogu sprawi, że będzie działać i pomoże pozbyć się irytującego --sdk_rootargumentu. Ale co z pozostałymi częściami?

To wszystko, co musisz zmienić. Pozwól mi wyjaśnić więcej.

  • Król - sdkmanagermieszka w środku cmdline-tools/tools/bin, lepiej ustaw PATHzmienną środowiskową
  • cmdline-toolsnie powinno być ustawione jako ANDROID_HOME. Ponieważ później, podczas aktualizacji zestawu SDK systemu Android lub instalowania większej liczby pakietów, pozostałe pakiety zostaną umieszczone pod ANDROID_HOME, ale nie pod cmdline-tools.
  • Ostateczna, pełna ANDROID_HOMEstruktura katalogów powinna wyglądać jak poniżej, składa się z dość kilka podkatalogów: build-tools, cmdline-tools, emulator, licenses, patcher, platform-tools, platforms, system-images. Możesz łatwo to zauważyć build-toolsi cmdline-toolssą rodzeństwem, wszyscy siedzą wewnątrz rodzica ANDROID_HOME.

Pozwól mi podsumować w prosty sposób:

  • Ustaw preferowane ANDROID_HOME(tak jak poprzednio)
  • Pobierz i rozpakuj plik zip polecenia Commandlinetools do katalogu o nazwiecmdline-tools , który jest w środkuANDROID_HOME
  • Dołącz katalog $ANDROID_HOME/cmdline-tools/tools/bindo zmiennej środowiskowej PATH, aby system wiedział, gdzie znaleźćsdkmanager
Jing Li
źródło
To jest poprawna odpowiedź. W przeciwieństwie do innych odpowiedzi, utrzymuje to katalog „tools”, który tak naprawdę znajduje się w pliku zip.
SystemParadox
Dziękuję bardzo, odpowiedziałeś na moje pytanie :)
R-obert
5

Mam ten sam problem, przyszedł tu przez Google. Według archiwum AndroidStudio , dziś była wersja 4.1. Przypuszczam, że to nie przypadek.

Ten całkowicie niepowiązany przewodnik zawiera łącze do starszej wersji narzędzi SDK dla systemu Linux . Możesz zmienić adres URL na Windows lub Mac dla innych systemów operacyjnych. Na razie użyję tego jako poprawki.

(to miał być komentarz, a nie rozwiązanie)

jnnks
źródło
Linki nie działają, próbowałem już użyć starej wersji, ale używam nowych funkcji w mojej bazie kodu, więc nie mogę już używać starej. Więc to rozwiązanie nie działa dla mnie.
kaulex
5

Program sdkmanager próbuje obliczyć ścieżkę Android-SDK na podstawie miejsca, w którym jest rozpakowany, bez użycia zmiennych środowiskowych, takich jak ANDROID_SDK_ROOT. Ale jest gorzej, ponieważ ma zakodowany folder nadrzędny o nazwie cmdline-tools, a jeśli rozpakujesz polecenia z linii poleceń w folderze o innej nazwie, to nie działa, zmuszając nas do użycia parametru sdk_root do prawidłowego podania zmiennej wewnętrznej.

Mając to na uwadze, możemy zastosować następujące podejście do rozwiązania tego problemu.

Zakładam, że używamy Ubuntu OS, więc jeśli nie, powinieneś dostosować niektóre z tych instrukcji.

  1. Zainstaluj zestaw Android-SDK.

    sudo apt install android-sdk

    Po instalacji będziesz mieć folder o nazwie android-sdk w / usr / lib

  2. Utwórz folder o nazwie cdmline-tools w folderze android-sdk

    sudo mkdir /usr/lib/android-sdk/cmdline-tools
  3. Pobierz zip narzędzia wiersza poleceń Androida tutaj ( https://developer.android.com/studio?hl=pl-419#downloads )
  4. Rozpakuj właśnie pobrany plik w / usr / lib / android-sdk / cmdline-tools

    sudo unzip /path/for/commandlinetools-linux-6200805_latest.zip -d /usr/lib/android-sdk/cmdline-tools
  5. Idź do domu do domu i zmień .profile

    nano .profile
  6. Utwórz zmienną ANDROID_SDK_ROOT

    export ANDROID_SDK_ROOT=/usr/lib/android-sdk
  7. Umieść folder sdkmanager na swojej ścieżce

    export PATH=$ANDROID_SDK_ROOT/cmdline-tools/tools/bin:$PATH
  8. Zapisz i wyjdź
  9. Załaduj ponownie swój profil

    . ~/.profile
  10. Biegać

    sdkmanager --version

Wersja powinna zostać wydrukowana w twoim terminalu.

awquadros
źródło
1
działało jak urok! jeszcze raz dziękuję za to kompletne rozwiązanie
Vivian
4

Znalazłem rozwiązanie do korzystania z najnowszych narzędzi wiersza polecenia, wykonując następujące kroki:

1 - Wyodrębnianie narzędzi wiersza polecenia do folderu o tej strukturze: np .: $HOME/Development/android/cmdline-tools/latest (ten folder musi zawierać lib , bin , notice.txt i source.properties )

2 - Zdefiniowanie ANDROID_HOME jako zmiennej środowiskowej:

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

3 - Ładowanie go na PATH :

PATH="$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/tools/lib:$ANDROID_HOME/tools/bin:$ANDROID_HOME/platform-tools"
Kaio Cesar Koerich
źródło
Sprzeczne informacje: „najnowsze (ten folder musi zawierać lib, bin, ...)”, ANDROID_HOME = "... / latest" PATH = "... $ ANDROID_HOME / tools / lib
Tristan
lib jest w narzędziach lub w ANDROID_HOME?
Tristan
To powinna być zaakceptowana odpowiedź
Shivam Jha
cmdline-toolsjest koniecznością, jednak latestnie jest wymagana.
Jing Li
3

Chciałbym podzielić się swoim doświadczeniem.

Najpierw próbuję wyjaśnić, dlaczego struktura katalogów musi wyglądać tak, jak pokazano w tej odpowiedzi - https://stackoverflow.com/a/60460681/1758733 . https://stackoverflow.com/users/668455/tristan kilkakrotnie poprosił o wyjaśnienia, więc mam nadzieję, że wyjaśnię sytuację w następnym eksperymencie:

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.

Można napotkać inny problem - nie można załadować pliku „.roidroid / repositories.cfg”.

Inne problemy i fakty:

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

Podsumowując, można skomponować następujący przepis na rozwój z Qt:

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
źródło
0

Ta strona z dokumentacji Unity 2018 zawiera również dobre wyjaśnienie rozwiązania tego problemu, w tym takie punkty, jak:

  1. Instalowanie zestawu SDK systemu Android bez Android Studio.
  2. Obejście problemu „Ostrzeżenie: nie można utworzyć ustawień” i „java.lang.IllegalArgumentException”
  3. Sztuczka dla Androida Studio w wersji 3.6 lub nowszej.
  4. Ostrzeżenie o Javie 9 lub nowszej, JDK musi mieć wersję 8.

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

Andriej Hryszanowicz
źródło
0

Zdarzyło mi się to podczas pobierania samodzielnych narzędzi wiersza poleceń ( commandlinetools-mac-6200805_latest) na nowy komputer Mac.

Na podstawie wszystkich odpowiedzi tutaj udało mi się sprawić, aby działało w ten sposób

# 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

Dokumenty tej --sdk_rootopcji mówią „Użyj określonego katalogu głównego SDK zamiast SDK zawierającego to narzędzie ”. To sprawiło, że pomyślałem, że pomimo tego, że jest dostarczane jako samodzielne narzędzie, oczekuje się, że będzie ono częścią pakietu, w którym SDK jest również zainstalowany.

mokagio
źródło
0

Pierwszym wymaganiem instalacji zestawu SDK (dowolna metoda) jest instalacja Java i ustawienie ścieżki JAVA_HOME .

Następnie narzędzia wiersza polecenia SDK potrzebują ścieżki instalacji, bez której zgłasza wyjątek NullPointerException.
Aby temu zaradzić, po prostu podaj ścieżkę, w której chcesz zainstalować SDK z argumentem „--sdk_root”,
np. sdkmanager.bat "platform-tools" "platform; android-" --sdk_root =

Ecos
źródło