当前位置: 首页 > 知识库问答 >
问题:

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

罗河
2023-03-14

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

共有1个答案

公孙驰
2023-03-14

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

从Android SDK命令行工具1.0.0(6200805)开始,与Android SDK 26.1.1(4333796)相反,Tools目录层次结构发生了更改。以前它被放置在android_home中(这是不推荐的,我们将在本段的其余部分使用术语android_sdk_root),现在它仍然被命名为tools(解压缩下载的commandlinetools zip文件后您将得到的唯一东西),但不同的是,您必须将它单独放置在一个名为cmdline-tools的目录中。名称cmdline-tools来自其包名,您可以从listing packages命令sdkmanager-list,其输出包括cmdline-tools;1.0 1.0 Android SDK命令行工具

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

好吧,你要改变的就是这些。让我再解释一下。

  • king-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,licens,patcher,platform-tools,platforms,platforms,platforms,您可以很容易地指出build-toolscmdline-tools是同级,都位于父级android_sdk_root中。

让我简单地重述一下:

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

!!更新!!

自build6858069(Android SDK命令行工具3.0)之后,该行为再次发生了更改:

  • 解压缩包后,您将得到的最顶部目录是cmdline-tools
  • 将解压缩目录从cmdline-tools重命名为tools,并将其置于$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下,把它放在前面会使它具有更高的优先级。

 类似资料:
  • 我试图在我的Ubuntu上安装androidSDK,但当我试图在tools/bin/sdkmanager文件夹上运行SDK管理器时,我得到以下消息: 我的Ubuntu是最近安装的,除了Java8和Android Studio之外什么都没有。 我的SDK文件夹是默认的~/android/SDK。

  • 工欲善其事,必先利其器。学好SQLite的命令行工具,对于我们学习SQLite本身而言是非常非常有帮助的。最基本的一条就是,它让我们学习SQLite的过程更加轻松愉快。言归正传吧,在SQLite的官方下载网站,提供了支持多个平台的命令行工具,使用该工具我们可以完成大多数常用的SQLite操作,就像sqlplus之于Oracle。以下列表给出了该工具的内置命令: 命令名 命令说明 .help 列出所

  • 命令行工具 meteor help 获取 meteor 命令行使用帮助。运行 meteor help 会列出meteor所有命令。运行meteor help &lt;command&gt;会打印出关于meteor &lt;command&gt;的详细帮助。 meteor create &lt;name&gt; 创建一个名为&lt;name&gt;的子目录,并在里面新建一个Meteor应用。 met

  • web3j的完全jar文件分发包对每一次发布都提供命令行工具。命令行允许你从终端(terminal)使用web3j的一些功能: 这些工具提供: 钱包创建 钱包密码管理 从一个钱包转移到另一个钱包以太币 solidity智能合约封装包的产生 命令行工具可以从github项目存储库的releases页面下载zipfile/tarball包,或者通过源代码自己编译获得;OS X用户也可以通过Homebr

  • 命令行工具 web3j的jar包为每一个版本都提供命令行工具。命令行工具允许你直接通过一些命令使用web3j的一些功能: 钱包创建 钱包密码管理 资金从钱包转移到另一个 solidity编写的智能合同功能打包 请参阅文档以获得命令行相关的进一步的信息。

  • 命令行是程序员的好伙伴 作为一名优秀的程序员,熟练的命令行操作也是必不可少的。在『Laravel 实战教程』系列课程中,我们的很多操作都会使用到命令行,如: Git 操作; 虚拟机管理; 部署到线上等。 工欲善其事、必先利其器,命令行工具的选择也尤其重要。这里为了课程讲解的一致性,也为了避免读者在学习中犯不必要的错误,我们为各个平台挑选了专属的命令行工具,请大家配合使用。 Mac 用户 Mac O