Android多模块项目构建报错:重复类及Dex转换失败求助
Android多模块项目构建错误解决方案
1. 解决:app:mergeExtDexDebugAndroidTest任务失败(ddmlib Dex转换错误)
方案一:排除测试依赖中的高版本ddmlib
在app模块的build.gradle.kts中,定位引入ddmlib的AndroidTest依赖并排除该模块:
androidTestImplementation("androidx.test.ext:junit:1.1.5") { exclude(group = "com.android.tools.ddms", module = "ddmlib") } // 其他包含ddmlib的测试依赖需做同样处理
若不确定依赖来源,执行以下命令查看测试依赖树:
./gradlew app:dependencies --configuration debugAndroidTestCompileClasspath
方案二:启用Core Library Desugaring(无需提升minSdk)
在app模块的build.gradle.kts中配置desugar,让低版本SDK兼容高版本库特性:
android { compileOptions { coreLibraryDesugaringEnabled = true sourceCompatibility = JavaVersion.VERSION_1_8 targetCompatibility = JavaVersion.VERSION_1_8 } testOptions { androidTest { compileOptions { coreLibraryDesugaringEnabled = true } } } } dependencies { coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:2.0.4") }
2. 解决protobuf重复资源与重复类问题
方案一:统一使用protobuf-javalite,排除protobuf-java依赖
在所有模块的build.gradle.kts中,对引入protobuf的依赖做排除处理,强制使用javalite版本:
// 示例:排除第三方依赖中的protobuf-java implementation("some.library:that-uses-protobuf:1.0.0") { exclude(group = "com.google.protobuf", module = "protobuf-java") } // 统一引入指定版本的javalite implementation("com.google.protobuf:protobuf-javalite:3.21.7")
方案二:在项目根目录settings.gradle.kts中强制统一protobuf版本
添加版本约束,确保所有模块使用相同的protobuf版本:
dependencyResolutionManagement { constraints { all { if (group == "com.google.protobuf") { version { strictly("3.21.7") } } } } }
方案三:配置protobuf插件生成javalite代码
若使用protobuf Gradle插件,在模块build.gradle.kts中指定生成javalite类型的代码:
plugins { id("com.google.protobuf") version "0.9.4" } protobuf { protoc { artifact = "com.google.protobuf:protoc:3.21.7" } generateProtoTasks { all().forEach { task -> task.builtins { remove("java") create("javatite") } } } }
3. 验证修复效果
执行以下命令清理并重新构建项目:
./gradlew clean ./gradlew assembleDebugAndroidTest ./gradlew assembleDebug
内容的提问来源于stack exchange,提问作者zadgee
相关产品推荐
相关产品推荐

