AndroidX 和 v4包中的类冲突 Multiple dex files define

项目用的AndroidX开发 导入Glide图片加载依赖提示类冲突Multiple dex files define异常编译不通过

首先 项目已经用AndroidX开发百分之80以上 不肯能去除AndroidX相关的东西 Glide又是必须的 但是Glide里面有v4依赖 不能排除 也就是说 两者全都要

问题研究
在项目中并没有导入任何v4包相关的东西 只有Glide里面有依赖v4包的东西 那么 为什么会提示类冲突呢

问题查找
首先去除Glide依赖 Gradle 同步一下 然后在项目中随便找个类 导入之前编译时 提示冲突的类
我这里是ResultReceiver类冲突

Multiple dex files define Landroid/support/v4/os/ResultReceiver$1;

然后在类里面写这个类的路径
AndroidX 和 v4包中的类冲突 Multiple dex files define
将项目切换类型
AndroidX 和 v4包中的类冲突 Multiple dex files define
然后回到代码 点击跟踪类的上一级包
AndroidX 和 v4包中的类冲突 Multiple dex files define
IDE就会在侧边自动打开对应包所在的依赖
AndroidX 和 v4包中的类冲突 Multiple dex files define
如图可以看到 这个v4包所在依赖包为androidx.core:core的aar
问题来了 为啥AndroidX的core里面还要加入一个不完全的v4包?这就很迷 不知道Google怎么想的

好 那么问题定位到了 就好办了 在项目依赖中找到这个依赖
AndroidX 和 v4包中的类冲突 Multiple dex files define
??? 妈惹法克 没有在这里吗 那是哪来的呢???

好吧 应该是某个依赖里面的依赖 用gradle查找吧 命令行安排

./gradlew :模块名字:dependencies

AndroidX 和 v4包中的类冲突 Multiple dex files define我这里是app模块 那命令就是

./gradlew :app:dependencies

开始查找AndroidX 和 v4包中的类冲突 Multiple dex files define

查找完毕 然后搜索这个依赖
AndroidX 和 v4包中的类冲突 Multiple dex files define
然后发现好几个AndroidX的依赖都依赖这个包
gradle各种排除方法可以参考这个链接
好吧 那都排除掉(这是最细粒度的排除 如果要排除的比较多 可以配置全局统一排除)
AndroidX 和 v4包中的类冲突 Multiple dex files define
统一排除方法如下 这样强迫症也能接受

configurations {
    compile.exclude group: 'androidx.core', module: 'core' //重点
    //all*.exclude group:''androidx.core', module: 'core'  这样也行
}

dependencies {
    implementation fileTree(include: ['*.jar', '*.aar'], dir: 'libs')
    implementation 'androidx.appcompat:appcompat:1.1.0-alpha03'
    implementation 'com.google.android.material:material:1.1.0-alpha04'
    implementation 'androidx.legacy:legacy-support-v4:1.0.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    }

这里给使用了这个core的依赖都加上排除

 exclude group: 'androidx.core', module: 'core'

注意要指明module 分号前面的是group 后面的是module
AndroidX 和 v4包中的类冲突 Multiple dex files define

然后重点来了 core依赖排除了 那肯定不行的 这个依赖是必须的 那么怎么办呢
gradle的maven依赖 都是要下载到本地缓存中才能使用的 那么我们就去缓存找这个下载下来的依赖文件
怎么找呢 我这是Mac的系统 路径如下

/Users/用户名/.gradle/caches

打开目录 然后搜索core
AndroidX 和 v4包中的类冲突 Multiple dex files define

找到对应版本的aar包文件
AndroidX 和 v4包中的类冲突 Multiple dex files define
复制出来 用zip压缩工具打开 找到classes.jar 解压出来
AndroidX 和 v4包中的类冲突 Multiple dex files define
然后用压缩文件工具打开classes.jar 可以看到 展开的v4包里面就有冲突的类文件 我的已经删除过一个文件了 所以没有如上提到的那个类文件
AndroidX 和 v4包中的类冲突 Multiple dex files define
可以看到 v4包的class就在这里了 既然我们的Glide里面有必要的v4类 吧冲突的class文件删除 我这里是v4类全部冲突我就整个删除了 你们的最好那个冲突删哪个
AndroidX 和 v4包中的类冲突 Multiple dex files define
删除完了 保存 然后把修改的classes.jar放回原来的aar包里面
AndroidX 和 v4包中的类冲突 Multiple dex files define
保存后 吧这个aar包复制到项目libs目录里面导入他
AndroidX 和 v4包中的类冲突 Multiple dex files define
然后同步一下gradle 编译试一下 如果还有冲突就重复如上步骤 吧冲突的类class删除再试 知道没有冲突为止。

OK 问题到此解决 这样搞也是没有办法而为之 反正我不推荐这样搞 对这些不太了解很容易出问题 或者埋下隐藏的问题 而且之后 如果原来依赖core包的依赖更新了 那这个 编辑过的aar也需要同步更新 否则也可能会出现问题。