Инструменты командной строки Android sdkmanager всегда показывает: Предупреждение: не удалось создать настройки

65

Я использую новые инструменты командной строки Android, потому что старое хранилище sdk-tools для Android больше не доступно. Поэтому я изменил свой gitlab-ci для загрузки командных инструментов. Но когда я пытаюсь запустить его, я получаю следующую ошибку:

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)

Я уже пытался выполнить эти команды вручную, но я получаю ту же ошибку. Также, если я бегу sdkmanager --version, возникает та же ошибка. Мой gitlab-ci выглядит так:

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
источник

Ответы:

80

Это похоже на ошибку в том, как sdkmanager находит папку установки SDK.

Обходной путь - установить флаг --sdk_root. Вы можете переместить объявление ANDROID_HOME выше, а затем использовать его с последующими командами.

 - 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

Кроме того, в первую команду перенесена команда принятия полной лицензии для очистки echo yдеталей.

Как ни странно, если вы запустите sdkmanager --sdk_root=${ANDROID_HOME} "tools"его, он обновит инструменты с 3.6.0 до 26.1.1, и sdkmanager больше не будет иметь этой проблемы. Это обновление требует времени и пропускной способности и не является обязательным для обходного пути.

caller9
источник
1
сработало нормально, теперь я получаю сообщение об ошибке ./gradlew assemblyDebug, но, похоже, это больше не имеет ничего общего с sdkmanager. Спасибо!
Kaulex
1
Можете ли вы дать мне пример, как я могу убрать свое эхо? Я не понимаю
Kaulex
1
Я обновил фрагмент в своем исходном ответе, чтобы уточнить удаление echo yкоманд.
caller9
1
Спасибо! Много помогает!
Kaulex
2
линия экспорта, а затем sdkmanager --sdk_root=${ANDROID_HOME} "tools"немного сделал это для меня - спасибо!
gattsbr
23

Для тех, кто боролся с установкой инструментов командной строки Android для Appium в Windows 10 / x64, просто сделайте следующее:

  1. Загрузите последние инструменты командной строки с Android, то есть commandlinetools-win-6200805_latest.zip
  2. Распакуйте загруженный файл
  3. Создайте каталог для хранения инструментов командной строки где-нибудь на вашем диске, включив следующий путь: android / cmdline-tools / latest В основном, когда вы распаковываете эту строку инструментов Cmd, просто переименуйте каталог инструментов в последний и убедитесь, что вы поместили эту последнюю папку в android / cmdline -tools каталог где-то на вашем диске
  4. Создайте переменную среды ANDROID_HOME для каталога, в котором хранится расположение каталога инструментов cmdline, например: C: \ YourLocationWhereYouStoreTheDirectory \ android \ cmdline-tools \ latest
  5. Создать новую запись в переменной среды Path как % ANDROID_HOME% \ bin
Артурс
источник
2
Откуда возникает необходимость в этом "android / cmdline-tools / latest"? исходный код ? какой-то документ где-то?
Тристан
1
Причина описана в этой теме: stackoverflow.com/questions/60460429/…
ArturS
В теме, на которую вы ссылаетесь, ответ гласит: "export ANDROID_HOME =" / Users / darish / development / sdk / android "" no "latest", no "cmdline-tools"
Tristan
1
@Tristan cmdline-toolsявляется обязательным, но latestне обязательно. И путь (или имя) cmdline-toolsпроисходит от самого Android SDK. Вы можете запустить эту команду sdkmanager --sdk_root=${ANDROID_HOME} --list, где результаты включают «cmdline-tools; 1.0 | 1.0 | Инструменты Android SDK для командной строки»
Цзин Ли
Я не знаю, какая логика стоит за этим. Но это работает :-)
Soorya
20

Вместо того, чтобы передавать аргумент --sdk_rootдля каждого отдельного выполнения команды, давайте углубимся в реальную причину.

