WMRouter
WMRouter copied to clipboard
transformClassesWithMultidexlistFor 工程每次都需要clean, 才能避免这个问题
clean之后编译可以正常编译 编译一次之后再次编译无法编译,错误在transformClassesWithMultidexlistFor##Debug 这个流程中。 错误信息是 java.lang.RuntimeException: com.android.build.api.tranformException: Error while generating the main dex list 原因是 Program type already present: xxx at com.andorid.build.gradle.internal.transforms.D8MainDexListTranform.tranform
现在成了必现问题, 每次都需要 clean, 才能 build 成功, 每次 build 都需要20分钟, 严重影响开发进度, 快解决下这个 bug 吧
@binleo731 请问你的com.android.tools.build:gradle 插件版本为多少
@Knight-ZXW 3.2.1
@Knight-ZXW 3.2.1
@binleo731 尝试升级到 3.3.0及以上版本 ,看是否能够解决该问题。
@Knight-ZXW 谢谢你回复, 已经升级到 3.4.2, 还是出现这样的问题 Task :app:transformDexArchiveWithDexMergerForDevDebug FAILED com.android.build.api.transform.TransformException: java.lang.RuntimeException: java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives: Program type already present: android.support.customtabs.CustomTabsClient$2$2
我的现象是 工程的底层依赖有升级的时候,再次编译100%会出现type alreday exists, 需要clean项目才能解决。 后面我升级到3.3.0以上版本后,该问题就不会复现了。
你出现该问题是在什么场景?
@Knight-ZXW 这个问题, 是我在 build 工程时必现的。 而且只要 build 过一次, 没有任何更改的情况下, 如果没有 clean, 再次 build,也会出现这个问题。我用的 wmrouter 已经是最新版本
@Knight-ZXW 这个问题, 是我在 build 工程时必现的。 而且只要 build 过一次, 没有任何更改的情况下, 如果没有 clean, 再次 build,也会出现这个问题。我用的 wmrouter 已经是最新版本
我们的项目有一段时间好像也出现过你这种场景, 你的Android Studio ,gralde wrapper ,com.android.tools.build:gradle 的版本分别是多少
@Knight-ZXW AS-3.4.2, gradlew-5.5, gradle-plugin-3.4.2
@binleo731 我的环境基本和你一样,目前不会出现type already exists 的问题了。根据我的分析,这个问题应该跟wmrouter的插件无关,至少在我的场景下 问题应该是 com.android.tools.build:gradle插件的BUG。
我猜测的具体原因是: com.android.tools.build:gradle 插件的DexArchiveBuilderTransform 在3.3.0以下版本,在处理 jar转换成dex过程中,没有删除变动的jar包的缓存导致的。
具体代码在 com.android.tools.build:gradle:3.2.0 版本的 525行 processJarInput 函数中
if (!isIncremental || additionalPaths.contains(jarInput.getFile())) { //执行jar 转换为dex } } else if (jarInput.getStatus() != Status.NOTCHANGED) { //删除旧的Dex缓存 }
第一个判断语句中 additionalPaths.contains(jarInput.getFile())表示 jarInput路径包含在变动的文件中,此时应该是删除Dex缓存。
因此在3.3.0版本 以上函数改为了
if (!isIncremental ) { //执行jar 转换为dex } } else if (jarInput.getStatus() != Status.NOTCHANGED || additionalPaths.contains(jarInput.getFile())) { //删除旧的Dex缓存 //执行jar 转换为dex }
谢谢你的回复, 这个配置是我在你的建议升级后的版本。我刚刚将 wmrouter 依赖,以及 wmrouter 插件在原工程中删除之后, app:transformDexArchiveWithDexMergerForDevDebug 这个问题就没有再出现过了。从目前看, 我的工程是由 wmrouter 引起的transformDexArchiveWithDexMergerForDevDebug
@Knight-ZXW 在测试过程中发现, 当 移除 apply plugin: 'WMRouter' 之后, 就不会再出现这个问题
@Knight-ZXW 在测试过程中发现, 当 移除 apply plugin: 'WMRouter' 之后, 就不会再出现这个问题
我的也是 移除plugin之后就不会出现, 从我的测试上来看,这并不能说明就是wmrouter plugin的问题。 我也有试过 Arouter的plugin实现,同样也会出现这个问题(type alreday exists)。
因为我不太确定你的具体工程配置,无法确定你升级android-gradle版本后依旧会出现这个问题的原因,如果可以的话,你可以在github创建一个可以复现该问题的demo工程 我来看下。
+1,也遇到了这个问题,请问有进展吗 classpath 'com.android.tools.build:gradle:3.5.3'
最近发布了新版本,支持增量编译,可以尝试一下看看这个问题有没有解决。