AzureDevOps Android Pipeline zipalign - 失败,退出代码为 1

Posted

技术标签:

【中文标题】AzureDevOps Android Pipeline zipalign - 失败,退出代码为 1【英文标题】:AzureDevOps Android Pipeline zipalign - failed with exit code 1 【发布时间】:2021-02-11 01:40:59 【问题描述】:

我不确定发生了什么,过去在 Azure Devops 中使用我们的管道构建的一切都很好。

但就在最近,我们发现每个构建在压缩对齐时都失败了......使用 android Studio IDE 时,APK zipalign 和构建都很好,但在 Azure Devops 管道中却失败了。

这是来自 Azure 的 zipalign 的开始:

Starting: AndroidSigning
==============================================================================
Task         : Android signing
Description  : Sign and align Android APK files
Version      : 3.176.0
Author       : Microsoft Corporation
Help         : https://docs.microsoft.com/azure/devops/pipelines/tasks/build/android-signing
==============================================================================
"C:\Program Files (x86)\Android\android-sdk\build-tools\29.0.2\zipalign.exe" -v 4 D:\a\1\s\app\build\outputs\apk\release\app-release-unsigned.apk.unaligned D:\a\1\s\app\build\outputs\apk\release\app-release-unsigned.apk
Verifying alignment of D:\a\1\s\app\build\outputs\apk\release\app-release-unsigned.apk (4)...

这是最后的失败信息:

Verification FAILED
##[error]Error: The process 'C:\Program Files (x86)\Android\android-sdk\build-tools\29.0.2\zipalign.exe' failed with exit code 1

最后,这是我们管道 YAML 的上下文:

trigger:
- master

pool:
  vmImage: 'windows-latest'

steps:
- task: Gradle@2
  inputs:
    workingDirectory: ''
    gradleWrapperFile: 'gradlew'
    gradleOptions: '-Xmx5120m -XX:MaxPermSize=512m -XX:+HeapDumpOnOutOfMemoryError -Dfile.encoding=UTF-8'
    publishJUnitResults: false
    testResultsFiles: '**/TEST-*.xml'
    tasks: 'assembleRelease'

- task: AndroidSigning@3
  inputs:
    apkFiles: '**/*.apk'
    apksign: true
    apksignerFile: C:\Program Files (x86)\Android\android-sdk\build-tools\29.0.2\apksigner.bat
    apksignerKeystoreFile: 'keystore.jks'
    apksignerKeystorePassword: '$(jarsignerKeystorePassword)'
    apksignerKeystoreAlias: 'alias'
    apksignerKeyPassword: '$(jarsignerKeyPassword)'
    apksignerArguments: --out $(Build.SourcesDirectory)/app/build/outputs/apk/release/app.apk
    zipalign: true
    zipalignFile: C:\Program Files (x86)\Android\android-sdk\build-tools\29.0.2\zipalign.exe

任何帮助将不胜感激!

编辑: 这是构建失败发布工件的调试日志,当设置为 AndroidSigning@2(jarsigner 而不是 apksigner)

2020-11-02T15:49:43.9428841Z ##[debug]Evaluating condition for step: 'PublishBuildArtifacts'
2020-11-02T15:49:43.9430851Z ##[debug]Evaluating: SucceededNode()
2020-11-02T15:49:43.9431429Z ##[debug]Evaluating SucceededNode:
2020-11-02T15:49:43.9432781Z ##[debug]=> True
2020-11-02T15:49:43.9433320Z ##[debug]Result: True
2020-11-02T15:49:43.9433928Z ##[section]Starting: PublishBuildArtifacts
2020-11-02T15:49:43.9558720Z ==============================================================================
2020-11-02T15:49:43.9559237Z Task         : Publish build artifacts
2020-11-02T15:49:43.9559565Z Description  : Publish build artifacts to Azure Pipelines or a Windows file share
2020-11-02T15:49:43.9559869Z Version      : 1.158.3
2020-11-02T15:49:43.9560103Z Author       : Microsoft Corporation
2020-11-02T15:49:43.9560457Z Help         : https://docs.microsoft.com/azure/devops/pipelines/tasks/utility/publish-build-artifacts
2020-11-02T15:49:43.9560873Z ==============================================================================
2020-11-02T15:49:43.9627178Z ##[debug]Using node path: C:\agents\2.175.2\externals\node\bin\node.exe
2020-11-02T15:49:44.1659280Z ##[debug]agent.TempDirectory=D:\a\_temp
2020-11-02T15:49:44.1690792Z ##[debug]loading inputs and endpoints
2020-11-02T15:49:44.1701762Z ##[debug]loading ENDPOINT_AUTH_PARAMETER_SYSTEMVSSCONNECTION_ACCESSTOKEN
2020-11-02T15:49:44.1714168Z ##[debug]loading ENDPOINT_AUTH_SCHEME_SYSTEMVSSCONNECTION
2020-11-02T15:49:44.1717582Z ##[debug]loading ENDPOINT_AUTH_SYSTEMVSSCONNECTION
2020-11-02T15:49:44.1719830Z ##[debug]loading INPUT_ARTIFACTNAME
2020-11-02T15:49:44.1721291Z ##[debug]loading INPUT_ARTIFACTTYPE
2020-11-02T15:49:44.1722675Z ##[debug]loading INPUT_PARALLEL
2020-11-02T15:49:44.1723961Z ##[debug]loading INPUT_PARALLELCOUNT
2020-11-02T15:49:44.1725345Z ##[debug]loading INPUT_PATHTOPUBLISH
2020-11-02T15:49:44.1729968Z ##[debug]loading SECRET_JARSIGNERKEYPASSWORD
2020-11-02T15:49:44.1732034Z ##[debug]loading SECRET_JARSIGNERKEYSTOREPASSWORD
2020-11-02T15:49:44.1733774Z ##[debug]loading SECRET_SYSTEM_ACCESSTOKEN
2020-11-02T15:49:44.1739927Z ##[debug]loaded 11
2020-11-02T15:49:44.1753983Z ##[debug]Agent.ProxyUrl=undefined
2020-11-02T15:49:44.1755481Z ##[debug]Agent.CAInfo=undefined
2020-11-02T15:49:44.1756003Z ##[debug]Agent.ClientCert=undefined
2020-11-02T15:49:44.1756464Z ##[debug]Agent.SkipCertValidation=undefined
2020-11-02T15:49:44.1769886Z ##[debug]check path : D:\a\_tasks\PublishBuildArtifacts_2ff763a7-ce83-4e1f-bc89-0ae63477cebe\1.158.3\task.json
2020-11-02T15:49:44.1771713Z ##[debug]adding resource file: D:\a\_tasks\PublishBuildArtifacts_2ff763a7-ce83-4e1f-bc89-0ae63477cebe\1.158.3\task.json
2020-11-02T15:49:44.1772325Z ##[debug]system.culture=en-US
2020-11-02T15:49:44.1792494Z ##[debug]PathtoPublish=D:\a\1\a\app\build\outputs\apk\release\
2020-11-02T15:49:44.1793208Z ##[debug]check path : D:\a\1\a\app\build\outputs\apk\release\
2020-11-02T15:49:44.1821823Z ##[debug]task result: Failed
2020-11-02T15:49:44.1857082Z ##[error]Publishing build artifacts failed with an error: Not found PathtoPublish: D:\a\1\a\app\build\outputs\apk\release\
2020-11-02T15:49:44.1867823Z ##[debug]Processed: ##vso[task.issue type=error;]Publishing build artifacts failed with an error: Not found PathtoPublish: D:\a\1\a\app\build\outputs\apk\release\
2020-11-02T15:49:44.1869433Z ##[debug]Processed: ##vso[task.complete result=Failed;]Publishing build artifacts failed with an error: Not found PathtoPublish: D:\a\1\a\app\build\outputs\apk\release\
2020-11-02T15:49:44.1890809Z ##[section]Finishing: PublishBuildArtifacts

