登录

去注册

登录

注册

去登录

注册

每日一问 哪些依赖相关的问题会导致编译失败,该如何处理?

xiaoyang   2019-10-15   收藏

编译的时候,我们经常遇到一些错误,比如 merge dex failed,很多时候是因为依赖冲突引起的:

  1. 我们如何排查是否是依赖冲突引起的?
  2. 对于依赖相同库的不同版本,我们该如何处理?
  3. 对于依赖了不同的 sdk 里面,竟然有相同的类(包名也一致),这种伤脑筋的情况,我们又该怎么处理?

本周1/1

3

排查是否是依赖冲突引起的:

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 define
3.如果要排查具体是哪个包引起的,方法如下:
a.双击 打开查看 gradle consonle
b.然后双击(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包,将里面相同的包删除掉

回复
zktzktzkt : @淡然一笑 

studio3.4版本的gradle consonle 在哪呢?

2019-10-16 回复
2

1.运行的时候就报错了,如果信息不够全,执行gradlew build,log会显示出哪些冲突了。另外在此建议,提供开源库时,删除多余属性配置,比如allowBackup

2.从as2.4开始,默认使用相同库最新的版本,不需要任何处理。如果新旧库不兼容,取舍一个冲突库,用另外的库代替。有时发现support类似库提示两个库版本不一致,那说明少引用了,将提示的版本低的库引入到项目,版本改为项目内的support最新版

3.发现了这个冲突,那基本上还没用多久,赶紧放弃一个用得少的库,用另外的替代。要是非要用,那可以这样,将两个jar转换成smali,将两个冲突类代码合并到一个smali中,重新生成class文件,替换到原jar中,删除另一个jar中同名文件。

回复
2

解决冲突的思路:

  1. 查看所有版本是否一致 (包括support version compile version 还有第三方依赖版本等等),具体请从External Library
  2. 通过日志消息找出错误

解决不同版本问题

  1. 升级或者降级到相同依赖版本,或者直接使用一个版本依赖,另一个版本进行排除

解决不同SDK有相同类问题

  1. 排除方式 具体请参考 exclude使用
  2. 还有一种骚操作 就是进行直接用rar工具从内部进行删除,根据是,通常会冲突的相同类 包名都是一致的, 这样操作编译不会报错.
回复

删除留言

确认删除留言,会导致相关评论丢失?

取消 确定