kau*_*lex 187 android android-build gitlab-ci android-sdk-manager android-studio-3.6
我使用 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)
Run Code Online (Sandbox Code Playgroud)
我已经尝试过手动执行这些命令,但我遇到了同样的错误。此外,如果我运行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
Run Code Online (Sandbox Code Playgroud)
Jin*_* Li 399
--sdk_root让我们深入研究真正的原因,而不是为每个命令执行传递参数。
从Android SDK 命令行工具 1.0.0 (6200805) 开始,与Android SDK 26.1.1 (4333796) 相比,tools目录层次结构已更改。以前它被放置在内部ANDROID_HOME(已弃用,我们将在ANDROID_SDK_ROOT该段落的其余部分使用该术语),现在它仍然被命名为tools(解压下载的命令行工具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, licenses, patcher, platform-tools, platforms, system-images. 你可以很容易地指出build-tools和cmdline-tools是兄弟姐妹,都坐在 parent 里面ANDROID_SDK_ROOT。让我用简单的方式回顾一下:
ANDROID_SDK_ROOT(就像以前一样)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/,但我已经检查过,使用version或tools在这里没有区别。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,放在前面会使其优先级更高。cal*_*er9 110
这似乎是 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
Run Code Online (Sandbox Code Playgroud)
此外,将一揽子许可证接受命令移至第一个命令以清理echo y部件。
奇怪的是,如果你运行sdkmanager --sdk_root=${ANDROID_HOME} "tools"它会将工具从 3.6.0 升级到 26.1.1 并且 sdkmanager 不再有这个问题。此更新需要时间和带宽,并且对于变通方法并不是完全必要的。
Art*_*urS 41
对于那些在 Windows 10/x64 上为 Appium 安装 Android 命令行工具有困难的人,只需执行以下操作:
小智 25
sdkmanager 尝试根据解压位置找出 android-sdk 路径,而不使用环境变量,如 ANDROID_SDK_ROOT。但情况变得更糟,因为它有一个名为 cmdline-tools 的硬编码父文件夹,如果您将 commandlinetools 解压缩到另一个名称的文件夹中,则它不起作用,迫使我们使用参数 sdk_root 正确提供内部变量。
因此,考虑到这一点,我们可以使用以下方法来解决这个问题。
我假设我们使用的是 Ubuntu 操作系统,所以如果你不是,你应该修改一些说明。
安装 Android-SDK。
sudo apt install android-sdk
Run Code Online (Sandbox Code Playgroud)
安装后,您将在 /usr/lib 中有一个名为 android-sdk 的文件夹
在 android-sdk 文件夹中创建一个名为 cdmline-tools 的文件夹
sudo mkdir /usr/lib/android-sdk/cmdline-tools
Run Code Online (Sandbox Code Playgroud)在/usr/lib/android-sdk/cmdline-tools里面解压刚刚下载的文件
sudo unzip /path/for/commandlinetools-linux-6200805_latest.zip -d /usr/lib/android-sdk/cmdline-tools
Run Code Online (Sandbox Code Playgroud)转到您的主目录并编辑您的 .profile
nano .profile
Run Code Online (Sandbox Code Playgroud)创建一个 ANDROID_SDK_ROOT 变量
export ANDROID_SDK_ROOT=/usr/lib/android-sdk
Run Code Online (Sandbox Code Playgroud)将 sdkmanager 文件夹放在您的路径中
export PATH=$ANDROID_SDK_ROOT/cmdline-tools/tools/bin:$PATH
Run Code Online (Sandbox Code Playgroud)重新加载您的个人资料
. ~/.profile
Run Code Online (Sandbox Code Playgroud)跑
sdkmanager --version
Run Code Online (Sandbox Code Playgroud)您应该会在终端中看到打印的版本。
Dhe*_*j D 24
简单的解决方案:
混合来自 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
[...]
Run Code Online (Sandbox Code Playgroud)
小智 6
我遇到了同样的错误。完成所有解决方案后,我无法修复它。我通过阅读解决了这个问题:https://forum.unity.com/threads/android-build-not-working.844969/
简化一下答案:
sdkmanager.bat通过记事本++打开
更改此行
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %SDKMANAGER_OPTS% -classpath "%CLASSPATH%" com.android.sdklib.tool.sdkmanager.SdkManagerCli %CMD_LINE_ARGS%
Run Code Online (Sandbox Code Playgroud)
到
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %SDKMANAGER_OPTS% -classpath "%CLASSPATH%" com.android.sdklib.tool.sdkmanager.SdkManagerCli %CMD_LINE_ARGS% --sdk_root=%ANDROID_HOME%
Run Code Online (Sandbox Code Playgroud)
(注:--sdk_root=%ANDROID_HOME%最后添加
遇到同样的问题,谷歌来到这里。根据AndroidStudio Archive,今天是 4.1 的发布。我想这不是巧合。
这个完全不相关的指南有一个旧版sdk-tools for linux的硬链接。对于其他操作系统,您可以将 url 更改为 windows 或 mac。我现在将其用作修补程序。
(这应该是评论而不是解决方案)
小智 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"
Run Code Online (Sandbox Code Playgroud)
3 - 在PATH上加载它:
PATH="$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/tools/lib:$ANDROID_HOME/tools/bin:$ANDROID_HOME/platform-tools"
Run Code Online (Sandbox Code Playgroud)
在这里总结了几篇有用的帖子,对于想要快速片段的人,例如插入 a 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
Run Code Online (Sandbox Code Playgroud)
它只需要bsdtar安装(它通常打包在流行的发行版中)。Android 平台/构建工具版本 29 已安装,Android sdk 根目录将位于/opt/android. 虽然此设置对我来说没有警告,但在重新安装已安装的软件包或可能安装不同版本的软件包时遇到问题:它与已存在的软件包发生冲突,并在 sdk 根目录中创建带有 , 后缀的虚假-2目录-3。然后这些目录将被忽略,并Observed package id 'emulator' in inconsistent location打印类似的警告,因此这种行为绝对是不可取的。如果您有解决方案,请在评论中写下,或者,如果您有足够的信心,只需使用确切的解决方案编辑脚本即可。
| 归档时间: |
|
| 查看次数: |
106473 次 |
| 最近记录: |