报错:NoSuchMethodError: No virtual method load;Error while merging dex archives;Unable to merge dex等

问题起因:项目添加glide-transformations开源框架依赖后导致莫名的报错:NoSuchMethodError: No virtual method load;Error while merging dex archives;Unable to merge dex等,报错信息的不够精确和诡异性导致我放弃通过阅读log来找问题,于是就有了下面的艰辛历程

添加的依赖:implementation 'jp.wasabeef:glide-transformations:3.3.0'

 

1.经过了一两个小时的百度,和各种排错,所有的答案都在指示着一个方向: 依赖版本冲突导致!

这些是一些百度结果的关键字:com.android.support 版本不一致导致冲突、 重复依赖 、引入依赖时多次加载同一个类而引发...

 

2.于是我确定引起这诡异的错误是build.gradle的问题, 但是我并没有重复依赖的问题, 但是有support包版本冲突,但是发生报错之前也一直冲突,但是程序依然可以运行啊?如下图:

 

3.于是我现在的想法是先把这个问题解决掉再说!解决方法就是把引入的开源项目它本身所依赖的support依赖排除掉,不让它参与编译,详细参考以下这篇文章:https://blog.csdn.net/yuzhiqiang_1993/article/details/78214812

如果不知道你所引入的开源项目用了什么依赖,那么请参考这几篇:https://blog.csdn.net/sugaryaruan/article/details/79905339https://www.jianshu.com/p/8d02da77c83dhttps://blog.csdn.net/HandSome696/article/details/73571918

注意一点: 执行依赖树明亮时会全部打印出来,包括debugApk、debugCompile、releaseApk、releaseCompile、compile时期的依赖树等全部打印出来,一般来说我们只需要看一个就够了,我当初是直接看第一个打印出来的依赖数表。

我当初项目的依赖树(不用在意):

 

4.经过艰辛的历程,终于顺利把依赖的框架的依赖排除,排除掉之后就会提示你之前的一些控件的属性找不到了,这时你就可以通过自己在项目里导相同的依赖版本来来用了,这时我们项目的所有support包的版本都一致了!

 

5.于是我激动的同步项目,然后运行app,但是!按照之前的想法一步步弄下来最后发现问题还在!!!但是!好在原来的解决问题的思路没错!于是我沉思一想,原来不是support v7包版本冲突导致,而是我引入的开源项目LoopViewPager里的依赖glide和引入的glide-transformations开源框架里的依赖glide冲突了!如下图:

 

6.于是我又把com.github.open-android:LoopViewPager:2.0.0的依赖也排除

implementation ('com.github.open-android:LoopViewPager:2.0.0'){

exclude group: 'com.github.bumptech.glide:glide'

}

然后激动的运行app。但是!还是没解决问题!!且报错和原来一样?!!!有如天助般地瞄了一眼报错信息发现其实报错和之前的并不一样,只是提示代码的位置一样,这次是类找不着了,而不是方法!

 

7.恍然大悟:原来上一步分析还是对的,问题还是出在LoopViewPager,但是是因为LoopViewPager的Glide依赖被新版本覆盖导致报错:方法找不着!可能是因为新版本的Glide开源库可能已经把旧的方法给舍弃了!这时读报错信息就了然了,如下图

 

 

下图是原先的报错:报的是没有方法

错误方法所在的类:

 

8.最后解决:把glide-transformations的Glide依赖去掉,让它用兼容LoopViewPager的旧版本Glide,或者换个无限循环ViewPager框架,或者让LoopViewPager的作者升级它的开源控件,或者自己去升级!

 

9.解决这个问题所获得的成长:

1.as是怎么执行,打包,生成apk的,直接一路执行下来

2.as的依赖结构和写法

3.依赖树

4.com.android.support 下的v4,v7,design,viewpager,recycleview,cardview等等的关系和它们之间的相互包含!

比如:

com.android.support:design:23.0.1

com.android.support:cardview -v7:26.0.1

其中前者包含后者,到也可以单独把后者拿出来用,缩小apk大小,瘦身!

5.Android下的各种Debug、Release等开发环境切换

6.这次的解决问题也更加坚信了报错信息重要性,一定要坚持相信报错信息是绝对有用的,精确的,如果问题棘手,一定要确保已经完全翻译读懂报错信息,如果还解决不了,再去通过看代码,注释代码排除的方式解决

7.注意:经实践,这样设置是不行的,必须按照之前看的那篇教程用api来设置排除(错解,原来只是多了:glide后缀)

implementation ('com.github.open-android:LoopViewPager:2.0.0'){

exclude group: 'com.github.bumptech.glide:glide'

}

正确的设置

api ("com.github.open-android:LoopViewPager:2.0.0"){

exclude group: 'com.github.bumptech.glide'

exclude group: 'com.android.support'

}

最后发现用implementation也是可以的,只是必须要有()引号是单引或者双引无所谓’”

implementation ("com.ruffian.library:RWidgetHelper:1.0.0"){

exclude group: 'com.android.support'

}

end

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值