Android gradle 在 ADO 上的 ubuntu 代理上构建失败但在 Windows 上编译,macos

Android gradle build fails on ubuntu agents on ADO but compiles on Windows, macos

这几天我一直在摸不着头脑。

我在 java 11 中使用 gradle 任务构建了一个 azure-pipeline yaml,它在 macos MS 托管代理上 运行 并且构建完美,但是为了性能和成本我们要切换到 ubuntu 代理的原因。切换构建失败并出现以下错误时:

> Task :app:compileStagingDebugKotlin FAILED
e: /home/vsts/work/1/s/app/src/main/java/org/xxx/xxxxx/profile/contactInfo/xxxxFragment.kt: (305, 59): Unresolved reference: xxxxxxFragmentMenu

xxxxFragmentmenu 是对导航菜单的引用 (androidx.navigation)(抱歉我不是 android 开发人员)。

问题是,如果我使用 windows 代理和 macos 代理,它就可以正常工作。我能看到的 MS 托管代理功能之间唯一显着的区别是 ubuntu 上的 jdk 版本比 v11

版本稍微落后一点

我还在 ubuntu 20.0.4 上创建了一个虚拟机,安装了 android studio,并且能够成功编译变体 AssembleStagingDebug。 这个变体确实正在 Windows 和 MacOs 上编译,下面是一个用 macos 成功编译的例子。

> Task :app:compileStagingDebugKotlin
w: Flag is not supported by this version of the compiler: -Xallow-jvm-ir-dependencies
w: ATTENTION!
This build uses unsafe internal compiler arguments:
w: /Users/runner/work/1/s/app/src/main/java/org/xxx/xxx/profile/documents/documentation/DocumentationViewModel.kt: (196, 25): Unchecked cast: Any? to List<TrustCategory>
w: /Users/runner/work/1/s/app/src/main/java/org/xxx/xxx/profile/documents/documentation/DocumentationViewModel.kt: (265, 25): Unchecked cast: Any? to List<TrustDocumentInfo>
w: /Users/runner/work/1/s/app/src/main/java/org/xxx/xxx/profile/documents/documentation/DocumentationViewModel.kt: (390, 25): Unchecked cast: Any? to List<TrustDocumentShared>
w: /Users/runner/work/1/s/app/src/main/java/org/xxx/xxx/profile/documents/proofOfIdentity/ProofOfIdentityViewModel.kt: (65, 25): Unchecked cast: Any? to List<TrustPvid>
w: /Users/runner/work/1/s/app/src/main/java/org/xxx/xxx/splash/FragmentSplash.kt: (67, 13): The expression is unused
w: /Users/runner/work/1/s/app/src/main/java/org/xxx/xxx/util/LocaleUtil.kt: (22, 19): 'updateConfiguration(Configuration!, DisplayMetrics!): Unit' is deprecated. Deprecated in Java
w: /Users/runner/work/1/s/app/src/main/java/org/xxx/xxx/util/file/UriUtils.kt: (31, 34): Variable 'selection' initializer is redundant
w: /Users/runner/work/1/s/app/src/main/java/org/xxx/xxx/util/file/UriUtils.kt: (32, 45): Variable 'selectionArgs' initializer is redundant
w: /Users/runner/work/1/s/app/src/main/java/org/xxx/xxx/util/file/UriUtils.kt: (73, 60): 'getExternalStorageDirectory(): File!' is deprecated. Deprecated in Java
w: /Users/runner/work/1/s/app/src/main/java/org/xxx/xxx/util/file/UriUtils.kt: (220, 36): 'getExternalStorageDirectory(): File!' is deprecated. Deprecated in Java
w: /Users/runner/work/1/s/app/src/main/java/org/xxx/xxx/util/file/UriUtils.kt: (225, 20): Unsafe use of a nullable receiver of type String?
w: /Users/runner/work/1/s/app/src/main/java/org/xxx/xxx/util/file/UriUtils.kt: (229, 20): Unsafe use of a nullable receiver of type String?
w: /Users/runner/work/1/s/app/src/main/java/org/xxx/xxx/util/file/UriUtils.kt: (243, 17): Variable 'size' is never used
w: /Users/runner/work/1/s/app/src/main/java/org/xxx/xxx/util/file/UriUtils.kt: (258, 28): Variable 'read' initializer is redundant
w: /Users/runner/work/1/s/app/src/main/java/org/xxx/xxx/util/file/test/RealPathUtil.kt: (9, 24): 'CursorLoader' is deprecated. Deprecated in Java
w: /Users/runner/work/1/s/app/src/main/java/org/xxx/xxx/util/file/test/RealPathUtil.kt: (31, 52): 'DATA: String' is deprecated. Deprecated in Java
w: /Users/runner/work/1/s/app/src/main/java/org/xxx/xxx/util/file/test/RealPathUtil.kt: (34, 28): 'constructor CursorLoader(Context!, Uri!, Array<(out) String!>!, String!, Array<(out) String!>!, String!)' is deprecated. Deprecated in Java
w: /Users/runner/work/1/s/app/src/main/java/org/xxx/xxx/util/file/test/RealPathUtil.kt: (34, 28): 'CursorLoader' is deprecated. Deprecated in Java
w: /Users/runner/work/1/s/app/src/main/java/org/xxx/xxx/util/file/test/RealPathUtil.kt: (35, 35): 'loadInBackground(): Cursor!' is deprecated. Deprecated in Java
w: /Users/runner/work/1/s/app/src/main/java/org/xxx/xxx/util/file/test/RealPathUtil.kt: (38, 84): 'DATA: String' is deprecated. Deprecated in Java
w: /Users/runner/work/1/s/app/src/main/java/org/xxx/xxx/util/file/test/RealPathUtil.kt: (69, 40): 'getExternalStorageDirectory(): File!' is deprecated. Deprecated in Java
w: /Users/runner/work/1/s/app/src/main/java/org/xxx/xxx/util/file/test/RealPathUtil.kt: (77, 44): 'getExternalStorageDirectory(): File!' is deprecated. Deprecated in Java
w: /Users/runner/work/1/s/app/src/main/java/org/xxx/xxx/util/file/test/RealPathUtilExts.kt: (54, 73): 'DATA: String' is deprecated. Deprecated in Java
w: /Users/runner/work/1/s/app/src/main/java/org/xxx/xxx/util/file/test/RealPathUtilExts.kt: (73, 71): Type mismatch: inferred type is String? but String was expected
w: /Users/runner/work/1/s/app/src/main/java/org/xxx/xxx/util/file/test/URIPathHelper.kt: (27, 40): 'getExternalStorageDirectory(): File!' is deprecated. Deprecated in Java

