201

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

22 回答 22

423

--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-toolscmdline-toolssdkmanager --listcmdline-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,把它放在前面会使其优先级更高。
于 2020-04-12T19:06:45.223 回答
112

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

于 2020-02-28T14:56:14.497 回答
42

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

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

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

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

我会假设我们使用的是 Ubuntu 操作系统,所以如果你不是,你应该调整其中的一些说明。

  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
    

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

于 2020-04-11T00:59:46.293 回答
26

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

于 2020-02-28T23:45:15.117 回答
12

简单的解决方案:

  1. 打开 Android Studio 工具菜单,
  2. SDK Manager 在出现的窗口中有内部面板,
  3. 选择 SDK 工具面板 勾选 Android SDK 命令行工具
  4. 选择窗口底部附近的应用按钮
于 2021-08-17T18:14:33.010 回答
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
[...]
于 2020-05-16T15:12:11.720 回答
6

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

1 - 将命令行工具提取到具有此结构的文件夹中:例如:($HOME/Development/android/cmdline-tools/latest 此文件夹必须包含libbinnotice.txtsource.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"
于 2020-03-02T19:31:52.830 回答
5

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

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

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

于 2020-02-27T21:15:54.360 回答
4

在这里总结几篇有用的帖子,对于想要一个快速片段的人,例如插入一个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 根目录中创建带有-2,-3后缀的虚假目录。然后忽略这些目录,并Observed package id 'emulator' in inconsistent location打印类似的警告,因此这种行为绝对是不可取的。如果您对此有修复,请将其写在评论中,或者,如果您有足够的信心,只需编辑带有确切修复的脚本。

于 2021-02-13T12:55:31.533 回答
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.

可能会遇到另一个问题 -卡在“.android/repositories.cfg 无法加载”。

其他问题和事实:

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
于 2020-03-24T19:14:15.007 回答
3

我在新 Mac 上下载独立命令行工具( ) 时发生了这种情况。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选项的文档说“使用指定的 SDK 根目录而不是包含此工具的 SDK ”。这让我觉得,尽管该工具是独立发布的,但它也希望成为安装 SDK 的捆绑包的一部分。

于 2020-04-08T05:09:20.120 回答
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%最后添加

于 2020-05-05T13:10:58.393 回答
2

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

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

  1. 在您的android_sdk文件夹中,创建文件夹:cmdline-tools并在其中创建另一个文件夹:version将所有文件“/bin /lib NOTICE and sources.properties”文件提取/放入此version文件夹中。

  2. 设置ANDROID_HOME到您的android_sdk文件夹。

  3. 添加到您的系统路径:android_sdk\cmdlineAndroidSDK\cmdline-tools\version\bin\

同样,将您的Android SDK 平台工具放在您的内部并android_sdk/platform-tools/添加对应PATHENVIRONMENTAL VARIABLESSystem Variables

于 2020-05-23T14:52:32.867 回答
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/
于 2021-04-07T09:38:44.807 回答
1

Unity 2018 文档中的此页面也很好地解释了解决此问题,包括以下几点:

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

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

于 2020-04-01T16:10:42.107 回答
0

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

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

于 2020-04-20T05:05:02.373 回答
0

如果您使用的是 Linux,同时又不想用复杂的解决方法弄乱您的手,我建议您下载并使用sdkmanager 的 Snap 版本

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

于 2020-08-12T08:46:59.583 回答
0

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

  1. 按照他们的网站https://developer.android.com/studio/install中的说明安装 Android Studio
  2. run : flutter config --android-studio-dir <location of android studio>then flutter config --android-sdk /home/user/Android/Sdk(这是 SDK 的默认位置)
  3. 将垃圾箱添加到您的 PATHPATH=$PATH:/home/user/Android/Sdk/tools/bin/
  4. 之后,运行:flutter doctor --android-licenses并接受所有许可证要检查一切是否正常,请在详细模式下运行医生,如下所示: flutter doctor -v
于 2021-08-02T13:03:54.923 回答
0

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

在此处输入图像描述

于 2021-11-09T09:00:00.057 回答
0

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

我搜索了很多,但它对我有用

于 2021-12-13T05:50:32.767 回答
-3

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

于 2020-05-26T14:19:57.160 回答