如何在 Azure DevOps Pipelines 上指定 Android SDK 构建工具版本

Posted

技术标签:

【中文标题】如何在 Azure DevOps Pipelines 上指定 Android SDK 构建工具版本【英文标题】:How specify an Android SDK Build Tools version on Azure DevOps Pipelines 【发布时间】:2021-10-03 14:34:07 【问题描述】:

我在尝试在 Azure DevOps 中创建 android CI/CD 时遇到了严重问题。结果管道尝试使用最新版本的 BuildTools 来构建 apk,但最新版本 (31.0.0) 似乎有问题。

我想强制 Azure 使用我已经测试过的版本 30.0.3 运行良好。

使用 BuildTools 31.0.0 的 Azure 日志

使用 BuildTools 31.0.0 的本地日志

使用 BuildTools 30.0.0 的本地日志

我正在使用 Ionic 和 cordova 来生成我的 Android 项目,尽管 cordova docs 说它支持 cli 参数来强制构建工具版本。

例如:ionic cordova run android -- --gradleArg=-P cdvBuildToolsVersion=30

它仍然以始终使用安装在 cordovaLib 模块中的最新版本的方式生成

build.gradle [应用模块]

// The value for android.buildToolsVersion.
    if (!project.hasProperty('cdvBuildToolsVersion')) 
        cdvBuildToolsVersion = null;
    

...

compileSdkVersion cdvCompileSdkVersion
buildToolsVersion cdvBuildToolsVersion

build.gradle [cordovaLib 模块]

cdvCompileSdkVersion = privateHelpers.getProjectTarget()
cdvBuildToolsVersion = privateHelpers.findLatestInstalledBuildTools()

...

compileSdkVersion cdvCompileSdkVersion
buildToolsVersion cdvBuildToolsVersion

【问题讨论】:

您能出示您的build.gradle 文件吗?你有定义30.0.3 的版本吗? 对不起@Krzysztof Madej,我忘了告诉你我正在使用 Ionic,它最终会强制使用 Cordova 版本,总是强制你使用最后安装的 Build Tools 版本(我更新了问题)与 findLatestInstalledBuildTools 我正在考虑删除这个问题,因为我意识到这是 Android/Cordova/Ionic 的限制,我相信唯一的出路是用我在这里提到的那个做一个临时的解决方法github.com/apache/cordova-android/issues/… this 表示,问题是 SDK 31+ 与 7.x 下的 AGP 不兼容。如何在 Azure DevOps CI 下更新 AGP? 【参考方案1】:

我找到了一个临时解决方法,似乎对这种情况有意义,如果将来有人遇到这种类型的问题,它可能会有用:

只需在管道中添加一个步骤以删除损坏的构建工具,在本例中为 31.0.0

- script: $ANDROID_HOME/tools/bin/sdkmanager --uninstall 'build-tools;31.0.0'
  displayName: 'Workaround'

【讨论】:

Batusta,你为 ANDROID_HOME 设置了什么路径? 它是由 Azure Dev Ops 本身定义的环境变量,在我的情况下,我使用的是 MacOS 机器,因此 ANDROID_HOME 值设置为 /Users/runner/Library/Android/sdk

以上是关于如何在 Azure DevOps Pipelines 上指定 Android SDK 构建工具版本的主要内容,如果未能解决你的问题,请参考以下文章

创建自包含部署时如何解决 Azure Devops Pipeline 中的目标问题

Azure DevOps Build Pipeline:如何仅为更改的程序集增加程序集版本?

在我的 Azure DevOps YAML Pipeline 中,如何将一堆阶段转换为作业矩阵?

Azure Devops Pipeline YAML 中的 Git 标记名称

当我的 linting 脚本返回错误时,如何让我的 Azure DevOps Pipeline 构建失败?

如何在 Azure DevOps 变量组中使用 SecureFile?