> Task :app:compileStagingDebugJavaWithJavac

为了尝试进一步调试并排除这是针对 gradle 任务的可能性,我还尝试通过调用 ./gradlew clean AssembleStagingDebug --scan 的 bash 脚本进行编译,该脚本有效在本地但不在 ubuntu 代理上。

android sdk 已安装并可用,我们使用的是 30.0.3,其他一切似乎都一样。

这是什么原因造成的?我们真的很想获得 Ubuntu 代理。提前致谢。

编辑:

我查看了导航图 xml 文件和 Azure DevOps ubuntu 代理中生成的文件,这与使用 macOs 时不同 未生成一个导航操作节点...

我还尝试通过使用与 Azure DevOps 上的 ubuntu 代理相同的 jdk 和 sdk 来最接近代理开发环境: 打开jdk 版本“11.0.14.1” 2022-02-08 OpenJDK 运行环境 Temurin-11.0.14.1+1 (build 11.0.14.1+1) OpenJDK 64 位服务器 VM Temurin-11.0.14.1+1(构建 11.0.14.1+1,混合模式) javac 11.0.14.1

但仍然无法在本地重现相同的行为。

现在有人知道如何解决这个问题吗?

编辑 2:

我发现了问题,这是由于具有不同定义的重复片段(相同 ID)的问题。在 Windows 和 Ubuntu 上,与 macOs 相反,生成的文件似乎没有以相同的顺序处理,导致不包含某些操作的覆盖文件。我们进行了临时修复,为共享相同 ID 的所有片段包含相同的定义。现在它适用于所有平台。

我发现了问题,这是由于具有不同定义的重复片段(相同 ID)的问题。在 Windows 和 Ubuntu 上,与 macOs 相反,生成的文件似乎没有以相同的顺序处理,导致不包含某些操作的覆盖文件。我们进行了临时修复,为共享相同 ID 的所有片段包含相同的定义。现在它适用于所有平台。