小编典典

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

all

我使用新的 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

阅读 113

收藏
2022-06-29

共1个答案

小编典典

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

Android SDK Command-line Tools 1.0.0 (6200805) 开始,与 Android SDK 26.1.1
(4333796)

相比,tools目录层次结构发生了变化。以前它被放置在里面ANDROID_HOME(不推荐使用,我们将在ANDROID_SDK_ROOT本段的其余部分使用该术语),现在它仍然被命名为(解压下载的
commandlinetools zip
文件tools后你会得到的唯一东西),但不同的是,你必须将它放在您自己调用的目录中。该名称来自其包名称,您可以从列出包命令中获取,其输出包括.
__cmdline-tools``cmdline-tools``sdkmanager --list``cmdline-tools;1.0 | 1.0 | Android SDK Command-line Tools

将目录包装toolscmdline-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-tools并且cmdline-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,把它放在前面会使其优先级更高。
2022-06-29