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

当前回答

简单的解决方案:

打开Android Studio工具菜单, SDK管理器在窗口中出现 上面是内嵌板, 选择SDK工具面板勾选Android SDK命令行工具 选择窗口底部附近的Apply按钮

其他回答

这似乎是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

同时,将毛毯许可接收命令移动到第一个命令,清理回滚部分。

奇怪的是,如果你运行sdkmanager——sdk_root=${ANDROID_HOME} "tools",它会把工具从3.6.0升级到26.1.1,sdkmanager就不再有这个问题了。这个更新需要花费时间和带宽,对于解决方案来说并不是完全必要的。

我得到了同样的错误。在做了所有的解决方案,我不能解决它。我通过阅读https://forum.unity.com/threads/android-build-not-working.844969/解决了这个问题

简化答案:

用notepad++打开sdkmanager.bat 将这一行从 "%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%

Unity 2018文档中的这一页也很好地解释了解决这个问题的方法,包括以下几点:

在没有Android Studio的情况下安装Android SDK。 “警告:无法创建设置”和“java.lang.IllegalArgumentException”的解决方案 Android Studio 3.6或更新版本的诀窍。 关于Java 9或更高版本的警告,JDK必须是版本8。

https://docs.unity3d.com/2018.4/Documentation/Manual/android-sdksetup.html

如果您正在使用Linux,同时又不想让复杂的解决方法弄得乱七八糟,我建议您下载并使用sdkmanager的Snap版本。

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

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

Starting from Android SDK Command-line Tools 1.0.0 (6200805), in contrast to Android SDK 26.1.1 (4333796), the tools directory hierarchy has been changed. Previously it was placed right inside ANDROID_HOME (which is deprecated, we will use the term ANDROID_SDK_ROOT for the rest of the paragraph), now it's still named as tools (the only thing you'll get after unpacking the downloaded commandlinetools zip file), but differently, you have to place it inside a directory called cmdline-tools on your own. The name cmdline-tools comes from its package name, where you can get from listing packages command sdkmanager --list, whose outputs include cmdline-tools;1.0 | 1.0 | Android SDK Command-line Tools.

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

这就是你要改变的。让我解释更多。

The king - sdkmanager lives inside cmdline-tools/tools/bin, you'd better set in PATH environment variable cmdline-tools should not be set as ANDROID_SDK_ROOT. Because later, when updating Android SDK, or installing more packages, the other packages will be placed under ANDROID_SDK_ROOT, but not under cmdline-tools. The final, complete ANDROID_SDK_ROOT directory structure should look like below, consist of quite a few sub-directories: build-tools, cmdline-tools, emulator, licenses, patcher, platform-tools, platforms, system-images. You can easily point out that build-tools and cmdline-tools are siblings, all sit inside the 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)以来,行为再次发生了变化:

After unzipping the package, the top-most directory you'll get is cmdline-tools. Rename the unpacked directory from cmdline-tools to tools, and place it under $ANDROID_SDK_ROOT/cmdline-tools, so now it should look like: $ANDROID_SDK_ROOT/cmdline-tools/tools. And inside it, you should have: NOTICE.txt bin lib source.properties. Actually according to the official Command-Line Tools doc, the tree structure should be android_sdk/cmdline-tools/version/bin/, but I've checked, using version or tools makes no difference here. For your environment variable PATH, I would recommend you to set like this: PATH=$PATH:$ANDROID_SDK_ROOT/cmdline-tools/latest/bin:$ANDROID_SDK_ROOT/cmdline-tools/tools/bin, because after update later, you'll get the latest sdkmanager placed under $ANDROID_SDK_ROOT/cmdline-tools/latest/bin, put it in front will make it higher priority.