Начиная с Android SDK Инструменты командной строки 1.0.0 (6200805) , в отличие от Android SDK 26.1.1 (4333796) , toolsиерархия каталогов была изменена. Ранее он был помещен прямо внутрь ANDROID_HOME, теперь он все еще называется как tools(единственное, что вы получите после распаковки загруженного zip-файла commandlinetools ), но иначе вы должны поместить его в каталог, который cmdline-toolsвызывается самостоятельно. Название cmdline-toolsпроисходит от имени пакета, которое можно получить из команды перечисления пакетов sdkmanager --list, выходные данные которой включают cmdline-tools;1.0 | 1.0 | Android SDK Command-line Tools.

Обтекание toolsкаталога внутри cmdline-toolsкаталога сделает его работоспособным и поможет вам избавиться от раздражающего --sdk_rootаргумента. Но как насчет других частей?

Ну, это все, что вам нужно изменить. Позвольте мне объяснить больше.

  • Король - sdkmanagerживет внутри cmdline-tools/tools/bin, тебе лучше установить PATHпеременную среды
  • cmdline-toolsне должен быть установлен как ANDROID_HOME. Потому что позже, при обновлении Android SDK или установке дополнительных пакетов, другие пакеты будут помещены в ANDROID_HOME, но не в cmdline-tools.
  • Окончательный, полная ANDROID_HOMEструктура каталогов должна выглядеть , как показано ниже, включают в себя довольно много подкаталогов: build-tools, cmdline-tools, emulator, licenses, patcher, platform-tools, platforms, system-images. Вы можете легко указать, что build-toolsи cmdline-toolsбратья и сестры, все сидят внутри родителя ANDROID_HOME.

Позвольте мне кратко повторить:

  • Установите предпочтительный ANDROID_HOME(как и раньше)
  • Загрузите и распакуйте zip-файл commandlinetools в каталог cmdline-tools, который находится внутриANDROID_HOME
  • Добавьте каталог $ANDROID_HOME/cmdline-tools/tools/binв переменную окружения PATH, чтобы система знала, где найтиsdkmanager
Цзин Ли
источник
Это правильный ответ. В отличие от других ответов, здесь хранится каталог «tools», который на самом деле находится в zip-файле.
SystemParadox
Большое спасибо, вы ответили на мой вопрос :)
R-obert
отличный ответ, который "на самом деле" решает проблему!
Могамнаг
19

Для загрузки новых cmdline-tools с веб-сайта Android Developer требуется следующая структура каталогов.

ImperadorSid
источник
2
Почему это требуется? откуда это взялось? исходный код ? док?
Тристан
1
Я настроил свой CI для использования этой структуры, и хотя он позволяет мне запускать sdkmanager, когда мой проект создается с использованием gradle, он не знает, как правильно найти платформы и лицензии, и все терпит неудачу.
Мэтт Вулф
5

Получил такую ​​же проблему, пришел сюда от Google. Согласно архиву AndroidStudio , сегодня вышел релиз 4.1. Я полагаю, это не случайно.

Это совершенно не связанное руководство содержит жесткую ссылку на более старую версию sdk-tools для linux . Вы можете изменить URL-адрес Windows или Mac для других ОС. Я буду использовать это как исправление на данный момент.

(это должен был быть комментарий, а не решение)

jnnks
источник
Ссылки не работают, я уже пытался использовать старую версию, но я использую новые функции в своей базе кода, поэтому я больше не могу использовать старую. Так что это решение не работает для меня.
Kaulex
5

Sdkmanager пытается определить путь android-sdk в зависимости от того, где он распакован, без использования переменных среды, таких как ANDROID_SDK_ROOT. Но это еще хуже, потому что у него есть жестко закодированная родительская папка с именем cmdline-tools, и если вы разархивируете commandlinetools внутри папки с другим именем, это не сработает, вынуждая нас использовать параметр sdk_root для правильной подачи внутренней переменной.

Таким образом, имея в виду, мы можем использовать следующий подход для решения этой проблемы.

