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

同样的问题,通过谷歌来的。 根据AndroidStudio Archive,今天是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

同时,将毛毯许可接收命令移动到第一个命令,清理回滚部分。

奇怪的是,如果你运行sdkmanager——sdk_root=${ANDROID_HOME} "tools",它会把工具从3.6.0升级到26.1.1,sdkmanager就不再有这个问题了。这个更新需要花费时间和带宽,对于解决方案来说并不是完全必要的。


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


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

1 -将命令行工具提取到如下结构的文件夹: 例如:$ HOME /开发/ android / cmdline-tools /最新 (此文件夹必须包含lib, bin, notice.txt和source.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命令行工具的人,请执行以下操作:

Download latest Command line tools from android i.e. commandlinetools-win-6200805_latest.zip Unzip the downloaded file Create directory for storing commandline tools somewhere on your disk, with following path included: android/cmdline-tools/latest Basically when You unzip this Cmd line tools, just rename tools directory to latest and make sure You put this latest folder in android/cmdline-tools directory somewhere on your disk Create ANDROID_HOME environment variable for directory that stores the cmdline tools directory location like: C:\YourLocationWhereYouStoreTheDirectory\android\cmdline-tools\latest Create new entry in Path environment variable as %ANDROID_HOME%\bin


我想分享一下我的经验。

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

可能会遇到另一个问题-卡在“.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文档中的这一页也很好地解释了解决这个问题的方法,包括以下几点:

在没有Android Studio的情况下安装Android SDK。 “警告:无法创建设置”和“java.lang.IllegalArgumentException”的解决方案 Android Studio 3.6或更新版本的诀窍。 关于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操作系统,所以如果你不是,你应该适应一些说明。

Install Android-SDK. sudo apt install android-sdk After the instalation you will have a folder called android-sdk in /usr/lib Create a folder called cdmline-tools inside the android-sdk folder sudo mkdir /usr/lib/android-sdk/cmdline-tools Download the Android command line tools zip from here (https://developer.android.com/studio?hl=en-419#downloads) Unpack the file you just downloaded inside /usr/lib/android-sdk/cmdline-tools sudo unzip /path/for/commandlinetools-linux-6200805_latest.zip -d /usr/lib/android-sdk/cmdline-tools Go to you home dir and edit your .profile nano .profile Create an ANDROID_SDK_ROOT variable export ANDROID_SDK_ROOT=/usr/lib/android-sdk Put the sdkmanager folder in your path export PATH=$ANDROID_SDK_ROOT/cmdline-tools/tools/bin:$PATH Save and Exit Reload you profile . ~/.profile Run sdkmanager --version

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


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

Starting from Android SDK Command-line Tools 1.0.0 (6200805), in contrast to Android SDK 26.1.1 (4333796), the tools directory hierarchy has been changed. Previously it was placed right inside ANDROID_HOME (which is deprecated, we will use the term ANDROID_SDK_ROOT for the rest of the paragraph), now it's still named as tools (the only thing you'll get after unpacking the downloaded commandlinetools zip file), but differently, you have to place it inside a directory called cmdline-tools on your own. The name cmdline-tools comes from its package name, where you can get from listing packages command sdkmanager --list, whose outputs include cmdline-tools;1.0 | 1.0 | Android SDK Command-line Tools.

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

这就是你要改变的。让我解释更多。

The king - sdkmanager lives inside cmdline-tools/tools/bin, you'd better set in PATH environment variable cmdline-tools should not be set as ANDROID_SDK_ROOT. Because later, when updating Android SDK, or installing more packages, the other packages will be placed under ANDROID_SDK_ROOT, but not under cmdline-tools. The final, complete ANDROID_SDK_ROOT directory structure should look like below, consist of quite a few sub-directories: build-tools, cmdline-tools, emulator, licenses, patcher, platform-tools, platforms, system-images. You can easily point out that build-tools and cmdline-tools are siblings, all sit inside the 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)以来,行为再次发生了变化:

After unzipping the package, the top-most directory you'll get is cmdline-tools. Rename the unpacked directory from cmdline-tools to tools, and place it under $ANDROID_SDK_ROOT/cmdline-tools, so now it should look like: $ANDROID_SDK_ROOT/cmdline-tools/tools. And inside it, you should have: NOTICE.txt bin lib source.properties. Actually according to the official Command-Line Tools doc, the tree structure should be android_sdk/cmdline-tools/version/bin/, but I've checked, using version or tools makes no difference here. For your environment variable PATH, I would recommend you to set like this: PATH=$PATH:$ANDROID_SDK_ROOT/cmdline-tools/latest/bin:$ANDROID_SDK_ROOT/cmdline-tools/tools/bin, because after update later, you'll get the latest sdkmanager placed under $ANDROID_SDK_ROOT/cmdline-tools/latest/bin, put it in front will make it higher priority.


安装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/解决了这个问题

简化答案:

用notepad++打开sdkmanager.bat 将这一行从 "%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/version/bin/”;

因此,在Windows操作系统中解决此问题(其他操作系统也一样),请执行以下操作:

在android_sdk文件夹中,创建文件夹:cmdline-tools,并在其中创建另一个文件夹:version extract / put all your files "/bin /lib注意和源代码。此版本文件夹中的“属性”文件。 将ANDROID_HOME设置为android_sdk文件夹。 添加到系统路径:android_sdk\cmdlineAndroidSDK\cmdline-tools\version\bin\

类似地,将Android SDK平台工具放在android_sdk/ Platform - Tools /中,并在系统变量下的环境变量中添加相应的PATH


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

It just requires bsdtar to be installed (it's usually packaged in popular distributions). Android platform/build tools version 29 are installed, and Android sdk root will be then located in /opt/android. While this setup works for me without warnings as it is, I have an issue when reinstalling packages already installed, or possibly installing different version of the packages: it clashes with packages already present and create bogus directories in the sdk root, with -2, -3 suffixes. These directories are then ignored, and warnings like Observed package id 'emulator' in inconsistent location are printed, so this behavior is definitely not desirable. If you have a fix for that please write it in the comments or, if you are confident enough, just edit the script with the exact fix.


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

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

install Android studio as desribed in their website https://developer.android.com/studio/install run : flutter config --android-studio-dir <location of android studio> then flutter config --android-sdk /home/user/Android/Sdk (this is the default location of the SDK) add the bin to your PATH PATH=$PATH:/home/user/Android/Sdk/tools/bin/ Afterwards, run : flutter doctor --android-licenses and accept all licences To check if everything is ok run the doctor in verbos mode as following : flutter doctor -v


简单的解决方案:

打开Android Studio工具菜单, SDK管理器在窗口中出现 上面是内嵌板, 选择SDK工具面板勾选Android SDK命令行工具 选择窗口底部附近的Apply按钮


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


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

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


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

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

它会完美地工作。