這段時間有一個新需求,安卓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搜索找到相似的問題的答案要能作類比和知識延伸,慢慢思考,有效思考,得出一點新的結論,然后繼續思考,就能越來越接近解決問題的成功路徑了