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

我使用新的命令行工具 for Android,因为旧的Android sdk工具存储库不再可用。所以我改变了我的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
166722 次浏览

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

这个完全不相关的指南有一个老版本Linux的Sdk-tools的硬链接。 对于其他操作系统,可以将url更改为windows或mac。

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

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

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

.

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

将命令行工具解压到如下结构的文件夹中: 例如:$HOME/Development/android/cmdline-tools/latest (此文件夹必须包含自由箱子notice.txtsource.properties)

2 -定义ANDROID_HOME作为环境变量:

ANDROID_HOME="$HOME/Development/android/cmdline-tools/latest"

3 -加载它在路径:

PATH="$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/tools/lib:$ANDROID_HOME/tools/bin:$ANDROID_HOME/platform-tools"

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

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

我想分享一下我的经验。

首先,我试图解释为什么目录结构必须看 在这个答案中显示的方式- 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

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

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

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

我在新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安装包的一部分。

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

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

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

  1. < p >安装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. 到你的home目录,编辑你的。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. < p >运行

    sdkmanager --version
    

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

与其为每一个命令执行传递参数--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的名称来自于它的包名,你可以从列出包的命令sdkmanager --list中获得,其输出包括cmdline-tools;1.0 | 1.0 | Android SDK Command-line Tools.

tools目录包装到cmdline-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-toolscmdline-toolsemulatorlicensespatcherplatform-toolsplatformssystem-images。你可以很容易地指出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

更新! ! ! !

自构建6858069 (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下面,把它放在前面会使它的优先级更高。
安装SDK(任何方法)的第一个要求是安装Java &设置JAVA_HOME路径。

然后,SDK命令行工具需要安装路径,否则会抛出NullPointerException.
要克服这个问题,只需传递你想要安装SDK的路径,参数为“——sdk_root”
如。 sdkmanager.bat "platform-tools" "platforms;android-"——sdk_root=

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

简化答案:

  1. 用notepad++打开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%

混合了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
[...]

Android SDK工具现在休息在以下位置:"android_sdk cmdline-tools /版本/ bin /";

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

  1. 在你的android_sdk文件夹中,创建文件夹:cmdline-tools,并在其中创建另一个文件夹:version extract / put所有你的文件"/bin /libversion文件夹中的文件。

  2. ANDROID_HOME设置为你的android_sdk文件夹。

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

类似地,将你的Android SDK平台工具放在你的android_sdk/platform-tools/中,并将相应的PATH添加到System Variables下的ENVIRONMENTAL VARIABLES

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

如果你正在使用Linux,同时,你不想用复杂的变通方法弄乱你的手,我建议你下载并使用sdkmanager的Snap版本

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

这里总结了几篇有用的文章,对于想要快速片段的人,例如插入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这样的警告,所以这种行为肯定是不可取的。如果你有一个修复,请写在评论中,或者,如果你有足够的信心,只是编辑脚本与确切的修复。

根据@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/

工作解决方案Ubuntu使用Android Studio 下面是Ubuntu和Debian的工作过程,比如linux:

    在他们的网站上描述安装Android studio 李https://developer.android.com/studio/install < / >
  1. 运行:flutter config --android-studio-dir <location of android studio>然后flutter config --android-sdk /home/user/Android/Sdk(这是SDK的默认位置)
  2. 将bin添加到你的PATH PATH=$PATH:/home/user/Android/Sdk/tools/bin/
  3. 之后,运行:flutter doctor --android-licenses并接受所有许可证 要检查是否一切正常,以verbose模式运行doctor,如下所示:flutter doctor -v

简单的解决方案:

  1. 打开Android Studio工具菜单,
  2. SDK Manager在弹出的窗口中 上面是内面板,
  3. 选择SDK工具面板勾选Android SDK命令行工具
  4. 选择窗口底部附近的Apply按钮

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

enter image description here

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

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

由于有新的更新,文档中没有提到一些更改。在解压缩命令行工具包之后,您将得到的最上面的目录是cmdline-tools。将解压缩目录从cmdline-tools重命名为tools,并将其放在$C:/Android/cmdline-tools下

现在它看起来像$C:/Android/cmdline-tools/tools

它会完美地工作。