android依赖冲突处理方案

从事Android开发时或多或少碰到过到过包含  transformDex,multipledex,doubledex,more than one,Unable to merge dex  等字眼的异常日志,然后项目编译不成功,无法运行。想看完整的关键信息又没有打印出来。只是提示你编译运行失败,让你去查看log。这样要么就凭着丰富编程经验解决,要么就各种度娘了[笑哭]。这篇文章粗略介绍一下本人碰到类似问题跟处理思路。

首先看到这些带transformDex,Unable to merge dex字眼的异常时不要一下子就下判断是属于依赖冲突。首先是重复执行几次clean,或者同步项目;或者可以尝试重启下AS。这种方式能解决属于那种项目原本就是没有问题,只是突然as不正常了,报出一些奇奇怪怪的错误。clean下或者重启as足矣。或者清空添加的依赖缓存,重新下载依赖,清空依赖缓存命令:

gradlew build --refresh-dependencies

还有一种情况也会误导开发者认为是依赖的原因,但其实是65535问题,只因那些错误信息相似,没看仔细。(当然我就是其中之一啦[捂脸])。不过那些错误信息真的是相似,如果没有仔细看清楚,就会耽误很多时间。也顺便说下常规处理65535问题的方案。

先添加分包需要的依赖,请忽略这个较低级的版本。

implementation 'com.android.support:multidex:1.0.0'

在 android 下 的 defaultConfig 添上这么一句代码:

 multiDexEnabled true

最后在自己项目里新建一个Application继承 Android的 Application添上如下代码。也可以不用继承Android的Application类,而是继承MultiDexApplication 类。继承这个类就不用重写 attachBaseContext方法了。最后,不要忘了在清单文件里配置自己的application类。

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }

上面说的都是依赖冲突假现象,接下来说的就是真真正正的了,完全是因为某个库的依赖后导致的了。 如果你的项目是因为刚刚添加了某个依赖导致的,那么你就查看下这个库下的哪一个依赖冲突了,在添加这个依赖的时候把它给过滤掉。具体写法如下。

 implementation('com.android.support:appcompat-v7:26.1.0') {
        exclude module: 'support-v4'
    }

//或者要把组名一起添上去
 implementation('com.android.support:appcompat-v7:26.1.0') {
        exclude group:'com.android.support',module: 'support-v4'
    }

( )里面的是你要添加的库,后面接{ },使用exclude module  加上对应的那个你要过滤掉的 module 名称。

还有就是如何查看到底是哪个依赖的哪个module冲突了。

 通过as下的控制台,运行下面命令,可以查看到项目当前模块下的所有依赖组成。 app 就是 app 模块。 哦我这个是在windows下的命令,mac的话好像要在前面加上 ./

 gradlew -q :app:dependencies

运行后就会出先类似下图的依赖树:

从这个依赖树结构图就可以很明显的看出来哪个包是属于哪个依赖下的了。当出现了依赖冲突或者有多个版本的时候,会在对应的依赖下出现 —>的标志,(原谅我没有找这样的图当例子)当然也不能认为有这个标志的module就是冲突的module,然后就exclude掉。因为后面还有带* 符号的。带*的表示忽略。所以这并不是要exclude掉的module。但是既然出现了那肯定是有在添加,找到那个带—> 而且后边没有* 的module exclude掉。(ps:本人也不是很确定这个依赖树就是这样看的,但是这样子操作却也能解决问题,有没有大佬指点一下,这个结构树到底是怎么看的(捂脸))。

最后如果觉得使用exclude写法太累了可以尝试下强制统一库版本的方法。在build.gradle文件加上这么一段代码,若需强制多个依赖,可以逗号分割。使用方式如下。

android{
   ...............
}
configurations.all {
    resolutionStrategy.force 'com.android.support:animated-vector-drawable:27.1.0',
'com.android.support:support-v4:27.1.0'
}

以上就是本人暂时了解到的关于依赖相关问题的处理方式,emmmm实力有限如果对以上有疑问或者有更加完美的处理方案 ,欢迎来与我讨论交流。

发布了46 篇原创文章 · 获赞 15 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/FooTyzZ/article/details/88838270