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

Warning: Could not create settings
java.lang.IllegalArgumentException
    at com.android.sdklib.tool.sdkmanager.SdkManagerCliSettings.(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

Ответы (22)

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

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

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

Ну вот и все, что надо поменять. Позвольте мне объяснить подробнее.

  • Король - sdkmanager живет внутри cmdline-tools / tools / bin, лучше установить в PATH переменная окружения
  • cmdline-tools не следует устанавливать как ANDROID_SDK_ROOT. Поскольку позже, при обновлении Android SDK или установке дополнительных пакетов, другие пакеты будут помещены в ANDROID_SDK_ROOT, но не в cmdline-tools.
  • Окончательная, полная ANDROID_SDK_ROOT структура каталогов должна выглядеть, как показано ниже, состоять из нескольких подкаталогов: build-tools, cmdline-tools,эмулятор, лицензии, патчер, инструменты платформы, платформы, системные образы. Вы можете легко указать, что build-tools и cmdline-tools являются братьями и сестрами, все они находятся внутри родительского ANDROID_SDK_ROOT.

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

  • Установите предпочитаемый ANDROID_SDK_ROOT (как и раньше)
  • Загрузите и распакуйте zip-файл commandlinetools в каталог с именем cmdline-tools, который находится внутри ANDROID_SDK_ROOT
  • Добавить каталог $ ANDROID_SDK_ROOT / cmdline-tools / tools / bin в переменную среды PATH, чтобы система знала, где найти sdkmanager

!! ОБНОВЛЕНИЕ !!

Поведение снова изменилось после сборки 6858069 (Инструменты командной строки Android SDK 3.0):

  • После распаковки пакета вы получите самый верхний каталог cmdline-tools.
  • Переименуйте распакованный каталог из cmdline-tools в toolsи поместите его в $ ANDROID_SDK_ROOT / cmdline-tools, так что теперь он должен выглядеть так:$ ANDROID_SDK_ROOT / cmdline-tools / tools. А внутри у вас должно быть: NOTICE.txt bin lib source.properties. Фактически, согласно официальному документу инструментов командной строки, древовидная структура должна быть android_sdk / cmdline-tools / version / bin /, но я проверил, используя версию или инструменты здесь не имеет значения.
  • Для вашей переменной среды PATHя бы порекомендовал вам установить следующее: PATH = $ PATH: $ ANDROID_SDK_ROOT / cmdline-tools / latest / bin: $ ANDROID_SDK_ROOT / cmdline-tools / tools / bin, потому что после обновления позже вы получите последнюю sdkmanager, размещенную в $ ANDROID_SDK_ROOT / cmdline-tools / latest / bin, поместив его впереди, вы получите это более высокий приоритет.

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

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

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

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

     sudo apt установить 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#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

     нано. Профиль
    
  6. Создать переменную ANDROID_SDK_ROOT

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

     экспорт ПУТЬ = $ ANDROID_SDK_ROOT / cmdline-tools / tools / bin: $ PATH
    
  8. Сохранить и выйти

  9. Обновить свой профиль

    . ~ / .profile
    
  10. Выполнить

    sdkmanager --version
    

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

Android SDK Tools теперь находится в следующем месте: "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 Platform Tools в android_sdk / platform-tools / и добавьте соответствующие PATH в ПЕРЕМЕННЫЕ ОКРУЖАЮЩЕЙ СРЕДЫпод Системные переменные

Summarizing several useful posts here, and for people wanting a quick snippet, for example to plug in a Dockerfile, the following script is working for me:

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 суффиксы. Затем эти каталоги игнорируются, и печатаются предупреждения вроде Наблюдаемый идентификатор пакета 'emulator' в несогласованном месте, поэтому такое поведение определенно нежелательно. Если у вас есть исправление для этого, напишите об этом в комментариях или, если вы достаточно уверены, просто отредактируйте скрипт с точным исправлением.

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

enter image description here

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

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

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

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

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

Смешивание ответов от Jing Li и 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
[...]

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

  1. установить студию Android, как описано на их веб-сайте https://developer.android.com/studio/install
  2. запустить: конфигурация флаттера --android-studio-dir <расположение студии android> затем конфигурация флаттера --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

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

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

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

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

изображение: openjdk: 8-jdk

переменные:
  ANDROID_COMPILE_SDK: «30»
  ANDROID_BUILD_TOOLS: «29.0.2»
  ANDROID_COMMAND_LINE_TOOLS: «6858069»
  GRADLE_OPTS: "-Dorg.gradle.daemon = false"

before_script:
  - экспорт GRADLE_USER_HOME = $ (pwd) /. gradle
  - chmod + x ./gradlew
  - apt-get --quiet update --yes
  - apt-get --quiet install --yes wget tar распаковать lib32stdc ++ 6 lib32z1
  - mkdir -p android-sdk-linux / cmdline-tools
  - экспорт 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
  - разархивировать android-sdk.zip
  - rm android-sdk.zip
  - версия mv cmdline-tools
  - эхо у | версия / bin / sdkmanager "платформы; android - $ {ANDROID_COMPILE_SDK}"> / dev / null
  - эхо у | версия / bin / sdkmanager "инструменты платформы"> / dev / null
  - эхо у | версия / bin / sdkmanager "инструменты сборки; $ {ANDROID_BUILD_TOOLS}"> / dev / null
  - экспорт PATH = $ PATH: $ ANDROID_SDK_ROOT / platform-tools /
  # временно отключите проверку на наличие ошибок EPIPE и используйте yes, чтобы принять все лицензии
  - установить + o pipefail
  - да | версия / bin / sdkmanager --licenses
  - установить -o pipefail
  - компакт диск ../../
  - chmod + x ./gradlew

кеш:
  ключ: $ {CI_PROJECT_ID}
  пути:
    - .gradle /

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

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

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

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

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

У меня такая же ошибка. После выполнения всех решений я не смог это исправить. Я решил эту проблему, прочитав: 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% CMGS_LINE_AR
    
    От

    до

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

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

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

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

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

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

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:$ANDROID_HOME/tools:$ANDROID_HOME/tools/lib:$ANDROID_HOME/tools/bin:$ANDROID_HOME/platform-tools"

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

  1. Загрузите последние инструменты командной строки с Android, например commandlinetools-win-6200805_latest.zip
  2. Распаковать скачанный файл
  3. Создайте каталог для хранения инструментов командной строки где-нибудь на вашем диске, со следующим путем: android / cmdline-tools / latest Обычно, когда вы распаковываете эту командную строку tools, просто переименуйте toolsкаталог в latest и убедитесь, что вы поместили эту latest папку в android / cmdline-tools каталог где-нибудь на вашем диске
  4. Создать ANDROID_HOME переменную среды для каталога, в котором хранится расположение каталога инструментов cmdline, например: C: \ YourLocationWhereYouStoreTheDirectory \ android \ cmdline-tools \ latest
  5. Создать новую запись в переменной среды Path как % ANDROID_HOME% \ bin

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

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

2022 WebDevInsider