元件化開發中引用aar包引起的jar包衝突問題
阿新 • • 發佈:2019-02-12
背景:
公司專案需要引用公司內部開發的IM元件,元件以AAR包的形式進行引入,由於IM元件相當於一個完整的專案,所以用到的jar包比較多,比如fastjson、okhttp、glide。
這些jar包在專案中的common庫中也有引用,所以造成了衝突。
問題:
引入aar包之後的gradle編譯報如下錯誤,注意jar包衝突的的錯誤每次都只會報一個,其實可能存在多個衝突。從log中可以看出衝突的是okhttp這個jar包的引入導致。
Error:Execution failed for task ':app:transformClassesWithJarMergingForZhgyDebug'. > com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplicate entry: com/google/gson/annotations/Expose.class
原因:
Android在打包編譯的時候會將aar包中的資原始檔一併打入包中,這個時候第三方包的包名和類名都完全一致,這會導致在尋找需要的類的時候出現問題。
所以這裡我們就有兩個不同的解決方案。
1、引用jar包的原始碼,修改原始碼的包名。
2、使用gradle的配置exclude掉重複的jar包。
解決方法:
在app的gradle中新增如下配置
configurations { compile.exclude module: 'okhttp' compile.exclude module: 'fastjson' compile.exclude module: 'glide' }
gradle針對jar包重複的問題的解決,詳細的介紹可以看官方的文章
https://docs.gradle.org/current/userguide/dependency_management.html