Інструменти командного рядка Android sdkmanager завжди показують: Попередження: Не вдалося створити налаштування


64

Я використовую нові інструменти командного рядка для Android, оскільки старе сховище sdk-інструментів для 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

Відповіді:


79

Здається, це помилка з тим, як 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 ця проблема більше не виникає. Це оновлення вимагає часу та пропускної спроможності, і це зовсім не потрібно для роботи.


1
добре працював, тепер я отримую помилку з ./gradlew assembleDebug, але, схоже, це більше не має нічого спільного з sdkmanager. Дякую!
kaulex

1
Чи можете ви, будь ласка, надати мені приклад, як я можу почистити своє відлуння? Я не розумію.
kaulex

1
Я оновив фрагмент у своїй оригінальній відповіді, щоб уточнити видалення echo yкоманд.
caller9

1
Дякую! Дуже допомагає!
kaulex

2
експортна лінія, а потім sdkmanager --sdk_root=${ANDROID_HOME} "tools"трохи зробив це для мене - дякую!
gattsbr

23

Для тих, хто боровся з установкою інструментів Android Command Line для 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 / ...
Артурс

У темі, на яку ви посилаєтесь, у відповіді йдеться про "export ANDROID_HOME =" / Users / darish / development / sdk / android "" no "latest", no "cmdline-tools"
Tristan

1
@ Тристан cmdline-tools- це обов'язково, проте latestне потрібно. А шлях (або ім'я) cmdline-toolsвід самого SDK для Android. Ви можете запустити цю команду sdkmanager --sdk_root=${ANDROID_HOME} --list, де результати включають "cmdline-tools; 1.0 | 1.0 | Android SDK Інструменти командного рядка"
Jing Li

Я не знаю, яка логіка стоїть за цим. Але це працює :-)
Soorya

19

Завантаження нових інструментів cmdline з веб-сайту Android Developer вимагає дотримання наступної структури каталогів.


2
Чому це потрібно? звідки це походить? вихідний код? док?
Трістан

1
Я налаштовую свій CI для використання цієї структури, і хоча це дозволяє мені запускати sdkmanager, коли мій проект будується за допомогою gradle, він не знає, як правильно знайти платформи та ліцензії, і все не вдається.
Метт Вулф

16

Замість того, щоб передавати аргумент --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

Це правильна відповідь. На відміну від інших відповідей, це зберігає каталог "інструменти", який є насправді тим, що є в zip-файлі.
SystemParadox


5

Отримав ту саму проблему, сюди потрапив Google. За даними архіву AndroidStudio , сьогодні відбувся випуск 4.1. Я гадаю, це не випадково.

Це абсолютно не пов'язане керівництво має жорстке посилання на більш стару версію sdk-інструментів для Linux . Ви можете змінити URL на windows або mac для інших ОС. Я зараз буду використовувати це як виправлення.

(це повинен був стати коментарем, а не рішенням)


Посилання не працюють, я вже спробував використовувати стару версію, але я використовую нові функції у своїй кодовій базі, тому більше не можу використовувати стару. Тож це рішення для мене не працює.
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=uk-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

Ви повинні побачити версію, надруковану у своєму терміналі.


1
це спрацювало як шарм! ще раз дякую за це повне рішення
Вівіан

4

Я знайшов рішення використовувати найновіші інструменти командного рядка, дотримуючись цих кроків:

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"

Суперечлива інформація: "остання (ця папка повинна містити lib, bin, ...)", ANDROID_HOME = "... / остання" PATH = "... $ ANDROID_HOME / tools / lib
Tristan

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

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.


0

Перша вимога встановлення SDK (будь-якого методу) - це встановлення Java & налаштування шляху JAVA_HOME .

Потім інструментам командного рядка SDK потрібен шлях встановлення, без якого він кидає NullPointerException.
Для подолання цього просто пройдіть шлях, куди ви хочете встановити SDK з аргументом "--sdk_root"
Напр. sdkmanager.bat "платформа-інструменти" "платформи; android-" --sdk_root =

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.