1.简单问题:库版本冲突
使用的多个依赖版本不一致导致冲突,解决方案1.能修改引用版本的,自行修改版本,保证统一 2.排除掉部分库里面的引用 比方说
implementation('com.shuyu:gsyVideoPlayer-java:7.1.6') {
exclude group: "tv.danmaku.ijk.media", module: "ijkplayer-java"
}
3.强引用指定使用统一的版本:在项目build.gradle(项目而非module)下,像这样强引用,指定某个版本.
allprojects {
configurations.all {
resolutionStrategy.force 'com.squareup.retrofit2:retrofit:2.9.0'}
}
2.稍微麻烦点的so库冲突:
1.可以将冲突的其中一个AAR当中的so库进行删除,解压 删除 重新打包 在导入(这种方案需要注意保证多个库在使用的时候必须能加载到so库).删除可以见下方github链接,有简单方案,但是不建议这么做,方案2更好
2.pickFirst过滤,像这样
android {
packagingOptions {
pickFirst 'lib/arm64-v8a/libc++_shared.so'
pickFirst 'lib/armeabi-v7a/libc++_shared.so'
pickFirst 'lib/x86/libc++_shared.so'
pickFirst 'lib/x86_64/libc++_shared.so'
}
}
3.最坑人的类冲突,也是我重点想说的冲突解决方案
这种一般都是aar提供方直接把开源库代码集成打包进去,然后遇到了同样做法的.exclude 是无用的.解决方案只有一个解压当中一个aar,把其中冲突的class/package 删掉,重新打包成AAR进行集成,当然,这种方案网上大批的文章..仅仅这样没有必要来发文章.这里提供一个比较简单的方案,还有这种方案可能遇到的坑.
aar过滤删除class/package/so库可以使用gradle脚本,删除打包.ExcludeAar这个项目,可以很方便的实现.原作者链接ExcludeAar自己做了点修改的链接https://github.com/yushengfangzhu/ExcludeAar,把作者忘记配置的so库排除加上了,还加入了正则,匹配大量的冲突class,可以很方便的进行
这个方案对gradle直接引用的aar很方便.
那么,被开源库引用的aar怎么办呢?到这边就成了gradle的cache文件.
可以看到我们这里有一个冲突,但是项目里面是没有这个库的
这个是阿里的mpaas小程序里面使用的.
接下来就来解决这个冲突.首先找到这个依赖,右键jar包 open in explorer,找到文件缓存位置.然后新建一个空的module
,把对应的文件copy进去 jar包拿过去Exclude 删除类/包放进libs下(这个过程github介绍的非常详细,就不多说废话了) .其他文件放到对应的位置,然后rebuild project就会在 这里得到一个新的AAR.
这时候呢,就把这个AAR上传到maven仓库 ,公有还是私有都可以,为什么一定要传仓库呢?因为后续使用不能已module形式导入.AAR已经得到了,最后就要替换掉原本的库了
在项目的build.gradle下
allprojects {
configurations.all {
resolutionStrategy.dependencySubstitution {
substitute module('com.alipay.xmedia.algorithm:algorithm-build') with module('com.alipay:algorithm-build:10.1.60_001')
}
}
最后看看效果:
B站这个视频库包名下已经空了,项目可以运行了,mpaas集成成功.最后为什么AAR一定要传maven仓库呢 substitute module('com.alipay.xmedia.algorithm:algorithm-build') with module('com.alipay:algorithm-build:10.1.60_001') 其中 with module()明确规定了com.alipay algorithm-build 10.1.60_001 要由三部分组成,自行可以尝试module形式写在这里替换,会报错的