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

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

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

25 ответов

Решение

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

Начиная с Android SDK Command-line Tools 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

Похоже, это ошибка способа, которым 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 больше не имеет этой проблемы. Это обновление требует времени и пропускной способности и не обязательно с временным решением.

Для тех, кто боролся с установкой Android Command Line Tools для 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

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=en-419)
  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
    

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

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

Простое решение:

  1. Откройте меню инструментов Android Studio,
  2. SDK Manager В появившемся окне есть внутренние панели,
  3. Выберите панель инструментов SDK. Установите флажок Инструменты командной строки Android SDK.
  4. Нажмите кнопку Применить в нижней части окна.

Смешивая ответы Цзин Ли и caller9, это мой сценарий:

variables:
  ANDROID_COMPILE_SDK: "29"
  ANDROID_BUILD_TOOLS: "29.0.3"
  ANDROID_SDK_TOOLS: "6200805"

before_script:
  - apt-get update --yes
  - apt-get install --yes wget tar unzip lib32stdc++6 lib32z1
  - export ANDROID_HOME=${PWD}android-home
  - install -d $ANDROID_HOME
  - wget --output-document=$ANDROID_HOME/cmdline-tools.zip https://dl.google.com/android/repository/commandlinetools-linux-${ANDROID_SDK_TOOLS}_latest.zip
  - pushd $ANDROID_HOME
  - unzip -d cmdline-tools cmdline-tools.zip
  - popd
  - export PATH=$PATH:${ANDROID_HOME}/cmdline-tools/tools/bin/
  - sdkmanager --version
  - set +o pipefail
  - yes | sdkmanager --sdk_root=${ANDROID_HOME} --licenses
  - set -o pipefail
  - sdkmanager --sdk_root=${ANDROID_HOME} "platforms;android-${ANDROID_COMPILE_SDK}"
  - sdkmanager --sdk_root=${ANDROID_HOME} "platform-tools"
  - sdkmanager --sdk_root=${ANDROID_HOME} "build-tools;${ANDROID_BUILD_TOOLS}"
  - export PATH=$PATH:${ANDROID_HOME}/platform-tools/
  - chmod +x ./gradlew
[...]

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

