由于 NDK 版本不兼容,Android 构建在 CI 中失败,但在本地不兼容

Posted

技术标签:

【中文标题】由于 NDK 版本不兼容,Android 构建在 CI 中失败,但在本地不兼容【英文标题】:Android build failed in CI because of NDK version is not compatible, but not locally 【发布时间】:2020-10-15 09:45:49 【问题描述】:

这可能不是您第一次看到这样的问题。我已经研究了一些解释并意识到这与 Gradle 插件没有下载默认版本的 SDK 有关,并且由于在 CI 中您通常设置的机器可能没有安装完全相同的默认版本,那么它会失败。

参考资料:

https://github.com/gradle/gradle/issues/12440 https://github.com/actions/virtual-environments/issues/578 android: No version of NDK matched the requested version

我的问题是最终了解实际发生的情况,我很好奇 如果我什至没有在本地安装任何 NDK 版本,为什么它只在 CI 上失败而不是在本地失败

因此,我运行了与 CI (./gradlew assembleDebug) 中相同的命令,但最终只得到了这样的警告(构建成功):

> Task :app:stripDebugDebugSymbols UP-TO-DATE
WARNING: Compatible side by side NDK version was not found for android.ndkVersion '21.3.6528147'
Compatible side by side NDK version was not found for android.ndkVersion '21.3.6528147'

但是,CI 中的相同命令最终会得到以下结果:

2020-06-25T01:45:32.2616030Z > Task :app:mergeDebugNativeLibs
2020-06-25T01:45:32.3617430Z > Task :app:stripDebugDebugSymbols FAILED
2020-06-25T01:45:32.7615428Z 
2020-06-25T01:45:32.7615773Z > Task :app:mergeExtDexDebug
2020-06-25T01:45:32.7657658Z FAILURE: Build failed with an exception.
2020-06-25T01:45:32.7658080Z 
2020-06-25T01:45:32.7658405Z * What went wrong:
2020-06-25T01:45:32.7659460Z Execution failed for task ':app:stripDebugDebugSymbols'.
2020-06-25T01:45:32.7659848Z > No version of NDK matched the requested version 21.0.6113669. Versions available locally: 21.3.6528147
2020-06-25T01:45:32.7660128Z 
2020-06-25T01:45:32.7660439Z * Try:
2020-06-25T01:45:32.7661003Z Run with --info or --debug option to get more log output. Run with --scan to get full insights.
2020-06-25T01:45:32.7661296Z 
2020-06-25T01:45:32.7661602Z * Exception is:
2020-06-25T01:45:32.8621953Z org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':app:stripDebugDebugSymbols'.
2020-06-25T01:45:32.8622201Z 148 actionable tasks: 148 executed

所以,我想了解有什么区别,或者什么会导致 CI​​ 的行为与我的本地设置不同。

我的本​​地设置:

    OSX Catalina 10.15.4 未安装 SDK Android Studio 4.0

CI 配置:

    GitHub Actions Android (ubuntu-18.04)

项目配置:

    Gradle Android 插件:4.0.0 Gradle 版本(使用 wrapper 确保两个命令以相同版本执行):6.1.1 构建工具:29.0.3

欢迎任何建议,提前谢谢!

【问题讨论】:

【参考方案1】:

这是https://issuetracker.google.com/148189425。

选择 NDK 的逻辑已更改,以使构建更具可重复性。进行了更改以放宽当 NDK 仅用于剥离依赖项时,但它仅在 no 安装 NDK 时才错误地放宽限制。

至于如何解决您的问题,只需将 android.ndkVersion 设置为 build.gradle 中 CI 上可用的任何内容。

【讨论】:

非常感谢您,先生。是的,我实际上能够修复它,但对奇怪的行为感到好奇,并正在寻找一个最终消除我所有这些小顾虑的解释。您的回答准确地解释了我在寻找什么,现在整个上下文对我来说很清楚,感谢您的帮助! 根据最近更新的bug应该在4.2中修复。【参考方案2】:

./gradlew clean

在 react native 项目的 android 文件夹中运行上述命令

选择 NDK 的逻辑已更改,以使构建更具可重复性。进行了更改以放宽当 NDK 仅用于剥离依赖项时,但它仅在未安装 NDK 时才错误地放宽限制。

至于如何解决您的问题,只需将 android.ndkVersion 设置为 build.gradle 中 CI 上可用的任何内容

【讨论】:

以上是关于由于 NDK 版本不兼容,Android 构建在 CI 中失败,但在本地不兼容的主要内容,如果未能解决你的问题,请参考以下文章

Android踩坑小记:ndk版本与Android Gradle Plugin版本兼容

Android踩坑小记:ndk版本与Android Gradle Plugin版本兼容

Android踩坑小记:ndk版本与Android Gradle Plugin版本兼容

由于 NDK 路径中的反斜杠,Qt Creator 无法构建 Android 库

[Android-NDK编译] ndk 编译 c++ 兼容性问题汇总整理

使用ninja -C out/Release指令编译安卓Webrtc的SDK报错找不到android ndk处理方式