Я предполагаю, что мы используем ОС Ubuntu, поэтому, если вы этого не сделаете, вам следует адаптировать некоторые из этих инструкций.

  1. Установите Android-SDK.

    sudo apt install android-sdk

    После установки у вас будет папка с именем android-sdk в / usr / lib

  2. Создайте папку с именем cdmline-tools внутри папки android-sdk

    sudo mkdir /usr/lib/android-sdk/cmdline-tools
  3. Загрузите zip-файл инструментов командной строки Android отсюда ( https://developer.android.com/studio?hl=ru-419#downloads )
  4. Распакуйте файл, который вы только что загрузили, в / usr / lib / android-sdk / cmdline-tools

    sudo unzip /path/for/commandlinetools-linux-6200805_latest.zip -d /usr/lib/android-sdk/cmdline-tools
  5. Перейти к вам домой, директор и отредактируйте ваш .profile

    nano .profile
  6. Создайте переменную ANDROID_SDK_ROOT

    export ANDROID_SDK_ROOT=/usr/lib/android-sdk
  7. Поместите папку sdkmanager в свой путь

    export PATH=$ANDROID_SDK_ROOT/cmdline-tools/tools/bin:$PATH
  8. Сохранить и выйти
  9. Перезагрузить ваш профиль

    . ~/.profile
  10. Запустить

    sdkmanager --version

Вы должны увидеть версию, напечатанную в вашем терминале.

awquadros
источник
1
Оно работало завораживающе! Еще раз спасибо за это полное решение
Вивиан
4

Я нашел решение использовать новейшие инструменты командной строки, выполнив следующие действия:

1 - Извлечение инструментов командной строки в папку с такой структурой: например: $HOME/Development/android/cmdline-tools/latest (эта папка должна содержать lib , bin , note.txt и source.properties )

2 - Определение ANDROID_HOME в качестве переменной среды:

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

3 - Загрузка в PATH :

PATH="$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/tools/lib:$ANDROID_HOME/tools/bin:$ANDROID_HOME/platform-tools"
Кайо Сезар Керих
источник
Противоречивая информация: "последняя (эта папка должна содержать lib, bin, ...)", ANDROID_HOME = "... / последняя" PATH = "... $ ANDROID_HOME / tools / lib
Тристан
lib есть в инструментах или в ANDROID_HOME?
Тристан
Это должен быть принятый ответ
Шивам Джа
cmdline-toolsявляется обязательным, но latestне обязательным.
Цзин Ли
3

Я хотел бы поделиться своим опытом.

Сначала я пытаюсь объяснить, почему структура каталогов должна выглядеть так, как показано в этом ответе - https://stackoverflow.com/a/60460681/1758733 . https://stackoverflow.com/users/668455/tristan несколько раз спрашивал объяснения, поэтому надеюсь, что я проясню ситуацию следующим экспериментом:

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.

Может возникнуть другая проблема - застрял в «.android / repositories.cfg не может быть загружен».

Другие вопросы и факты:

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

Подводя итог, можно написать следующий рецепт разработки с использованием 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
источник
0

На этой странице документации Unity 2018 также есть хорошее объяснение решения этой проблемы, включая такие моменты, как:

  1. Установка Android SDK без Android Studio.
  2. Обходной путь для «Предупреждение: не удалось создать настройки» и «java.lang.IllegalArgumentException»
  3. Трюк для Android Studio версии 3.6 или новее.
  4. Предупреждение о Java 9 или более поздней версии, JDK должен быть версии 8.

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

Андрей Гришанович
источник
0

Это случилось со мной при загрузке автономных инструментов командной строки ( commandlinetools-mac-6200805_latest) на новом Mac.

Основываясь на всех ответах здесь, я смог заставить это работать так

# 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

Документы для --sdk_rootопции говорят "Использовать указанный корень SDK вместо SDK, содержащего этот инструмент ». Это заставило меня задуматься о том, что, несмотря на то, что инструмент поставляется автономно, он должен быть частью пакета, в котором также установлен SDK.

mokagio
источник
0

Первым требованием установки SDK (Любой метод) является установка Java и установка пути JAVA_HOME .

Затем инструментам командной строки SDK требуется путь установки, без которого он генерирует исключение NullPointerException.
Чтобы преодолеть это, просто укажите путь, по которому вы хотите установить SDK с аргументом "--sdk_root".
Например. sdkmanager.bat "платформы-инструменты" "платформы; android-" --sdk_root =

Экос
источник