如何彻底解决 Duplicate zip entry 导致的De
2018-06-21 本文已影响40人
沉思的Panda
最近发现 butterknife 最新版支持Lib引用了,原来的替代方案 butterfork 也放弃更新。因此决定把panda.android 升级一下。没想到一升级出现一个意向不到的bug。
:PandaAndroidDemo:transformDexArchiveWithExternalLibsDexMergerForDebug FAILED
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':PandaAndroidDemo:transformDexArchiveWithExternalLibsDexMergerForDebug'.
> com.android.builder.dexing.DexArchiveMergerException: Unable to merge dex
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.
* Get more help at https://help.gradle.org
BUILD FAILED in 14s
Run with --stacktrace
后信息如下:
Caused by: java.io.IOException: Duplicate zip entry [classes.jar:android/support/v4/view/ViewCompat$JbMr2ViewCompatImpl.class]
at proguard.io.JarWriter.getOutputStream(JarWriter.java:138)
at proguard.io.FilteredDataEntryWriter.getOutputStream(FilteredDataEntryWriter.java:106)
at proguard.io.FilteredDataEntryWriter.getOutputStream(FilteredDataEntryWriter.java:106)
at proguard.io.FilteredDataEntryWriter.getOutputStream(FilteredDataEntryWriter.java:92)
at proguard.io.ClassRewriter.read(ClassRewriter.java:68)
at proguard.io.FilteredDataEntryReader.read(FilteredDataEntryReader.java:87)
at proguard.io.FilteredDataEntryReader.read(FilteredDataEntryReader.java:87)
at proguard.io.FilteredDataEntryReader.read(FilteredDataEntryReader.java:87)
at proguard.io.JarReader.read(JarReader.java:65)
at proguard.io.DirectoryPump.readFiles(DirectoryPump.java:65)
at proguard.io.DirectoryPump.pumpDataEntries(DirectoryPump.java:53)
at proguard.InputReader.readInput(InputReader.java:184)
... 125 more
很明显:android/support/v4 这个包出现重复了。
打印依赖项目,发现:
所以“Duplicate zip entry” 不是因为重复依赖,而是因为依赖同一个项目的不同版本,导致系统不知道该选择哪一个,所以冲突罢工了。
问题找到,解决方案就简单了——把两者版本号统一。
- 全部采用25编译即可。注意com.android.support包下的库要和 compileSdkVersion 保持一致,所以compileSdkVersion也要改。
- 全部采用23编译编译。
api 'com.jakewharton:butterknife:8.2.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.2.1'
虽然依赖项显示,8.2.1用的是 com.android.support:support-annotations:24.0.0
,但实际使用并不冲突。
- 剥离库冲突项目。
api('com.jakewharton:butterknife:8.5.1') {
exclude group: 'com.android.support', module: 'support-annotations'
exclude group: 'com.android.support', module: 'support-compat'
}
Tips:如何打印系统依赖项
- 在项目build.gradle中添加如下代码块。
subprojects {
//Note: 打印项目所有依赖项 ./gradlew allDependencies > dependencies.log
task allDependencies(type: DependencyReportTask) {}
}
- 在Terminal中执行 ./gradlew allDependencies。
沉思的Panda
2018-06-21