0

I am upgrading my Android app to support API 33. For that, I also upgraded protobuf & grpc libraries. Everything is upgraded and the app works if I build & run it directly from Android Studio to my phone. However, I get the following error if I try to build a bundle for publishing the app.

Type com.google.protobuf.Any$1 is defined multiple times: C:\Users\ilker\.gradle\caches\transforms-3\156cd40978d20d5791c06b9e4b80c4fc\transformed\jetified-protobuf-javalite-3.21.7.jar:com/google/protobuf/Any$1.class, C:\Development\workspace\android_studio\VectorCTRLPRO\app\build\intermediates\javac\release\classes\com\google\protobuf\Any$1.class

My build.gradle (app level) is like this :

apply plugin: 'com.android.application'
apply plugin: 'com.google.protobuf'
apply plugin: 'com.google.gms.google-services'
apply plugin: 'com.google.firebase.crashlytics'

android {
    compileSdkVersion 33
    defaultConfig {
        applicationId "com.test.app"
        minSdkVersion 21
        targetSdkVersion 33
        versionCode 125
        versionName "12.5"
        multiDexEnabled true
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled true
            shrinkResources true
            proguardFiles getDefaultProguardFile(
                    'proguard-android-optimize.txt'),
                    'proguard-rules.pro'
            firebaseCrashlytics {
                mappingFileUploadEnabled true
            }
        }
    }
    lintOptions {
        disable 'GoogleAppIndexingWarning', 'HardcodedText', 'InvalidPackage'
        textReport true
        textOutput "stdout"
    }
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    packagingOptions {
        exclude 'META-INF/DEPENDENCIES'
        exclude 'META-INF/LICENSE'
        exclude 'META-INF/LICENSE.txt'
        exclude 'META-INF/license.txt'
        exclude 'META-INF/NOTICE'
        exclude 'META-INF/NOTICE.txt'
        exclude 'META-INF/notice.txt'
        exclude 'META-INF/ASL2.0'
        exclude 'META-INF/INDEX.LIST'
        exclude 'META-INF/io.netty.versions.properties'
    }
}

dependencies {
    implementation 'androidx.appcompat:appcompat:1.7.0-alpha02'
    implementation 'androidx.constraintlayout:constraintlayout:2.1.4'
    implementation 'com.google.android.material:material:1.8.0'
    implementation 'io.grpc:grpc-okhttp:1.52.1'
    implementation 'io.grpc:grpc-protobuf-lite:1.52.1'
    implementation 'io.grpc:grpc-stub:1.52.1'
    implementation 'javax.annotation:javax.annotation-api:1.2'
    protobuf 'com.google.protobuf:protobuf-java:3.23.2'
    protobuf 'com.google.api.grpc:googleapis-common-protos:0.0.3'
    implementation 'com.google.android.gms:play-services-ads:22.1.0'
    implementation 'com.google.firebase:firebase-analytics:21.3.0'
    implementation 'com.google.firebase:firebase-crashlytics:18.3.7'
    implementation 'com.google.firebase:firebase-messaging:23.1.2'
    implementation ('com.google.firebase:firebase-inappmessaging-display:20.3.2') {
        exclude group: 'com.google.firebase', module: 'protolite-well-known-types'
    }
    implementation 'org.jcodec:jcodec:0.2.5'
    implementation 'org.jcodec:jcodec-android:0.2.5'
    implementation 'org.jcodec:jcodec-javase:0.2.5'
    implementation 'com.google.android.gms:play-services-vision:20.1.3'
    implementation 'com.google.android.ads.consent:consent-library:1.0.8'
    implementation 'com.google.android.play:core:1.10.3'
    implementation 'com.google.guava:guava:28.2-android'
    implementation project(path: ':nativetemplates')

    constraints {
        implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.8.0") {
            because("kotlin-stdlib-jdk7 is now a part of kotlin-stdlib")
        }
        implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.8.0") {
            because("kotlin-stdlib-jdk8 is now a part of kotlin-stdlib")
        }
    }
}

configurations.implementation {
    exclude group: 'com.google.guava', module: 'listenablefuture'
}


protobuf {
    protoc { artifact = 'com.google.protobuf:protoc:3.23.2' }
    plugins {
        grpc { artifact = 'io.grpc:protoc-gen-grpc-java:1.52.1' }
    }

    generateProtoTasks {
        all().each { task ->
            task.builtins{
                java { option 'lite' }
            }
            task.plugins {
                grpc { option 'lite' }
            }
        }
    }
}

tried removing following lines but I got the same error:

 protobuf 'com.google.protobuf:protobuf-java:3.23.2'
    protobuf 'com.google.api.grpc:googleapis-common-protos:0.0.3'

