java.lang.RuntimeException:添加 firebase 远程配置时出现重复类 com.google.protobuf.AbstractMessageLite

0xA*_*iHn 8 android kotlin firebase firebase-remote-config

当我添加com.google.firebase:firebase-config:19.1.0使用 firebase 远程配置时出现此问题。

  java.lang.RuntimeException: Duplicate class com.google.protobuf.AbstractMessageLite found in modules protobuf-java-2.5.0.jar (com.google.protobuf:protobuf-java:2.5.0) and protobuf-lite-3.0.1.jar (com.google.protobuf:protobuf-lite:3.0.1)
Run Code Online (Sandbox Code Playgroud)

我已经更新都firebase-analyticsgoogle-play-services到最新版本。但问题仍然存在。但是当我将远程配置更改为旧版本时,18.0.0 or less它工作正常。但我想使用最新版本。我的依赖:

    firebase_analytics       : "com.google.firebase:firebase-analytics:17.2.2",
    fcm                      : "com.google.firebase:firebase-messaging:20.1.0",
    performance              : "com.google.firebase:firebase-perf:19.0.0",
    config                   : "com.google.firebase:firebase-config:19.0.0",
Run Code Online (Sandbox Code Playgroud)

也试图排除下面不起作用:

exclude group: 'com.google.protobuf', module: 'protobuf-lite'
exclude group: 'com.google.protobuf', module: 'protobuf-java'
Run Code Online (Sandbox Code Playgroud)

0xA*_*iHn 14

最后,我解决了这个问题。首先让我们了解这个问题:

protobuf-java并且protobuf-lite是不兼容的包。它们都在com.google.protobuf包中包含类。protobuf-java通常用于桌面和服务器端使用的包(即常规 Java),而protobuf-lite经常用于面向Android 的包。

Firebase 软件包依赖于protobuf-lite. 您项目中的其他内容必须依赖于protobuf-java. 您可以按照以下说明查看依赖项的树视图:https : //stackoverflow.com/a/35235229

排除是解决不兼容性所必需的,但实际上您应该查看您正在使用的任何软件包是否存在特定于 android 的变体,该变体引入了protobuf-java.

要排除导致问题的重复类,请将以下代码添加到您的 build.gradle(应用程序模块)文件中:

android {
    ... 

  configurations { 
      implementation.exclude module:'protobuf-lite' 
  }
}
Run Code Online (Sandbox Code Playgroud)

  • 这导致应用程序崩溃! (2认同)

Kal*_*ani 0

缺失的类是一个已知问题。完整原型和精简原型不能混合;他们使用不同的生成代码。不要依赖 protobuf-java 作为实现依赖项,而是作为 protobuf 依赖项,这将导致 gradle-protobuf-plugin 为 .protos 生成代码。

dependencies {
  ...
  protobuf 'com.google.protobuf:protobuf-java:3.7.1'
}
Run Code Online (Sandbox Code Playgroud)

请注意,此解决方案仅适用于应用程序。如果您是一个库,那么这是危险的,因为您的库的用户可能会看到为众所周知的原型生成的代码的多个副本。