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


64

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

Answers:


79

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不再存在此问题。此更新需要时间和带宽,对于解决方法并非完全必要。


1
工作正常,现在我在使用./gradlew assembleDebug时遇到错误,但是似乎这与sdkmanager无关。谢谢!
kaulex

1
您能否举个例子,说明如何清理回声?我不明白
kaulex

1
我已经更新了原始回复中的代码段,以明确删除echo y命令。
呼叫者

1
谢谢!很有帮助!
kaulex

2
出口线,然后一sdkmanager --sdk_root=${ANDROID_HOME} "tools"点点为我做了-谢谢!
gattsbr

23

对于那些努力在Windows 10 / x64上安装Appium的Android命令行工具的人,请执行以下操作:

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

2
这个“ android / cmdline-tools / latest”的需求从何而来?源代码 ?在某个地方有一些文档?
特里斯坦

1
:原因是此主题下描述stackoverflow.com/questions/60460429/...
ArturS

在您所引用的主题中,答案为“ export ANDROID_HOME =“ / Users / darish / development / sdk / android””,“最新”,“ cmdline-tools”
Tristan

1
@Tristan cmdline-tools是必须具备的,但latest不是必需的。的路径(或名称)cmdline-tools来自Android SDK本身。您可以运行此命令sdkmanager --sdk_root=${ANDROID_HOME} --list,结果包括“ cmdline-tools; 1.0 | 1.0 | Android SDK命令行工具”
Jing Li

我不知道这背后的逻辑是什么。但这有效:-)
Soorya

19

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


2
为什么需要它?这是哪里来的?源代码 ?doc?
特里斯坦

1
我将CI设置为使用此结构,虽然它确实允许我运行sdkmanager,但是当我的项目使用gradle构建时,它不知道如何正确定位平台和许可证,并且一切都会失败。
马特·沃尔夫

16

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

Android SDK命令行工具1.0.0(6200805)开始,与Android SDK 26.1.1(4333796)相比tools目录层次结构已更改。以前它放在里面ANDROID_HOME,现在仍被命名为tools(解压缩下载的commandlinetools 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_HOME。因为稍后,在更新Android SDK或安装更多软件包时,其他软件包将放在之下ANDROID_HOME,而不是cmdline-tools
  • 最后,完整的ANDROID_HOME目录结构应如下,包括相当多的子目录:build-toolscmdline-toolsemulatorlicensespatcherplatform-toolsplatformssystem-images。您可以轻松地指出,build-tools并且cmdline-tools都是兄弟姐妹,都坐在父母的内部ANDROID_HOME

让我简单地回顾一下:

  • 设置您的首选ANDROID_HOME(就像以前一样)
  • commandlinetools zip文件下载并解压缩到名为的目录中cmdline-tools,该目录位于内部ANDROID_HOME
  • 将目录追加$ANDROID_HOME/cmdline-tools/tools/bin到环境变量PATH,以便系统知道在哪里查找sdkmanager

这是正确的答案。与其他答案不同,这保留了“ tools”目录,该目录实际上是zip文件中的内容。
SystemParadox

非常感谢,您已经回答了我的问题 :)
R-obert

5

有同样的问题,由谷歌来到这里。根据AndroidStudio存档,今天是4.1版本。我想那不是巧合。

完全不相关的指南具有旧版本的sdk-tools for linux的硬链接。您可以将其他操作系统的URL更改为Windows或Mac。我现在将其用作修补程序。

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


链接无法正常工作,我已经尝试使用旧版本,但是我在代码库中使用了新功能,因此无法再使用旧版本。所以这个解决方案对我不起作用。
kaulex

5

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

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

我将假定我们使用的是Ubuntu OS,因此,如果您未使用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=zh-CN#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

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


1
它就像一个魅力!再次感谢您提供完整的解决方案
Vivian

4

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

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"

矛盾信息:“最新(此文件夹必须包含lib,bin,...)”,ANDROID_HOME =“ ... / latest” PATH =“ ... $ ANDROID_HOME / tools / lib
Tristan

lib是在工具中还是在ANDROID_HOME中?
特里斯坦

这应该是公认的答案
Shivam Jha

cmdline-tools是必须具备的,但latest不是必需的。
李静

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


0

在新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的捆绑软件的一部分。


0

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

然后,SDK命令行工具需要安装路径,否则安装路径将引发NullPointerException。
为了解决这个问题,只需在您要安装SDK的路径中加上参数“ --sdk_root”即可
sdkmanager.bat“平台工具”“平台; android-” --sdk_root =

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.