Dependency list created by gradle is as below:

https://pastebin.com/raw/PdYSg8bm

2 Answers2

0

It seems like you are depending on com.google.protobuf:protobuf-java and com.google.protobuf:protobuf-javalite via io.grpc:grpc-protobuf-lite.

The hint was in the error message where the relevant classes were: jetified-protobuf-javalite-3.21.7.jar:com/google/protobuf/Any$1.class and app\build\intermediates\javac\release\classes\com\google\protobuf\Any$1.class.

Refer to https://developer.android.com/build/dependencies#view-dependency-tree for more info on what to do about this. You'll need to investigate to see what is pulling in multiple different protobuf copies and then figure out how to iron out your dependency graph.

justhecuke
  • 765
  • 4
  • 8
  • Thanks for the information. I got the dependency list as described on that page (added to my question above) But I don't see what the problem is. I see the line "com.google.protobuf:protobuf-javalite:3.21.7@jar" several times but in different blocks like debug, release etc. So where is the multiple times addition of this ? – yasin tavukcuoglu Jun 15 '23 at 13:48
  • @yasintavukcuoglu that's surprising. Seems like it isn't showing protobuf-java as a dependency. Not sure why that is. EDIT: The problem isn't that the same dependency is showing up multiple times, that's totally fine, it's that I thought you had multiple different dependencies that were providing different definitions of the same class. What I would normally do from here is do a search through the gradle downloads to see where all versions of the class are coming from. Try writing a script to search through $HOME\.gradle\caches – justhecuke Jun 16 '23 at 01:00
  • ok. but what am I looking for ? I mean what the script should find ? In fact, my build.gradle defines protobuf-java:3.23.2 but gradle complains about protobuf-javalite-3.21.7 . so what does that mean ? – yasin tavukcuoglu Jun 16 '23 at 07:47
  • @yasintavukcuoglu you are looking for multiple different dependencies that define the same class (com.google.protobuf.Any$1). It's complaining about both... that's the issue. You have multiple definitions of the same class coming from different dependencies. That is the root of your problem. You need to find which dependencies are providing copies of the same class, and then figure out how to get rid of one of them. I guessed that it was a conflict between protobuf-java and protobuf-javalite (a common issue), but I'm not sure how to prove it. – justhecuke Jun 17 '23 at 05:16
  • ok but I didn't understand how to find it. Can you explain a bit more ? And I also think that it might be protobuf-java and protobuf-javalite conflict. How can I remove protobuf-java and leave only protobuf-javalite ? – yasin tavukcuoglu Jun 17 '23 at 19:34
  • @yasintavukcuoglu you have the internet at your fingertips... use it. https://github.com/google/protobuf-gradle-plugin – justhecuke Jun 17 '23 at 22:59
  • well, I am stuck. I just changed to "javalite" version by "implementation" cmd. But then it can not find decriptor.proto , If I change to "java version" , then it says protobuf.Any$1 is defined multiple times. why? – yasin tavukcuoglu Jun 18 '23 at 22:42
  • if I remove all "lite" options, then it can not find some symbols: cannot find symbol class GeneratedMessageV3 , error: cannot find symbol com.google.protobuf.MessageOrBuilder – yasin tavukcuoglu Jun 18 '23 at 22:48
  • @yasintavukcuoglu I don't know much about the dependency graph for protobuf so I can't really give much help here. And figuring out how to fix gradle dependency issues is a hard problem in general. there are other websites and such which can help with that but it's not something that I know much about. sorry. – justhecuke Jun 18 '23 at 23:13
  • thanks anyway. Maybe someone else can... – yasin tavukcuoglu Jun 20 '23 at 20:17
  • I could not resolve this problem yet. I wish no one had answered it because that way maybe somebody with experience could see and offer an help. Now it seems like there is a solution but it is not a complete answer. I am still working on it. I noticed that if I build "debug" it does compile without errors. – yasin tavukcuoglu Jul 26 '23 at 15:00
0

@ejona86 from Github helped me with this issue here: https://github.com/google/protobuf-gradle-plugin/issues/731

It turns out that the problem is with the old "googleapis-common-protos:0.0.3" artifact. I updated it to version 2.23.0 but it still has issues.

Then I was advised to manually inject descriptor.proto doing; 1.

 //protobuf 'com.google.api.grpc:googleapis-common-protos:0.0.3'
    protobuf ('com.google.api.grpc:proto-google-common-protos:2.23.0') {
        exclude group: 'com.google.protobuf'
    }
  1. add the file to the source: app/src/main/proto/google/protobuf/descriptor.proto

After these changes, my issue is gone. Thanks to @ejona86