Android命令行工具sdkmanager始终显示:警告:无法创建设置

时间:2020-02-27 19:32:08

标签: android gitlab-ci android-build android-sdk-manager android-studio-3.6

我使用了android的新命令行工具,因为android的旧sdk-tools存储库不再可用。所以我更改了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

20 个答案:

答案 0 :(得分:333)

让我们深入探讨真正的原因,而不是为每次执行单个命令都传递参数--sdk_root

Android SDK命令行工具1.0.0(6200805)开始,与 Android SDK 26.1.1(4333796)相反,tools目录层次结构已更改。 以前它是放在ANDROID_HOME内部的(不推荐使用,在本段的其余部分中我们将使用术语ANDROID_SDK_ROOT),现在它仍然命名为tools(您唯一要在解压缩下载的 commandlinetools zip文件后,您将获得此文件),但不同的是,您必须自己将其放置在名为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_SDK_ROOT。因为稍后,在更新Android SDK或安装更多软件包时,其他软件包将放在ANDROID_SDK_ROOT下,而不是cmdline-tools下。
  • 最终的完整ANDROID_SDK_ROOT目录结构应如下所示,由许多子目录组成:build-toolscmdline-toolsemulator,{{1} },licensespatcherplatform-toolsplatforms。您可以轻松指出system-imagesbuild-tools是兄弟姐妹,都位于父cmdline-tools内。

让我以简单的方式回顾一下:

  • 设置您喜欢的ANDROID_SDK_ROOT(就像以前一样)
  • 下载 commandlinetools zip文件并将其解压缩到名为ANDROID_SDK_ROOT的目录中,该目录位于cmdline-tools
  • 将目录ANDROID_SDK_ROOT附加到环境变量$ANDROID_SDK_ROOT/cmdline-tools/tools/bin,以便系统知道在何处找到PATH

!!更新!!

自构建sdkmanager(Android SDK命令行工具3.0)以来,行为再次发生了变化:

  • 解压缩软件包后,您将获得的最顶层目录是6858069
  • 将已解压缩的目录从cmdline-tools重命名为cmdline-tools,并将其放在tools下,因此现在看起来应该像:$ANDROID_SDK_ROOT/cmdline-tools。在其中,您应该具有:$ANDROID_SDK_ROOT/cmdline-tools/tools。实际上,根据official Command-Line Tools doc,树结构应为NOTICE.txt bin lib source.properties,但我已经检查过,使用android_sdk/cmdline-tools/version/bin/version在这里没有什么区别。
  • 对于您的环境变量tools,我建议您这样设置:PATH,因为稍后进行更新后,您将获得位于{{1}下的最新PATH=$PATH:$ANDROID_SDK_ROOT/cmdline-tools/latest/bin:$ANDROID_SDK_ROOT/cmdline-tools/tools/bin },放在最前面会使其具有更高的优先级。

答案 1 :(得分:109)

这似乎是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不再有此问题。此更新需要时间和带宽,对于解决方法并非完全必要。

答案 2 :(得分:40)

对于那些在Windows 10 / x64上为Appium安装Android命令行工具感到困扰的人,请执行以下操作:

  1. 从android下载最新的命令行工具,即commandlinetools-win-6200805_latest.zip
  2. 解压缩下载的文件
  3. 创建用于在命令行中存储命令行工具的目录,包括以下路径: android / cmdline-tools / latest 基本上,当您解压缩此Cmd命令行工具时,只需重命名 tools 目录放置到最新,并确保将最新文件夹放在磁盘上 android / cmdline-tools 目录中的
  4. 为存储cmdline工具目录位置的目录创建 ANDROID_HOME 环境变量,例如: C:\ YourLocationWhereYouStoreTheDirectory \ android \ cmdline-tools \ latest
  5. 在路径环境变量中以%ANDROID_HOME%\ bin
  6. 创建新条目

答案 3 :(得分:23)

sdkmanager尝试根据解压缩的位置来找出android-sdk路径,而不使用环境变量,例如ANDROID_SDK_ROOT。但情况变得更糟,因为它有一个名为cmdline-tools的硬编码父文件夹,并且如果您在另一个名称的文件夹中解压缩commandlinetools则无法正常工作,从而迫使我们使用参数sdk_root正确输入内部变量。 / p>

因此,考虑到这一点,我们可以使用以下方法来解决此问题。

