Android开发Android开发经验谈孚睿科技·ANDROID知识总结

如何彻底解决 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” 不是因为重复依赖,而是因为依赖同一个项目的不同版本,导致系统不知道该选择哪一个,所以冲突罢工了。

问题找到,解决方案就简单了——把两者版本号统一。

  1. 全部采用25编译即可。注意com.android.support包下的库要和 compileSdkVersion 保持一致,所以compileSdkVersion也要改。
  2. 全部采用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,但实际使用并不冲突。

  1. 剥离库冲突项目。
api('com.jakewharton:butterknife:8.5.1') {
    exclude group: 'com.android.support', module: 'support-annotations'
    exclude group: 'com.android.support', module: 'support-compat'
}

Tips:如何打印系统依赖项

  1. 在项目build.gradle中添加如下代码块。
subprojects {
    //Note: 打印项目所有依赖项 ./gradlew allDependencies > dependencies.log
    task allDependencies(type: DependencyReportTask) {}
}
  1. 在Terminal中执行 ./gradlew allDependencies。

沉思的Panda
2018-06-21

上一篇下一篇

猜你喜欢

热点阅读