我使用new command line tools for Android是因为旧的sdk-tools Android存储库已经不可用了.所以我更改了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,同样的错误也会发生.

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

推荐答案

让我们深入探讨真正的原因,而不是 for each 命令执行传递参数--sdk_root.

Android SDK Command-line Tools 1.0.0 (6200805)开始,与Android SDK 26.1.1 (4333796)相反,tools目录层次 struct 已经改变.

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目录 struct 应该如下所示,由许多子目录组成:build-toolscmdline-toolsemulatorlicensespatcherplatform-toolsplatformssystem-images.你可以很容易地指出build-toolscmdline-tools是sibling 姐妹,都坐在父母ANDROID_SDK_ROOT的里面.

让我用一种简单的方式回顾一下:

  • 设定你的首选ANDROID_SDK_ROOT(就像以前一样)
  • 下载commandlinetools zip文件并将其解压到名为cmdline-tools的目录中,该目录位于ANDROID_SDK_ROOT
  • 将目录$ANDROID_SDK_ROOT/cmdline-tools/tools/bin附加到环境变量PATH,以便系统知道在哪里可以找到sdkmanager

!!UPDATE!!

自build 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.实际上根据official Command-Line Tools doc,树 struct 应该是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下面,放在前面会使它具有更高的优先级.

Android相关问答推荐

渠道与共享流有什么区别

listOf(listOf(字符串))在lazyArchitect(lazyStream)中合成

编写视觉转型

如何在Reaction Native中显示Google Map iFrame?

NativeScript在`ns run android`上重复Kotlin类

Jetapck Compose:将Compose BOM更新为最新版本&2024.01.00&Quot;CircularProgressIndicator后出现错误

如何删除Jetpack Compose中的Textfield底线

react 本机生成失败,出现异常.错误:无法确定';<;宏/>;的类型

Kotlin为多个控件设置一个侦听器

更改选定的切换轨道 colored颜色

未解析的引用:视图模型

制作圆形SupportMapFragment

当 Jetpack Compose 中的第一个文本很长时,将省略号添加到第一个文本

如何用jetpack compose实现垂直李克特量表

Android Studio:按下前缀键:切换 Logcat 格式

Kotlin Coroutines 会取代 AsyncTask 吗?

如何使用 Jetpack Compose 在应用程序中实现本地化

Android 应用程序在启动时自动启动

react-native-config 在发布版本中不起作用

EAS 构建失败,错误代码为 1,但 Expo Build 成功,我需要 EAS 构建来删除未使用的包,如 com.segment.analytics.android:analytics