迁移至Gradle 4.4与AGP 3.1.2时遇D8重复类型错误求助
解决Gradle 4.4/AGP 3.1.2下Parceler依赖冲突导致的Dex合并错误
这个问题的核心是两个模块都生成了相同的Parceler辅助类,导致Dex合并时出现重复类型错误。下面给你两种针对性的解决方案,你可以根据项目情况选择:
方案一:主应用无自定义Parceler序列化类时
如果你的主应用模块没有自己的类需要用Parceler进行序列化,完全依赖库模块的序列化逻辑,那直接移除主应用build.gradle里的Parceler相关依赖即可:
// 删掉主应用里这两行 // implementation "org.parceler:parceler-api:1.0.4" // annotationProcessor "org.parceler:parceler:1.0.4"
因为你已经给aar依赖设置了transitive=true,库模块的parceler-api会自动传递到主应用,而主应用不需要运行Parceler的注解处理器,也就不会重复生成org.parceler.Parceler$$Parcels$1这类类了。
方案二:主应用有自定义Parceler序列化类时
如果主应用自己也有类需要用Parceler注解,那需要调整依赖配置避免重复生成:
- 修改库模块的依赖:把
parceler-api的implementation改成api,这样主应用可以继承这个依赖,不需要重复引入:
// 库模块build.gradle api "org.parceler:parceler-api:1.0.4" // 替换原来的implementation annotationProcessor "org.parceler:parceler:1.0.4"
- 修改主应用的依赖:只保留注解处理器依赖,移除
parceler-api的依赖(因为已经通过库模块传递过来了):
// 主应用build.gradle api(group: 'com.example.mylibrary', name: 'mylibrary', version: "1.0.7", ext: 'aar') { transitive = true; changing = true } // 只保留这一行,删掉implementation那行 annotationProcessor "org.parceler:parceler:1.0.4"
这样调整后,库模块和主应用各自运行注解处理器生成自己模块所需的辅助类,但parceler-api只会被引入一次,而且不会出现重复的Parceler$$Parcels$1类冲突了。
另外要注意:确保库模块和主应用使用的Parceler版本完全一致,版本不一致也可能引发类似的兼容性问题。
内容的提问来源于stack exchange,提问作者nayan
相关产品推荐
相关产品推荐

