这段时间有一个新需求,安卓App通过URL在线预览PDF。选择使用并倒入PdfViewPager库时,报了如下异常:
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搜索找到相似的问题的答案要能作类比和知识延伸,慢慢思考,有效思考,得出一点新的结论,然后继续思考,就能越来越接近解决问题的成功路径了
参考资料
Gradle依赖排除
有关 Android Studio 重复引入包的问题和解决方案
跟我学Gradle-5.3:依赖-管理依赖的版本