1. 程式人生 > >元件化開發中引用aar包引起的jar包衝突問題

元件化開發中引用aar包引起的jar包衝突問題

背景:

公司專案需要引用公司內部開發的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: okhttp3/Address.class

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