Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

transformClassesWithMultidexlistFor 工程每次都需要clean, 才能避免这个问题 #63

Open
binleo731 opened this issue Jul 30, 2019 · 14 comments
Labels
bug Something isn't working

Comments

@binleo731
Copy link

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 吧

@Knight-ZXW
Copy link
Collaborator

@binleo731 请问你的com.android.tools.build:gradle 插件版本为多少

@binleo731
Copy link
Author

@Knight-ZXW 3.2.1

@Knight-ZXW
Copy link
Collaborator

Knight-ZXW commented Jul 31, 2019

@Knight-ZXW 3.2.1

@binleo731 尝试升级到 3.3.0及以上版本 ,看是否能够解决该问题。

@binleo731
Copy link
Author

@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

@Knight-ZXW
Copy link
Collaborator

我的现象是 工程的底层依赖有升级的时候,再次编译100%会出现type alreday exists, 需要clean项目才能解决。
后面我升级到3.3.0以上版本后,该问题就不会复现了。

你出现该问题是在什么场景?

@binleo731
Copy link
Author

@Knight-ZXW 这个问题, 是我在 build 工程时必现的。 而且只要 build 过一次, 没有任何更改的情况下, 如果没有 clean, 再次 build,也会出现这个问题。我用的 wmrouter 已经是最新版本

@Knight-ZXW
Copy link
Collaborator

@Knight-ZXW 这个问题, 是我在 build 工程时必现的。 而且只要 build 过一次, 没有任何更改的情况下, 如果没有 clean, 再次 build,也会出现这个问题。我用的 wmrouter 已经是最新版本

我们的项目有一段时间好像也出现过你这种场景, 你的Android Studio ,gralde wrapper ,com.android.tools.build:gradle 的版本分别是多少

@binleo731
Copy link
Author

@Knight-ZXW AS-3.4.2, gradlew-5.5, gradle-plugin-3.4.2

@Knight-ZXW
Copy link
Collaborator

Knight-ZXW commented Jul 31, 2019

@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
}

@binleo731
Copy link
Author

谢谢你的回复, 这个配置是我在你的建议升级后的版本。我刚刚将 wmrouter 依赖,以及 wmrouter 插件在原工程中删除之后, app:transformDexArchiveWithDexMergerForDevDebug 这个问题就没有再出现过了。从目前看, 我的工程是由 wmrouter 引起的transformDexArchiveWithDexMergerForDevDebug

@binleo731
Copy link
Author

@Knight-ZXW 在测试过程中发现, 当 移除 apply plugin: 'WMRouter' 之后, 就不会再出现这个问题

@Knight-ZXW
Copy link
Collaborator

@Knight-ZXW 在测试过程中发现, 当 移除 apply plugin: 'WMRouter' 之后, 就不会再出现这个问题

我的也是 移除plugin之后就不会出现, 从我的测试上来看,这并不能说明就是wmrouter plugin的问题。 我也有试过 Arouter的plugin实现,同样也会出现这个问题(type alreday exists)。

因为我不太确定你的具体工程配置,无法确定你升级android-gradle版本后依旧会出现这个问题的原因,如果可以的话,你可以在github创建一个可以复现该问题的demo工程 我来看下。

@lightom13
Copy link

lightom13 commented Mar 11, 2020

+1,也遇到了这个问题,请问有进展吗
classpath 'com.android.tools.build:gradle:3.5.3'

@jzj1993
Copy link
Collaborator

jzj1993 commented Jun 9, 2021

最近发布了新版本,支持增量编译,可以尝试一下看看这个问题有没有解决。

@jzj1993 jzj1993 added the bug Something isn't working label Jun 10, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug Something isn't working
Projects
None yet
Development

No branches or pull requests

4 participants