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

Android Command line tools sdkmanager always shows: Warning: Could not create settings

我使用 new command line tools for 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

遇到了同样的问题,Google 来到这里。 根据AndroidStudio Archive,今天是4.1的发布。 我想这不是巧合。

这个completely unrelated guide has a hardlink for an older version of the sdk-tools for linux。 对于其他操作系统,您可以将 url 更改为 windows 或 mac。我暂时将其用作修补程序。

(这应该是评论而不是解决方案)

这似乎是 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 开发者网站下载新的 cmdline-tools 需要遵循以下目录结构。

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

1 - 将命令行工具提取到具有以下结构的文件夹中: 例如:$HOME/Development/android/cmdline-tools/latest (此文件夹必须包含 libbinnotice.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"

对于那些在 Windows 10/x64 上为 Appium 安装 Android 命令行工具而苦苦挣扎的人,只需按照以下步骤操作:

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

我想分享我的经验。

首先我试图解释为什么目录结构必须看起来 此答案中显示的方式 - https://whosebug.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 -  - 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

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

我在新 Mac 上下载 standalone command line tools (commandlinetools-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 选项的文档说 "Use the specified SDK root instead of the SDK containing this tool"。这让我想到,尽管该工具是独立发布的,但它也有望成为安装 SDK 的捆绑包的一部分。

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

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

我假设我们使用的是 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. 从此处下载 Android 命令行工具 zip (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

     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
    

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

与其为每个命令执行传递参数 --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来自于它的包名,你可以通过listing packages命令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-toolsemulatorlicensespatcherplatform-toolsplatformssystem-images。你可以很容易地指出 build-toolscmdline-tools 是兄弟姐妹,都坐在父 ANDROID_SDK_ROOT.
  • 里面

让我简单回顾一下:

  • 设置您的首选ANDROID_SDK_ROOT(与之前一样)
  • 下载 commandlinetools zip 文件并将其解压缩到名为 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。其实按照official Command-Line Tools doc,树形结构应该是android_sdk/cmdline-tools/version/bin/,不过我查过了,这里用version或者tools都没有区别。
  • 对于你的环境变量PATH,我建议你这样设置:PATH=$PATH:$ANDROID_SDK_ROOT/cmdline-tools/latest/bin:$ANDROID_SDK_ROOT/cmdline-tools/tools/bin,因为稍后更新后,你会得到最新的sdkmanager放在[=下60=],放在前面优先级高

安装SDK(任何方法)的第一个要求是安装Java & 设置JAVA_HOME路径.

然后,SDK 命令行工具需要安装路径,没有它会抛出 NullPointerException。
要克服这个问题,只需传递要使用参数“--sdk_root”
安装 SDK 的路径 例如 sdkmanager.bat "platform-tools" "platforms;android-" --sdk_root=

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

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

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

因此要在 Windows 中解决这个问题(同样可以在其他 OS 中复制),请执行以下操作:

  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/ 并在 ENVIRONMENTAL VARIABLES 下添加相应的 PATHENVIRONMENTAL VARIABLES =20=]

Android 安装命令行工具时需要 Studio,即使它不是您用来开发应用程序的编辑器。取消选中过时的包选项卡并下载工具就可以了;这应该可以解决许可证问题,您可以返回到您最喜欢的 IDE(例如 VS Code)。

如果您在使用 Linux 的同时又不想用复杂的变通方法来解决问题,我建议您下载并使用 the Snap version of sdkmanager

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

在这里总结了几篇有用的帖子,对于想要快速摘录的人,例如插入 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 platform/build 工具版本 29 已安装,Android sdk 根目录将位于 /opt/android。虽然此设置对我有效,但没有警告,但我在重新安装已安装的软件包或可能安装不同版本的软件包时遇到问题:它与已存在的软件包冲突并在 sdk 根目录中创建虚假目录, -2, -3 后缀。然后忽略这些目录,并打印 Observed package id 'emulator' in inconsistent location 之类的警告,因此这种行为绝对不可取。如果您对此有修复,请将其写在评论中,或者,如果您有足够的信心,只需使用确切的修复来编辑脚本。

根据@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/

Ubuntu 使用 Android Studio 的工作解决方案 这是 Ubuntu 和像 linux 这样的 Debian 的工作过程:

  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 并接受所有许可 检查是否一切正常 运行 医生在 verbos 模式下如下:flutter doctor -v

简单的解决方案:

  1. 打开 Android Studio 工具菜单,
  2. SDK Manager 中的 window 上面有内板,
  3. 选择 SDK 工具面板勾选 Android SDK 命令行工具
  4. 选择 window
  5. 底部附近的“应用”按钮

刚刚用 IDE 解决了这个问题,对我来说看起来很简单。 (实际上这是重复的先前答案,但带有图片)。只需安装 sdk 工具,一切正常。

这是非常基本和简单的解决方案 只需更改文件夹结构 将主文件夹名称更改为最新 然后创建一个名为 cmdline-tools 的文件夹 在名为 tools 的 cmdline 中创建新文件夹,并将 bin 和其他数据放入 tools 文件夹中 所以它看起来像这样 user\latest\cmdline-tools\tools

我搜索了很多但对我有用