【问题讨论】:

嗨@buradd,你可以试试AndroidSigning@2这个任务,然后在这里分享结果吗?此外,还请在这里分享完整的日志。谢谢 嗨 @VitoLiu-MSFT - 当我将 AndroidSigning@3 更改为 AndroidSigning@2 时,它在预作业期间失败并出现以下错误:##[error]Error: Input required: keystoreFile @VitoLiu-MSFT,我看到 AndroidSigning@2 使用 jarsigner 而不是 apksigner .. 所以我进行了调整,它通过了签名任务,但随后在 PublishBuildArtifacts 上失败 - ##[error]Publishing构建工件失败并出现错误:未找到 PathtoPublish: D:\a\1\a\app\build\outputs\apk\release\ 嗨@buradd,很抱歉这么晚才回复你,你能否将变量system.debug设置为true,然后在这里分享完整的详细日志?我们需要检查日志并帮助您解决问题。谢谢。 @VitoLiu-MSFT 没问题 - 我已经使用 PublishArtifact 的 AndroidSigning@2 调试错误的日志编辑了我的帖子。签名顺利,但是找不到输出文件夹?使用 AndroidSigning@3 时,它没有通过 AndroidSigning 作业,很多检查都以 (BAD - 2)、(BAD - 3) 等形式返回。主要是 /res/ 文件,一切正常使用 AndroidSigning@2 时使用 (OK)。请记住,我们已经使用这条管道很长时间了,并且有许多成功的构建 - 但现在它甚至不会构建我们知道以前使用管道构建良好的旧分支 【参考方案1】:

因此,在 github azure pipelines task issue thread 上反复讨论后,我发现在我的项目级别将我的 Android gradle 插件从 4.1.0+(它在 4.1.1)更改为 4.0.0 gradle.settings,天蓝色管道构建将成功完成。

Gradle 本身保持在 6.5 版本,但 Android gradle 插件设置为 4.0.0 以使其构建成功。

然后,另一个人在 Google 问题跟踪器上指出了这个线程: https://issuetracker.google.com/issues/162117652

从最新的 Android gradle 插件 4.1.0+ 开始,似乎不再需要 zipalign。我猜 Android gradle 插件 4.1.0+ 已经对 apk 进行了 zipalign,因此对 zipalign 的任何后续调用都会显示失败,因为它已经 zipalign。

因此,这里的最终解决方案是保留最新版本的 Android gradle 插件 (4.1.1) 并在我的 Azure 管道 AndroidSigning@3 任务中将 zipalign: true 更改为 zipalign: false

即使在管道中将 zipalign 设置为 false,您也可以通过运行以下命令来检查以确认您的 APK 是否真正进行了 zipalign:

zipalign -c -v 4 /path/to/app-release.apk.

该命令不会尝试修改文件,而是简单地验证 apk 中的压缩并显示验证是否成功(apk 压缩对齐成功)。

【讨论】:

感谢您的回答!这对我帮助很大。

以上是关于AzureDevOps Android Pipeline zipalign - 失败,退出代码为 1的主要内容,如果未能解决你的问题,请参考以下文章

Android -gradle task -Azure devops - Pipeline No toolchains found in the NDK toolchains folder for A

AzureDevops 中的累积流程图 - 按区域路径

AzureDevops-.Net 项目分析与 sonarQube 错误

由于 Xamarin iOS SDK 版本,AzureDevops 构建失败

Flutter AzureDevOps 设置

AzureDevops 项目委员会累积流程图是不是仅限于 180 天的报告?