studio 3.0 踩坑之DexArchiveMergerException: Unable to merge dex

比较蛋疼的一个问题,相信很多人都遇到过这个问题,原先的studio2.3版本是没有任何问题的,google在推出studio 3.0之后又莫名其妙在里面埋了一些坑。

事情的起因是这样的,公司给配置了新电脑,需要重新安装studio开发环境,作为一个与时俱进的程序员,当然要从原来的studio 2.3升级到3.0,于是就下载studio 3.0安装,经过漫长等待成功安装设置快捷键配置,动作自然流畅一气呵成,一切都很顺利。之后就开始导入原有的一些开发库进来,sync project之后好运到此结束,编译出错提示如下:


20180329221223.png

遇事不要慌先网上搜一发,搜索结果大致有两种解决方法:
1 gradle使用multidex选项。
在build.gradle中设置 defaultConfig {
multiDexEnabled true
}
然而自己项目报错的地方只是其中的一个demo模块,里面并不会出现方法数超过65535的情况,但还是抱着试试看的心态增加了该选项,再次编译发现没什么用,还是报上述错误,故该方法行不通

2 网上的第二种说法是项目中依赖了多个不同版本的库,导致在项目merge的时候发生错误,解决方法大同小异就是找到重名的不同版本库,统一使用一个版本就可以解决该问题。按照这种思路我仔细检查了demo工程中的依赖库,得到的结论就是项目中并没有发现什么重复的库,libs文件下也没有多余的jar可能会引起问题,到底是什么问题会引起这个编译问题。仔细看了下gradle里面的配置,发现如下报错信息


屏幕快照 2018-03-30 下午5.14.56.png

大致意思就是v4和v7包版本不一致导致编译失败,比较诡异的就是v4 21.0.3这个库,可以非常肯定的是gradle中我并没有显式的依赖过这个v4包,那很可能的推测就是这个包是某个依赖库间接引入的,为了进一步确定问题,studio新建一个模块,将demo中gradle配置的compile依赖一个个拷贝到新模块中,然后编译运行新模块,发现居然能够成功运行,也就是说demo中依赖的库并不会引入v4 21.0.3,那就让我非常郁闷了compile的依赖库都不会引入v4 21.0.3,难道是其他gradle配置引起的???抱着试试看的心态我检查了下demo的gradle配置引起怀疑的就是关于databinding的gradle配置

dataBinding {
        enabled = true
    }

结果居然和我猜测的一样,当我把这几句注释掉重新编译运行后,成功运行!!!

猜测结论

dataBinding {
        enabled = true
    }

是google为了能够让开发者直接使用databinding,估计默默引入了一些依赖库,其中就包含了这个非常诡异的v4 21.0.3,别问我为什么这么多高版本的v4不用偏偏使用21.0.3,我猜测很可能是studio3.0的一个bug。

解决方法

既然找到了问题根源那如何解决这个问题,摸索了一阵发现了以下几个方法
1 直接注释掉databinding的gradle配置,该方法不太可取,万一你项目中有使用到databinding怎么办
2 保留databinding配置,引入高版本的v4包,摸索的结果,发现这个方法可行的也是比较推荐的做法。

    implementation 'com.android.support:support-v4:27.0.0'

重新编译后你就会发现原本报红线的
implementation 'com.android.support:appcompat-v7:27.0.0'正常了,demo也能成功运行起来
3 保留databinding配置,将原本项目中的compileSdkVersion 27修改成26,不需要重新引入v4,发现这种方法居然也可行!!那我猜测的结果就是27的sdk可能和databinding存在某种冲突才会导致databinding莫名其妙引入了v4 21.0.3

以上就是我新装studio 3.0引起的问题,算是自己踩过的一个大坑,花了自己不少时间去排查问题,要想踩到这个坑你需要满足以下条件
(1)新装studio3.0开发环境(从2.3升级上来是否有这个问题不知道,不过很大概率是存在的)
(2)你使用了databinding的gradle配置&&你使用了sdk27,注意是&&的关系不是 | |,能让我踩到这个坑也算自己走了狗屎运
个人感觉开发工具这种东西够用就好,不要花太多的时间去升级工具上,你永远不知道升级会带来什么莫名其妙的问题!!!


最近又思考了下这个问题,发现了一个特别好用的方法可以查看项目中的依赖关系,在studio的cansol中输入类似命令

./gradlew app:dependencies

app就是项目的模块名字,dependencies是gradle提供的查看依赖的一个task,输入上述命令后工程当中自己的app模块会打印出对应信息

+--- com.android.databinding:library:1.3.1
|    +--- com.android.support:support-v4:21.0.3
|    |    \--- com.android.support:support-annotations:21.0.3 -> 27.1.0
|    \--- com.android.databinding:baseLibrary:2.3.0-dev -> 3.0.1
+--- com.android.databinding:baseLibrary:3.0.1
+--- com.android.databinding:adapters:1.3.1
|    +--- com.android.databinding:library:1.3 -> 1.3.1 (*)
|    \--- com.android.databinding:baseLibrary:2.3.0-dev -> 3.0.1
+--- com.android.support:multidex-instrumentation:1.0.2
|    \--- com.android.support:multidex:1.0.2
\--- com.android.support:appcompat-v7:27.1.0
     +--- com.android.support:support-annotations:27.1.0
     +--- com.android.support:support-core-utils:27.1.0
     |    +--- com.android.support:support-annotations:27.1.0
     |    \--- com.android.support:support-compat:27.1.0
     |         +--- com.android.support:support-annotations:27.1.0
     |         \--- android.arch.lifecycle:runtime:1.1.0
     |              +--- android.arch.lifecycle:common:1.1.0
     |              \--- android.arch.core:common:1.1.0
     +--- com.android.support:support-fragment:27.1.0
     |    +--- com.android.support:support-compat:27.1.0 (*)
     |    +--- com.android.support:support-core-ui:27.1.0
     |    |    +--- com.android.support:support-annotations:27.1.0
     |    |    +--- com.android.support:support-compat:27.1.0 (*)
     |    |    \--- com.android.support:support-core-utils:27.1.0 (*)
     |    +--- com.android.support:support-core-utils:27.1.0 (*)
     |    +--- com.android.support:support-annotations:27.1.0
     |    +--- android.arch.lifecycle:livedata-core:1.1.0
     |    |    +--- android.arch.lifecycle:common:1.1.0
     |    |    +--- android.arch.core:common:1.1.0
     |    |    \--- android.arch.core:runtime:1.1.0
     |    |         \--- android.arch.core:common:1.1.0
     |    \--- android.arch.lifecycle:viewmodel:1.1.0
     +--- com.android.support:support-vector-drawable:27.1.0
     |    +--- com.android.support:support-annotations:27.1.0
     |    \--- com.android.support:support-compat:27.1.0 (*)
     \--- com.android.support:animated-vector-drawable:27.1.0
          +--- com.android.support:support-vector-drawable:27.1.0 (*)
          \--- com.android.support:support-core-ui:27.1.0 (*)

这里就清楚的记录了项目的依赖关系,从上述关系就可以发现com.android.databinding:library:1.3.1依赖了v4的21.0.3版本,也正是这个v4版本导致的
DexArchiveMergerException: Unable to merge dex问题

你可能感兴趣的:(studio 3.0 踩坑之DexArchiveMergerException: Unable to merge dex)