1 - Извлечение инструментов командной строки в папку с такой структурой: например: $HOME/Development/android/cmdline-tools/latest (эта папка должна содержать lib, bin, notice.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"

У меня такая же ошибка. После выполнения всех решений я не смог это исправить. Я решил эту проблему, прочитав:https://forum.unity.com/threads/android-build-not-working.844969/

Упростите ответ:

  1. Открытие sdkmanager.bat с помощью блокнота ++
  2. Изменение этой строки с

"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %SDKMANAGER_OPTS% -classpath "%CLASSPATH%" com.android.sdklib.tool.sdkmanager.SdkManagerCli %CMD_LINE_ARGS%

к "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %SDKMANAGER_OPTS% -classpath "%CLASSPATH%" com.android.sdklib.tool.sdkmanager.SdkManagerCli %CMD_LINE_ARGS% --sdk_root=%ANDROID_HOME%

(Примечание: добавление --sdk_root=%ANDROID_HOME% в конце

Обобщая несколько полезных сообщений здесь, и для людей, которым нужен быстрый фрагмент, например, для подключения Dockerfileу меня работает следующий скрипт:

      RUN mkdir -p /opt/android/cmdline-tools/latest \
    && cd /opt/android/cmdline-tools/latest \
    && wget https://dl.google.com/android/repository/commandlinetools-linux-6858069_latest.zip \
    && bsdtar --strip-components=1 -xvf commandlinetools-linux-6858069_latest.zip \
    && yes | bin/sdkmanager --licenses \
    && bin/sdkmanager "build-tools;29.0.2" "platforms;android-29" \
    && rm commandlinetools-linux-6858069_latest.zip

Это просто требует bsdtarдля установки (обычно в популярных дистрибутивах). Установлены инструменты для платформы / сборки Android версии 29, и корень Android sdk будет расположен в /opt/android. Хотя эта установка работает для меня без предупреждений как таковая, у меня есть проблема при переустановке уже установленных пакетов или, возможно, при установке другой версии пакетов: она конфликтует с уже имеющимися пакетами и создает фиктивные каталоги в корне sdk с -2, -3суффиксы. Затем эти каталоги игнорируются, а предупреждения вроде Observed package id 'emulator' in inconsistent locationпечатаются, поэтому такое поведение определенно нежелательно. Если у вас есть исправление для этого, напишите об этом в комментариях или, если вы достаточно уверены, просто отредактируйте скрипт с точным исправлением.

Просто решил эту проблему с помощью IDE, для меня это выглядит довольно просто. (На самом деле это дубликат предыдущего ответа, но с изображением). Просто установите инструменты sdk, и все должно работать.

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

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

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

Это случилось со мной при загрузке автономных инструментов командной строки (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.

Хочу поделиться своим опытом.

Сначала я пытаюсь объяснить, почему структура каталогов должна выглядеть так, как показано в этом ответе - /questions/54222563/instrumentyi-komandnoj-stroki-android-sdkmanager-vsegda-pokazyivaet-preduprezhde/54222581#54222581. 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://stackru.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

На основе обновленных предложений @Jing Li. Вот моя версия gitlab-ci.yml

      image: openjdk:8-jdk

variables:
  ANDROID_COMPILE_SDK: "30"
  ANDROID_BUILD_TOOLS: "29.0.2"
  ANDROID_COMMAND_LINE_TOOLS: "6858069"
  GRADLE_OPTS: "-Dorg.gradle.daemon=false"

before_script:
  - export GRADLE_USER_HOME=$(pwd)/.gradle
  - chmod +x ./gradlew
  - apt-get --quiet update --yes
  - apt-get --quiet install --yes wget tar unzip lib32stdc++6 lib32z1
  - mkdir -p android-sdk-linux/cmdline-tools
  - export ANDROID_SDK_ROOT=$PWD/android-sdk-linux
  - cd android-sdk-linux/cmdline-tools
  - wget --quiet --output-document=android-sdk.zip https://dl.google.com/android/repository/commandlinetools-linux-${ANDROID_COMMAND_LINE_TOOLS}_latest.zip
  - unzip android-sdk.zip
  - rm android-sdk.zip
  - mv cmdline-tools version
  - echo y | version/bin/sdkmanager "platforms;android-${ANDROID_COMPILE_SDK}" >/dev/null
  - echo y | version/bin/sdkmanager "platform-tools" >/dev/null
  - echo y | version/bin/sdkmanager "build-tools;${ANDROID_BUILD_TOOLS}" >/dev/null
  - export PATH=$PATH:$ANDROID_SDK_ROOT/platform-tools/
  # temporarily disable checking for EPIPE error and use yes to accept all licenses
  - set +o pipefail
  - yes | version/bin/sdkmanager --licenses
  - set -o pipefail
  - cd ../../
  - chmod +x ./gradlew

cache:
  key: ${CI_PROJECT_ID}
  paths:
    - .gradle/

Инструменты Android SDK теперь находятся в следующем месте: " android_sdk / cmdline-tools / version / bin /";

Поэтому, чтобы решить эту проблему в Windows (то же самое можно воспроизвести в другой ОС), выполните следующие действия:

  1. Внутри вашего android_sdk папку, создайте папку: cmdline-tools и внутри него создайте еще одну папку: version извлеките / поместите все ваши файлы "/bin /lib NOTICE и sources.properties" внутрь этого version папка.

  2. Установлен ANDROID_HOME на ваш android_sdk папка.

  3. Добавьте в свой системный путь: android_sdk\cmdlineAndroidSDK\cmdline-tools\version\bin\

Точно так же поместите инструменты платформы Android SDK в свойandroid_sdk/platform-tools/ и добавить соответствующие PATH к ENVIRONMENTAL VARIABLES под System Variables

На этой странице документации 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

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

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

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

Начиная с новых обновлений, есть некоторые изменения, которые не упомянуты в документации. После распаковки пакета инструментов командной строки самый верхний каталог, который вы получите, — это cmdline-tools. Переименуйте распакованный каталог из cmdline-tools в tools и поместите его в папку $C:/Android/cmdline-tools.

теперь это будет выглядеть как $C:/Android/cmdline-tools/tools

и он будет работать идеально.

Рабочее решение для Ubuntu с использованием Android Studio Вот рабочая процедура для Ubuntu и Debian, таких как linux:

  1. установите Android studio, как описано на их веб-сайте https://developer.android.com/studio/install
  2. запустить : flutter config --android-studio-dir <location of android studio> потом flutter config --android-sdk /home/user/Android/Sdk (это расположение SDK по умолчанию)
  3. добавьте корзину в свой PATH PATH=$PATH:/home/user/Android/Sdk/tools/bin/
  4. После этого запустите: flutter doctor --android-licenses и принять все лицензии. Чтобы проверить, все ли в порядке, запустите Doctor в режиме verbos, как показано ниже: flutter doctor -v

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

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

по состоянию на 7 марта 2023 года менеджер SDK заявляет: переместите исходное содержимое каталога cmdline-tools, включая каталог lib, каталог bin, файл NOTICE.txt и файл source.properties, во вновь созданный последний каталог. Теперь вы можете использовать инструменты командной строки из этого места.

Вот очень простое и простое решение, просто измените структуру папок, измените имя основной папки на последнее, затем создайте папку с именем cmdline-tools, создайте новую папку внутри cmdline с именем tools и поместите bin и другие данные в папку инструментов, чтобы она выглядела как этот пользователь\ последние\cmdline-tools\tools

Я много искал, но это сработало для меня

Если вы используете Linux и в то же время не хотите возиться со сложными обходными путями, я рекомендую вам загрузить и использовать версию sdkmanager для Snap.

Не забудьте использовать androidsdk вместо того sdkmanager в терминале.

Android Studio необходима при установке инструментов командной строки, даже если это не тот редактор, который вы используете для разработки приложений. Снимите флажок с вкладки устаревших пакетов и загрузите инструменты; это должно устранить проблему с лицензией, и вы сможете вернуться к своей любимой среде IDE (например, VS Code).

Другие вопросы по тегам