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

kau*_*lex 187 android android-build gitlab-ci 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)
Run Code Online (Sandbox Code Playgroud)

我已经尝试过手动执行这些命令,但我遇到了同样的错误。此外,如果我运行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
Run Code Online (Sandbox Code Playgroud)

Jin*_* Li 399

--sdk_root让我们深入研究真正的原因,而不是为每个命令执行传递参数。

Android SDK 命令行工具 1.0.0 (6200805) 开始,与Android SDK 26.1.1 (4333796) 相比tools目录层次结构已更改。以前它被放置在内部ANDROID_HOME(已弃用,我们将在ANDROID_SDK_ROOT该段落的其余部分使用该术语),现在它仍然被命名为tools(解压下载的命令行工具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-tools, cmdline-tools, emulator, licenses, patcher, platform-tools, platforms, system-images. 你可以很容易地指出build-toolscmdline-tools是兄弟姐妹,都坐在 parent 里面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-toolstools,并将其放在 下$ANDROID_SDK_ROOT/cmdline-tools,现在它应该看起来像:$ANDROID_SDK_ROOT/cmdline-tools/tools。而且里面,你应该有:NOTICE.txt bin lib source.properties。实际上根据官方的命令行工具文档,树结构应该是android_sdk/cmdline-tools/version/bin/,但我已经检查过,使用versiontools在这里没有区别。
  • 对于你的环境变量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,放在前面会使其优先级更高。

  • ANDROID_HOME 已弃用。我们应该迁移到 ANDROID_SDK_ROOT。来源:https://developer.android.com/studio/command-line/variables#envar (9认同)
  • 谢谢。将“tools”父目录重命名为“cmdline-tools”为我解决了这个问题。然而,不敢相信 Android SDK 如此脆弱 (9认同)
  • 这是正确的答案。与其他答案不同,这保留了“tools”目录,这实际上是 zip 文件中的内容。 (5认同)
  • 我很确定这是故意的 - 谷歌希望让这个过程尽可能困难,以尝试将每个人迁移到庞大的工作室包中。很高兴我们有 Stack Overflow 来解决这些烦恼。 (5认同)
  • 在撰写本文时,更新后有 3 个不同的“sdkmanager”二进制文件。`$ANDROID_SDK_ROOT/tools/bin/sdkmanager --version` =&gt; `26.1.1` `$ANDROID_SDK_ROOT/cmdline-tools/tools/bin/sdkmanager --version` =&gt; `3.6.0` `$ANDROID_SDK_ROOT/cmdline-工具/最新/bin/sdkmanager --version` =&gt; `4.0.0` (3认同)
  • 它对我有用,但现在我有一个警告“在不一致的位置'/home/{username}/.android/sdk/cmdline-tools/tools'中观察到包ID'tools'(预期'/home/{username}/。 android/sdk/工具')" (2认同)
  • @ChristianReall-Fluharty 是的,最新软件包 6858069 的行为已更改,我正在进行更新。但说实话,谷歌应该修复它并使行为一致且可预测,而不是我们总是猜测和适应。 (2认同)

cal*_*er9 110

这似乎是 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
Run Code Online (Sandbox Code Playgroud)

此外,将一揽子许可证接受命令移至第一个命令以清理echo y部件。

奇怪的是,如果你运行sdkmanager --sdk_root=${ANDROID_HOME} "tools"它会将工具从 3.6.0 升级到 26.1.1 并且 sdkmanager 不再有这个问题。此更新需要时间和带宽,并且对于变通方法并不是完全必要的。

  • 导出行,然后 `sdkmanager --sdk_root=${ANDROID_HOME} "tools"` 位为我做了这件事 - 谢谢! (4认同)

Art*_*urS 41

对于那些在 Windows 10/x64 上为 Appium 安装 Android 命令行工具有困难的人,只需执行以下操作:

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

  • 这个“android/cmdline-tools/latest”的需求从何而来?源代码 ?某个地方的某个医生? (2认同)

小智 25

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

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

我假设我们使用的是 Ubuntu 操作系统,所以如果你不是,你应该修改一些说明。

  1. 安装 Android-SDK。

    sudo apt install android-sdk
    
    Run Code Online (Sandbox Code Playgroud)

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

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

    sudo mkdir /usr/lib/android-sdk/cmdline-tools
    
    Run Code Online (Sandbox Code Playgroud)
  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
    
    Run Code Online (Sandbox Code Playgroud)
  5. 转到您的主目录并编辑您的 .profile

    nano .profile
    
    Run Code Online (Sandbox Code Playgroud)
  6. 创建一个 ANDROID_SDK_ROOT 变量

    export ANDROID_SDK_ROOT=/usr/lib/android-sdk
    
    Run Code Online (Sandbox Code Playgroud)
  7. 将 sdkmanager 文件夹放在您的路径中

    export PATH=$ANDROID_SDK_ROOT/cmdline-tools/tools/bin:$PATH
    
    Run Code Online (Sandbox Code Playgroud)
  8. 保存并退出
  9. 重新加载您的个人资料

    . ~/.profile
    
    Run Code Online (Sandbox Code Playgroud)
  10. sdkmanager --version
    
    Run Code Online (Sandbox Code Playgroud)

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

  • 它就像一个魅力!再次感谢这个完整的解决方案 (3认同)

Dhe*_*j D 24

简单的解决方案:

  1. 打开 Android Studio 工具菜单,
  2. SDK Manager 在出现的窗口中有内部面板,
  3. 选择 SDK Tools 面板 勾选 Android SDK Command-line Tools
  4. 选择窗口底部附近的“应用”按钮

  • 本页最佳解决方案 (4认同)
  • 简短而精确! (4认同)

小智 23

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

  • 为什么需要它?这是从哪里来的?源代码 ?医生? (2认同)

Jav*_*ano 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
[...]
Run Code Online (Sandbox Code Playgroud)


小智 6

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

    "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %SDKMANAGER_OPTS%  -classpath "%CLASSPATH%" com.android.sdklib.tool.sdkmanager.SdkManagerCli %CMD_LINE_ARGS% --sdk_root=%ANDROID_HOME%
    
    Run Code Online (Sandbox Code Playgroud)

(注:--sdk_root=%ANDROID_HOME%最后添加


jnn*_*nks 5

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

这个完全不相关的指南有一个旧版sdk-tools for linux的硬链接。对于其他操作系统,您可以将 url 更改为 windows 或 mac。我现在将其用作修补程序。

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


小智 5

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

1 - 将命令行工具压缩到具有以下结构的文件夹中:例如:($HOME/Development/android/cmdline-tools/latest 此文件夹必须包含libbinnotice.txtsource.properties

2 - 将ANDROID_HOME定义为环境变量:

ANDROID_HOME="$HOME/Development/android/cmdline-tools/latest"
Run Code Online (Sandbox Code Playgroud)

3 - 在PATH上加载它:

PATH="$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/tools/lib:$ANDROID_HOME/tools/bin:$ANDROID_HOME/platform-tools"
Run Code Online (Sandbox Code Playgroud)


cez*_*tko 5

在这里总结了几篇有用的帖子,对于想要快速片段的人,例如插入 a 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
Run Code Online (Sandbox Code Playgroud)

它只需要bsdtar安装(它通常打包在流行的发行版中)。Android 平台/构建工具版本 29 已安装,Android sdk 根目录将位于/opt/android. 虽然此设置对我来说没有警告,但在重新安装已安装的软件包或可能安装不同版本的软件包时遇到问题:它与已存在的软件包发生冲突,并在 sdk 根目录中创建带有 , 后缀的虚假-2目录-3。然后这些目录将被忽略,并Observed package id 'emulator' in inconsistent location打印类似的警告,因此这种行为绝对是不可取的。如果您有解决方案,请在评论中写下,或者,如果您有足够的信心,只需使用确切的解决方案编辑脚本即可。


Bit*_* Do 5

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

在此输入图像描述