英文:
How can I solve "Type com.google.protobuf.Any$1 is defined multiple times" problem on Android Studio
问题
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.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][1]
[1]: https://pastebin.com/raw/PdYSg8bm
<details>
<summary>英文:</summary>
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][1]
[1]: https://pastebin.com/raw/PdYSg8bm
</details>
# 答案1
**得分**: 0
以下是翻译好的部分:
似乎您依赖于`io.grpc:grpc-protobuf-lite`来使用`com.google.protobuf:protobuf-java`和`com.google.protobuf:protobuf-javalite`。
错误消息中提到的相关类是:
`jetified-protobuf-javalite-3.21.7.jar:com/google/protobuf/Any$1.class`和`app\build\intermediates\javac\release\classes\com\google\protobuf\Any$1.class`。
请参考https://developer.android.com/build/dependencies#view-dependency-tree 获取更多关于如何处理此问题的信息。您需要调查是什么导致了多个不同的protobuf副本,然后找出如何调整您的依赖关系图。
<details>
<summary>英文:</summary>
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.
</details>
# 答案2
**得分**: 0
@ejona86 来自 Github 在这个问题上帮助了我:
https://github.com/google/protobuf-gradle-plugin/issues/731
问题出在旧版本的 "googleapis-common-protos:0.0.3" 组件上。我将它更新到了版本 2.23.0,但仍然存在问题。
然后有人建议我手动注入 descriptor.proto 文件:
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'
}
2. 将文件添加到源码中:
app/src/main/proto/google/protobuf/descriptor.proto
经过这些修改,我的问题解决了。
感谢 @ejona86。
<details>
<summary>英文:</summary>
@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'
}
2. add the file to the source:
app/src/main/proto/google/protobuf/descriptor.proto
After these changes, my issue is gone.
Thanks to @ejona86
</details>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论