组件化开发中引用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


你可能感兴趣的:(Android)