遇到异常Multiple dex files define时

正文

这段时间有一个新需求,安卓App通过URL在线预览PDF。选择使用并倒入PdfViewPager库时,报了如下异常:

1
2
3
4
5
jdmerchants:transformDexArchiveWithExternalLibsDexMergerForTestServerDebug

com.android.builder.dexing.DexArchiveMergerException: Unable to merge dex

Multiple dex files define Luk/co/senab/photoview/log/Logger

出现Multiple, dex字样,直接想到的可能就是重复倒入依赖了,那么问题来了:

为什么我导入PdfViewPager类库的时候会产生重复依赖问题?
PdfViewPager类库里和我现有的依赖类库什么文件重复?
如何确定是哪某个类库里的文件和PdfViewPager类库产生重复的依赖了?

定位问题缘由

我用的是Mac下的Android Studio 3.1开发

首先需要找到一个工具或者方法,能了解到当前项目中所有类库内部的依赖情况。这里提供一种方法,输入下面命令

./gradlew -q 模块名:dependencies

在命令行窗口就能列出当前模块的所有依赖情况。我选取了和这次问题有关内容的,展示如下:

\--- es.voghdev.pdfviewpager:library:1.0.3
 +--- com.android.support:appcompat-v7:25.4.0 (*)
 \--- com.commit451:PhotoView:1.2.4
      \--- com.android.support:support-v4:23.0.1 -> 25.4.0 (*)


\--- com.github.chrisbanes.photoview:library:1.2.4
 \--- com.android.support:support-v4:22.0.0 -> 25.4.0 (*)

会发现,新引入的pdfviewpager类库用到了com.commit451:PhotoView:1.2.4;这和com.github.chrisbanes.photoview:library:1.2.4类库重复了

解决问题

问题我们找到了:pdfviewpager类库依赖了chrisbanes.photoview类库,造成chrisbanes.photoview类库重复使用,因此只要在引入pdfviewpager的时候,排除掉com.commit451:PhotoView:1.2.4就可以了

那么如何排除呢?Gradle构建项目肯定想到了这种情况下的处理–引入第三方类库时排除掉里面的某个依赖库:

compile ('es.voghdev.pdfviewpager:library:1.0.3'){
    exclude group: 'com.commit451', module:'PhotoView'
}

小结

遇到了之前未曾遇到的问题,这个问题所需的知识点又是之前未曾储备的盲区,这时候google搜索找到相似的问题的答案要能作类比和知识延伸,慢慢思考,有效思考,得出一点新的结论,然后继续思考,就能越来越接近解决问题的成功路径了

参考资料