我使用了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
答案 0 :(得分:333)
让我们深入探讨真正的原因,而不是为每次执行单个命令都传递参数--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
参数。但是其他部分呢?
好吧,这就是您需要更改的所有内容。让我解释更多。
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
,{{1} },licenses
,patcher
,platform-tools
,platforms
。您可以轻松指出system-images
和build-tools
是兄弟姐妹,都位于父cmdline-tools
内。让我以简单的方式回顾一下:
ANDROID_SDK_ROOT
(就像以前一样)ANDROID_SDK_ROOT
的目录中,该目录位于cmdline-tools
内ANDROID_SDK_ROOT
附加到环境变量$ANDROID_SDK_ROOT/cmdline-tools/tools/bin
,以便系统知道在何处找到PATH
!!更新!!
自构建sdkmanager
(Android SDK命令行工具3.0)以来,行为再次发生了变化:
6858069
。cmdline-tools
重命名为cmdline-tools
,并将其放在tools
下,因此现在看起来应该像:$ANDROID_SDK_ROOT/cmdline-tools
。在其中,您应该具有:$ANDROID_SDK_ROOT/cmdline-tools/tools
。实际上,根据official Command-Line Tools doc,树结构应为NOTICE.txt bin lib source.properties
,但我已经检查过,使用android_sdk/cmdline-tools/version/bin/
或version
在这里没有什么区别。tools
,我建议您这样设置:PATH
,因为稍后进行更新后,您将获得位于{{1}下的最新PATH=$PATH:$ANDROID_SDK_ROOT/cmdline-tools/latest/bin:$ANDROID_SDK_ROOT/cmdline-tools/tools/bin
},放在最前面会使其具有更高的优先级。答案 1 :(得分:109)
这似乎是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不再有此问题。此更新需要时间和带宽,对于解决方法并非完全必要。
答案 2 :(得分:40)
对于那些在Windows 10 / x64上为Appium安装Android命令行工具感到困扰的人,请执行以下操作:
答案 3 :(得分:23)
sdkmanager尝试根据解压缩的位置来找出android-sdk路径,而不使用环境变量,例如ANDROID_SDK_ROOT。但情况变得更糟,因为它有一个名为cmdline-tools的硬编码父文件夹,并且如果您在另一个名称的文件夹中解压缩commandlinetools则无法正常工作,从而迫使我们使用参数sdk_root正确输入内部变量。 / p>
因此,考虑到这一点,我们可以使用以下方法来解决此问题。
我将假定我们使用的是Ubuntu OS,因此,如果您未使用Ubuntu OS,则应改编其中的一些说明。
安装Android-SDK。
sudo apt install android-sdk
安装后,您将在/ usr / lib中有一个名为android-sdk的文件夹
在android-sdk文件夹中创建一个名为cdmline-tools的文件夹
sudo mkdir /usr/lib/android-sdk/cmdline-tools
解压缩刚刚在/ usr / lib / android-sdk / cmdline-tools内部下载的文件
sudo unzip /path/for/commandlinetools-linux-6200805_latest.zip -d /usr/lib/android-sdk/cmdline-tools
转到您的主目录并编辑您的.profile
nano .profile
创建ANDROID_SDK_ROOT变量
export ANDROID_SDK_ROOT=/usr/lib/android-sdk
将sdkmanager文件夹放入您的路径
export PATH=$ANDROID_SDK_ROOT/cmdline-tools/tools/bin:$PATH
重新加载个人资料
. ~/.profile
运行
sdkmanager --version
您应该会在终端中看到打印的版本。
答案 4 :(得分:22)
从Android Developer网站下载新的cmdline-tools需要遵循以下目录结构。
答案 5 :(得分: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
[...]
答案 6 :(得分:5)
我找到了按照以下步骤使用最新命令行工具的解决方案:
1-将命令行工具提取到具有以下结构的文件夹中:
例如:$HOME/Development/android/cmdline-tools/latest
(此文件夹必须包含 lib , bin , notice.txt 和 source.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"
答案 7 :(得分:5)
Google也遇到了同样的问题。 根据{{3}},今天是4.1版本。 我想那不是巧合。
此AndroidStudio Archive具有一个较旧版本的completely unrelated guide的硬链接。 您可以将其他操作系统的URL更改为Windows或Mac。我现在将其用作修补程序。
(本来应该是评论,而不是解决方案)
答案 8 :(得分:3)
我想分享我的经验。
首先,我尝试解释为什么必须查看目录结构 此答案中显示的方式-https://stackoverflow.com/a/60460681/1758733。 https://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.
一个人可能遇到另一个问题-Stuck at ".android/repositories.cfg could not be loaded."
其他问题和事实:
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
答案 9 :(得分:3)
我遇到了同样的错误。在完成所有解决方案后,我无法修复它。我通过阅读:https://forum.unity.com/threads/android-build-not-working.844969/
解决了这个问题简化答案:
"%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%
答案 10 :(得分:3)
在这里总结了几个有用的帖子,对于想要快速片段的人,例如插入 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 根目录中创建虚假目录,{{1 }}, -2
后缀。然后这些目录将被忽略,并打印 -3
之类的警告,因此这种行为绝对不可取。如果您对此有修复,请写在评论中,或者,如果您有足够的信心,只需使用准确的修复来编辑脚本。
答案 11 :(得分:2)
在新Mac上下载standalone command line tools(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的捆绑软件的一部分。
答案 12 :(得分:2)
Android SDK工具现在位于以下位置:“ android_sdk / cmdline-tools / version / bin / ”;
因此,要在 Windows 中解决此问题(可以在其他操作系统中复制相同的内容),请执行以下操作:
在您的android_sdk
文件夹中,创建文件夹:cmdline-tools
,并在其中创建另一个文件夹:version
提取/将所有文件“ / bin / lib注意和来源” “ .properties”文件放在此version
文件夹中。
将ANDROID_HOME
设置到您的android_sdk
文件夹中。
android_sdk\cmdlineAndroidSDK\cmdline-tools\version\bin\
类似地,将您的 Android SDK平台工具放入android_sdk/platform-tools/
内,并将相应的PATH
添加到ENVIRONMENTAL VARIABLES
下的System Variables
答案 13 :(得分: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/
答案 14 :(得分:1)
Unity 2018文档中的此页面也很好地解决了此问题,其中包括:
https://docs.unity3d.com/2018.4/Documentation/Manual/android-sdksetup.html
答案 15 :(得分:1)
answer by jing-li works for me 让我们深入研究真正的原因,而不是为每个命令执行都传递参数--sdk_root。
从Android SDK命令行工具1.0.0(6200805)开始,与Android SDK 26.1.1(4333796)相比,工具目录层次结构已更改。以前它被放置在ANDROID_HOME内,现在仍被命名为工具(解压缩下载的commandlinetools zip文件后唯一得到的东西),但是不同的是,您必须自己将其放置在名为cmdline-tools的目录中。名称cmdline-tools来自其软件包名称,您可以从列出软件包命令sdkmanager --list获得该名称,其输出包括cmdline-tools; 1.0 | 1.0 | Android SDK命令行工具。
在cmdline-tools目录中包装tools目录将使其工作,并帮助您摆脱烦人的--sdk_root参数。但是其他部分呢?
答案 16 :(得分:0)
使用 Android Studio 的 Ubuntu 工作解决方案 这是 Ubuntu 和 Debian like linux 的工作过程:
flutter config --android-studio-dir <location of android studio>
然后 flutter config --android-sdk /home/user/Android/Sdk
(这是 SDK 的默认位置)PATH=$PATH:/home/user/Android/Sdk/tools/bin/
flutter doctor --android-licenses
并接受所有许可
要检查一切是否正常,请在详细模式下运行医生,如下所示:flutter doctor -v
答案 17 :(得分:0)
如果您同时使用Linux,并且不想让复杂的解决方法陷入困境,建议您下载并使用the Snap version of sdkmanager。
请记住在终端中使用androidsdk
而不是sdkmanager
。
答案 18 :(得分:0)
安装SDK(任何方法)的首要要求是安装 Java 并设置 JAVA_HOME 路径。
然后,SDK命令行工具需要安装路径,否则安装路径将引发NullPointerException。
要解决此问题,只需在参数“ --sdk_root”中通过您要安装SDK的路径即可
例如。sdkmanager.bat“ platform-tools”“ platforms; android-” --sdk_root =
答案 19 :(得分:-1)
在安装命令行工具时,即使不是用于开发应用程序的编辑器,Android Studio也是必需的。取消选中过时的包选项卡并下载工具即可;可以解决许可证问题,您可以返回自己喜欢的IDE(例如VS Code)。