com.android.tools.r8.errors.CompilationError:程序类型已存在:com.google.protobuf.AbstractMessageLite $ Builder $ LimitedInputStream

时间:2019-01-05 06:31:36

标签: android protocols protocol-buffers grpc-java protobuf-java

我得到

  

“程序类型已存在:   com.google.protobuf.AbstractMessageLite $ Builder $ LimitedInputStream“   运行时错误。我尝试使用multidix并引用了更多链接   但仍然没有任何解决方案。

这是因为在protobuf lite和protobuf jar文件中是同一类。我的依赖项是

    protobuf {
        protoc {
            artifact = 'com.google.protobuf:protoc:3.6.1'
        }
        plugins {
            grpc {
                artifact = 'io.grpc:protoc-gen-grpc-java:1.0.0-pre2'
            }
            javalite {
                artifact = 'com.google.protobuf:protoc-gen-javalite:3.0.0'
            }
        }
        generateProtoTasks {
            all()*.plugins {
                javalite {}
            }
            ofNonTest()*.plugins {
                grpc {
                    // Options added to --grpc_out
                    option 'lite'
                }
            }
        }
    }

    dependencies {
        implementation 'com.android.support:appcompat-v7:27.1.1'
        implementation 'com.android.support:design:27.1.1'
        implementation 'com.android.support:multidex:1.0.3'
        //  GRPC dependencies
        implementation 'javax.annotation:javax.annotation-api:1.3.2'
        implementation 'io.grpc:grpc-protobuf-lite:1.14.0'
        implementation 'io.grpc:grpc-okhttp:1.14.0'
        implementation 'io.grpc:grpc-stub:1.14.0'
        implementation files('libs/protobuf-java-3.6.1.jar')

    }

由于我的库文件和protobuf插件都在下面

artifact = 'com.google.protobuf:protoc-gen-javalite:3.0.0'
 implementation files('libs/protobuf-java-3.6.1.jar')

正在该jar文件中生成相同的Java类,因此我可能会收到此错误“程序类型已存在”

我已经尝试过multidex,但不包括代码,但都无法正常工作

android {
    compileSdkVersion 27

    defaultConfig {
        applicationId "io.grpc.helloworldexample"
        // API level 14+ is required for TLS since Google Play Services v10.2
        minSdkVersion 14
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        multiDexEnabled true

    }
    buildTypes {
        debug { minifyEnabled false }
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
    lintOptions {
        disable 'GoogleAppIndexingWarning', 'HardcodedText', 'InvalidPackage'
        textReport true
        textOutput "stdout"
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }


    sourceSets {
        main {
            java {
                exclude '**/AbstractMessageLite.java'
            }
        }
    }
}

我尝试使用multidix,并且还引用了更多链接,但仍然没有得到任何解决方案。

1 个答案:

答案 0 :(得分:0)

我遇到了类似的问题,这是由于在我的一个项目依赖项中使用了不同版本的protobuf库引起的。

运行命令gradle dependencies以查看所有依赖项。

我通过删除protobuf依赖性并仅保留一个版本解决了该问题。