我将假定我们使用的是Ubuntu OS,因此,如果您未使用Ubuntu OS,则应改编其中的一些说明。

  1. 安装Android-SDK。

    sudo apt install android-sdk
    

    安装后,您将在/ usr / lib中有一个名为android-sdk的文件夹

  2. 在android-sdk文件夹中创建一个名为cdmline-tools的文件夹

    sudo mkdir /usr/lib/android-sdk/cmdline-tools
    
  3. 从此处(https://developer.android.com/studio?hl=en-419#downloads)下载Android命令行工具zip
  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
    

您应该会在终端中看到打印的版本。

答案 4 :(得分:22)

从Android Developer网站下载新的cmdline-tools需要遵循以下目录结构。

答案 5 :(得分:7)

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
[...]

答案 6 :(得分:5)

我找到了按照以下步骤使用最新命令行工具的解决方案:

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"

答案 7 :(得分:5)

Google也遇到了同样的问题。 根据{{​​3}},今天是4.1版本。 我想那不是巧合。

AndroidStudio Archive具有一个较旧版本的completely unrelated guide的硬链接。 您可以将其他操作系统的URL更改为Windows或Mac。我现在将其用作修补程序。

(本来应该是评论,而不是解决方案)

答案 8 :(得分:3)

我想分享我的经验。

首先,我尝试解释为什么必须查看目录结构 此答案中显示的方式-https://stackoverflow.com/a/60460681/1758733https://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.

一个人可能遇到另一个问题-Stuck at ".android/repositories.cfg could not be loaded."

其他问题和事实:

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

答案 9 :(得分:3)

我遇到了同样的错误。在完成所有解决方案后,我无法修复它。我通过阅读: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%

答案 10 :(得分:3)

在这里总结了几个有用的帖子,对于想要快速片段的人,例如插入 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 根目录中创建虚假目录,{{1 }}, -2 后缀。然后这些目录将被忽略,并打印 -3 之类的警告,因此这种行为绝对不可取。如果您对此有修复,请写在评论中,或者,如果您有足够的信心,只需使用准确的修复来编辑脚本。

答案 11 :(得分:2)

在新Mac上下载standalone command line toolscommandlinetools-mac-6200805_latest)时,这发生在我身上。

基于这里的所有答案,我能够使它像这样

# 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的捆绑软件的一部分。

答案 12 :(得分:2)

Android SDK工具现在位于以下位置:“ android_sdk / cmdline-tools / version / bin / ”;

因此,要在 Windows 中解决此问题(可以在其他操作系统中复制相同的内容),请执行以下操作:

  1. 在您的android_sdk文件夹中,创建文件夹:cmdline-tools,并在其中创建另一个文件夹:version提取/将所有文件“ / bin / lib注意和来源” “ .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

答案 13 :(得分:2)

基于@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/

答案 14 :(得分:1)

Unity 2018文档中的此页面也很好地解决了此问题,其中包括:

  1. 在没有Android Studio的情况下安装Android SDK。
  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

答案 15 :(得分:1)

answer by jing-li works for me 让我们深入研究真正的原因,而不是为每个命令执行都传递参数--sdk_root。

从Android SDK命令行工具1.0.0(6200805)开始,与Android SDK 26.1.1(4333796)相比,工具目录层次结构已更改。以前它被放置在ANDROID_HOME内,现在仍被命名为工具(解压缩下载的commandlinetools zip文件后唯一得到的东西),但是不同的是,您必须自己将其放置在名为cmdline-tools的目录中。名称cmdline-tools来自其软件包名称,您可以从列出软件包命令sdkmanager --list获得该名称,其输出包括cmdline-tools; 1.0 | 1.0 | Android SDK命令行工具。

在cmdline-tools目录中包装tools目录将使其工作,并帮助您摆脱烦人的--sdk_root参数。但是其他部分呢?

答案 16 :(得分:0)

使用 Android Studio 的 Ubuntu 工作解决方案 这是 Ubuntu 和 Debian like 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. 将 bin 添加到您的 PATH PATH=$PATH:/home/user/Android/Sdk/tools/bin/
  4. 之后,运行:flutter doctor --android-licenses 并接受所有许可 要检查一切是否正常,请在详细模式下运行医生,如下所示:flutter doctor -v

答案 17 :(得分:0)

如果您同时使用Linux,并且不想让复杂的解决方法陷入困境,建议您下载并使用the Snap version of sdkmanager

请记住在终端中使用androidsdk而不是sdkmanager

答案 18 :(得分:0)

安装SDK(任何方法)的首要要求是安装 Java 并设置 JAVA_HOME 路径。

然后,SDK命令行工具需要安装路径,否则安装路径将引发NullPointerException。
要解决此问题,只需在参数“ --sdk_root”中通过您要安装SDK的路径即可
例如。sdkmanager.bat“ platform-tools”“ platforms; android-” --sdk_root =

答案 19 :(得分:-1)

在安装命令行工具时,即使不是用于开发应用程序的编辑器,Android Studio也是必需的。取消选中过时的包选项卡并下载工具即可;可以解决许可证问题,您可以返回自己喜欢的IDE(例如VS Code)。