编译的时候,我们经常遇到一些错误,比如 merge dex failed,很多时候是因为依赖冲突引起的:
- 我们如何排查是否是依赖冲突引起的?
- 对于依赖相同库的不同版本,我们该如何处理?
- 对于依赖了不同的 sdk 里面,竟然有相同的类(包名也一致),这种伤脑筋的情况,我们又该怎么处理?
本周1/1
更多问答 >>
-
2019-10-20 23:46
-
2019-10-23 00:10
-
2019-10-28 21:13
-
2019-11-03 23:50
-
2019-11-08 23:06
-
玩Android更新记录 [from 2019-10-02]
2019-10-08 21:44 -
2019-09-25 21:58
-
2019-09-23 01:01
-
2019-09-17 22:41
-
2019-09-15 23:30
排查是否是依赖冲突引起的:
1.笨方法:如果是依赖冲突通常构建是没问题的,但是运行就会报错,可以尝试去掉依赖,如果能运行成功,不用说肯定是其中某一个依赖引起.
2.通过日志排查,一般日志信息如下就可能是依赖冲突引起的:a.Unable to execute dex: Multiple dex files define Lcom/baidu/android/bbalbs/common/a/a;b.com.android.dex.dexExproception mutliple dex files define3.如果要排查具体是哪个包引起的,方法如下:a.双击 打开查看 gradle consonleb.然后双击(Run with –stacktrace)c. Ctrl +Shift +N 定位类所在jar包名d.、在Android Studio 的 Terminal 输入 ./gradle -q app:dependencies 命令 (使用Android Studio的gradle view插件也可以)找到引入这个jar包的文件稍微等一小会变回输出很多信息,这里我们只筛选“依赖树”,e.最后就是根据这个“依赖树”每层查找,找到相同的依赖,并使用以下所用方式逐个排查,这里只是举例,大家可以根据实际情况来排查,方法一样. implementation('com.android.support:appcompat-v7:26.1.0') { exclude module: 'support-v4' }对于依赖相同版本库的不同版本处理方法如下:
统一使用最新的版本,因为最新的版本解决了很多问题,如果项目的版本很低,那就使用一个稳定的版本.
解决不同版本有相同的类或者包名:
1.使用exclude 剔除掉多余的包
configurations { all.exclude group: 'com.android.support', module: 'transition' all.exclude group: 'com.android.support', module: 'support-media-compat'}2.直接修改第三方库中的jar包,将里面相同的包删除掉studio3.4版本的gradle consonle 在哪呢?
1.运行的时候就报错了,如果信息不够全,执行gradlew build,log会显示出哪些冲突了。另外在此建议,提供开源库时,删除多余属性配置,比如allowBackup
2.从as2.4开始,默认使用相同库最新的版本,不需要任何处理。如果新旧库不兼容,取舍一个冲突库,用另外的库代替。有时发现support类似库提示两个库版本不一致,那说明少引用了,将提示的版本低的库引入到项目,版本改为项目内的support最新版
3.发现了这个冲突,那基本上还没用多久,赶紧放弃一个用得少的库,用另外的替代。要是非要用,那可以这样,将两个jar转换成smali,将两个冲突类代码合并到一个smali中,重新生成class文件,替换到原jar中,删除另一个jar中同名文件。
解决冲突的思路:
包括support version compile version 还有第三方依赖版本等等
),具体请从External Library解决不同版本问题
解决不同SDK有相同类问题
exclude
使用命令 gradlew build scan 最终可以在浏览器中浏览项目依赖树, 轻松查看所有依赖版本