gpt4 book ai didi

android - 使用 Square 的 Wire 时出现 D8 异常

转载 作者:太空狗 更新时间:2023-10-29 14:39:19 26 4
gpt4 key购买 nike

添加 Square 的 Wire 后Android 项目中的 Protobuf 支持库,我在编译期间遇到以下 D8 异常:

D8: Program type already present: com.google.protobuf.DescriptorProto$ExtensionRange$ProtoAdapter_ExtensionRange

线路依赖:实现'com.squareup.wire:wire-runtime:2.2.0'

Gradle 的 dependencyInsight 揭示了我项目中的另一个依赖项,它传递地引入了 com.google.protobuf.nano:protobuf-javanano:3.1.0。所以我添加了一个排除:

implementation ('com.google.vr:sdk-base:1.100.0'){
exclude group: 'com.google.protobuf.nano'
}

但这并没有解决问题。

是什么让 D8 悲伤,我怎样才能让它再次快乐?

更新

有问题的设置是:有 3 个模块 ABCA 依赖于 BCBC 都托管在内部 maven 服务器上,它们每个都依赖于具有以下 POM 条目的 wire-runtime:

<dependency>
<groupId>com.squareup.wire</groupId>
<artifactId>wire-runtime</artifactId>
<version>2.3.0-RC1</version>
<scope>compile</scope>
</dependency>

我已经尝试过 Wire 版本 2.2 和 2.3.0。当 A 仅依赖于 B 或仅依赖于 C 时,一切都很好,但是当 A 依赖于两者时,D8 变得很糟糕BC

那么如何依赖多个传递依赖于 Wire 的模块呢?

最佳答案

D8难过的原因

当您运行 Wire code gen 时,它会在您的项目中创建一些 Java 源文件,所有其他 Wire-code 生成的代码都依赖这些文件。 com.google.protobuf.DescriptorProto 就是这样一个文件。因此,当您依赖两个使用 Wire 的模块时,您有两个模块都包含一个具有相同名称和包的 Java 源文件,并以重复的 .class 文件结束。这些 .class 文件是你的库模块打包输出的一部分(不是传递依赖)所以再多的 gradle exclude 也无济于事(除非你知道一些我不知道的 Gradle 恶作剧?...) .

可能的解决方案

在库模块中设置打包选项以包含 java 源代码,这样您仍然可以编译,但在打包 aar 时排除 .class 文件。我试过了,但无法使打包选项真正排除 .class 文件。我对这种方法并不狂热,即使它有效,所以我放弃了它。

(未尝试,可能可行)将 Wire 生成的 com.google.protobuf 源文件 bundle 到您自己的单独库中,以便它们成为传递依赖项。您可能希望在运行 Wire 后编写一个 gradle 任务来处理此过程,以免每次都手动移动这些文件。在您的应用程序中包含上述库的单个副本,并使用 gradle exclude 忽略传递项。

最终,这感觉时间同步太多了,我选择使用 Protobuf Gradle Plugin

关于android - 使用 Square 的 Wire 时出现 D8 异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51073505/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com