Дублированные классы из двух библиотек в проекте Android

У меня есть две мои собственные библиотеки Android libA и libB, которые используют protobuf. Когда я добавляю один из них в свой проект приложения для Android, все в порядке, но если я добавляю оба, у меня возникает ошибка при создании проекта приложения:

Duplicate class com.google.api.Advice found in modules classes.jar (libA) and classes.jar (libB)
Duplicate class com.google.api.Advice$1 found in modules classes.jar (libA) and classes.jar (libB)
Duplicate class com.google.api.Advice$Builder found in modules classes.jar (libA) and classes.jar (libB)
Duplicate class com.google.api.AdviceOrBuilder found in modules classes.jar (libA) and classes.jar (libB)
Duplicate class com.google.api.AnnotationsProto found in modules classes.jar (libA) and classes.jar (libB)
Duplicate class com.google.api.AuthProto found in modules classes.jar (libA) and classes.jar (libB)
Duplicate class com.google.api.AuthProvider found in modules classes.jar (libA) and classes.jar (libB)
Duplicate class com.google.api.AuthProvider$1 found in modules classes.jar (libA) and classes.jar (libB)
Duplicate class com.google.api.AuthProvider$Builder found in modules classes.jar (libA) and classes.jar (libB)
Duplicate class com.google.api.AuthProviderOrBuilder found in modules classes.jar (libA) and classes.jar (libB)
Duplicate class com.google.api.AuthRequirement found in modules classes.jar (libA) and classes.jar (libB)
.................

Я использую Gradle в проектах библиотек и проектах приложений. Я добавляю библиотеки в проект приложения как:

dependencies {
    implementation "com.libA"
    implementation "com.libB"
}

В обеих библиотеках у меня почти одинаковый конфиг:

apply plugin: 'com.android.library'
apply plugin: 'com.google.protobuf'
apply from: rootProject.file("gradle/versions.gradle")

android {
    compileSdkVersion versions.sdk.compile

    defaultConfig {
        minSdkVersion versions.min
        targetSdkVersion versions.compile
        versionCode versions.code
        versionName versions.name
    }

    sourceSets {
        main {
            jni.srcDirs = []
            jniLibs.srcDirs = ['src/main/libs']
        }
    }
}

protobuf {
    protoc {
        artifact = "com.google.protobuf:protoc:3.6.1"
    }
    plugins {
        javalite {
            artifact = "com.google.protobuf:protoc-gen-javalite:3.0.0"
        }
        grpc {
            artifact = "io.grpc:protoc-gen-grpc-java:1.25.0"
        }
    }
    generateProtoTasks {
        all().each { task ->
            task.plugins {
                task.builtins {
                    remove java
                }
                javalite {}
                grpc {
                    // Options added to --grpc_out
                    option 'lite'
                }
            }
        }
    }
}

dependencies {
    protobuf "com.google.protobuf:protobuf-lite:3.0.1"
    protobuf "com.google.api.grpc:proto-google-common-protos:1.12.0"

    implementation "io.grpc:grpc-okhttp:1.25.0"
    implementation "io.grpc:grpc-protobuf-lite:1.25.0"
    implementation "io.grpc:grpc-stub:1.25.0"
    
    //other dependencies 
}

В результате у меня одинаковые классы в обеих зависимостях (скриншот одного из них), это выдает повторяющуюся ошибку: библиотеки

Исключение группы/модуля не помогает. Как я могу решить эту проблему?


person Marya Chernyadieva    schedule 27.07.2020    source источник


Ответы (1)


Я нашел решение. Я создал третью библиотеку только с генератором и добавил ее в качестве зависимости к моим libA и libB. Это не совсем правильное архитектурное решение, но пока оно работает. Я буду работать над лучшим решением.

person Marya Chernyadieva    schedule 07.08.2020