解决 Android 依赖冲突
问题原因就是,各个模块所有的依赖(递归)的 jar 包最后都会加载到安卓的项目中,你可以选择 project 形式查看 External Libraries,都在这了。所以解决问题关键就是干掉冲突,剩下一个就行了,或者全不要就行了!
下面直接先上解决办法吧,急性子就不为难急性子了,本人最烦的就是说一大堆废话,后面几行代码就能问题。
1、引入时剔除
    //逗号别掉了implementation 'com.ezviz.sdk:ezuikit:2.2.1', {exclude group: 'com.squareup.okhttp3', module: 'okhttp'}//或者用下面方式
//    implementation('com.ezviz.sdk:ezuikit:2.2.1') {
//        exclude group: 'com.squareup.okhttp3', module: 'okhttp'
//    }
这里直接拿我解决的 SDK 为例,其中 okhttp 冲突了。我的项目里面已经有一个 okhttp:3.8.1 了,这里导入这个库的时候,又将 okhttp:3.10.0 给导入进来了,直接排除掉就可以,具体说明文章末尾细讲!
至于 group 和 module,可以看我下面这个引入,类比下:
com.squareup.okhttp3:okhttp:3.10.0
2、全局删除
android{//....//剔除工程中所有的该依赖configurations {all*.exclude group: 'org.hamcrest', module: 'hamcrest-core'}
}
这个是一个很傻的办法,直接全局设定,把导入的某 jar 包全部删除,这样就不冲突了?也许打包是没问题了,只要用到功能必闪退吧!(貌似有人说要配合 Multidex 一起用,看看咯!)
(ps. 后续更新:有可能是其他库带来的,其实根本用不到,还是有用的)
3、开启 Multidex 功能
我是想不到 jar 包冲突和 Multidex 有什么关系,但是看到几篇博客说能解决问题,也顺便说一下吧!我个人认为 Multidex 就是解决 class 过多的,不知道是不是。
(ps. 后续更新:是不是可能引入的库造成了类太多了?)
步骤 1:更改 build.grade
defaultConfig {...// Enabling multidex support.multiDexEnabled true
}dependencies {...compile 'com.android.support:multidex:1.0.1'
}
步骤 2:设置 Application 类
public class MyApplication extends Application {@Overridepublic void onCreate() {super.onCreate();MultiDex.install(this);}
}
步骤 3:更改 grade.properties
org.gradle.jvmargs=-XX:MaxHeapSize\=2048m -Xmx2048m
步骤 4:通过增大可用内存解决「:app:transformClassesForDexForDebug」异常,在 gradle.build 中指定 javaMaxHeapSize:
android {...dexOptions {javaMaxHeapSize "4g" //specify the heap size for the dex process}
}
4、强制修改版本
这个办法在网上见的多,大致就是在模块的 gradle 文件里面强制使用某一个版本的 jar 包,这样就不会下载两个 jar 包了。
我是发现没什么用,网上有的说放根目录,有的说放 android 里面,我不确定放哪啊!我是都试了,没效果,可能运行项目的姿势不对喽?
(ps. 后续更新:放在 gradle 中最外层就可以,亲测有用。
 在不清楚在那里引入的库的话,切换到project目录,看看哪个重复了,统一下版本,很有用!)
android{//....//放在这???  
}
//根节点???
configurations.all {//resolutionStrategy.force 'com.squareup.okhttp3:okhttp:3.10.0'resolutionStrategy.eachDependency { DependencyResolveDetails details ->def requested = details.requestedif (requested.group == 'com.google.android.exoplayer') {if (!requested.name.startsWith("multidex")) {details.useVersion '2.9.3'}}}
}
还有人说可以在工程的 gradle 中强制设置,我是发现也是没什么用,提一下。
allprojects {...configurations.all {resolutionStrategy.force 'com.squareup.okhttp3:okhttp:3.10.0'}
}
5、自行删除
这个方法我觉得可以解决特定问题,但局限性很大。
我们知道别人的依赖我们是无法修改的,但是自己本地 lib 是可以删除,如果是和我们本地的 jar 包冲突的话,我们删掉自己的就行了。
这个解决办法有局限性,一个是要求冲突的 jar 包在我们本地(可以操作),另一个如果我们用的版本较高,而别人的版本较低怎么办?那岂不是凉凉,此为下策!
6、使用 compileOnly
compileOnly 的形式引入库会只在编译时有效,不参与打包,它是解决一个什么问题呢?其实就是多个模块中,会冲突的库,让其中一个 implementation ,其他使用 compileOnly,最后出来能够共用一个库(当然要有一个)。
那这个办法和解决我们的问题有什么关联呢?其实这个办法和第二个方法类似,目的就在打包,引入的库的时候将 implementation 改为 compileOnly,让引入的库只在编译时有效,不会参与打包,这样就能够打包了。
这个问题也很明显,我要是能找到冲突的库,让它单独 compileOnly 固然能解决问题,可是事与愿违,我们冲突的库一般都是在别人的库里面,如果直接将所有内容以 compileOnly 形式导入,我们百分百要用到这个库里面的东西啊,一用就会闪退,最终只是自欺欺人罢了!
(ps. 后续更新:年少轻狂啊!作为SDK提供给别人用得到啊)
好了,上面就是解决依赖冲突的几种办法了,推荐第一个,其他有些鸡肋。
依赖分析
这里将一下我们如何定位冲突,实际上编译的时候就会报错了,如下:
Execution failed for task ':app_vs:checkDebugDuplicateClasses'.Duplicate class okhttp3.Address found in modules jetified-okhttp-3.10.0.jar (com.squareup.okhttp3:okhttp:3.10.0) and jetified-okhttp-3.8.1.jar (okhttp-3.8.1.jar)
这里就是提示我 jetified-okhttp-3.10.0.jar 和 jetified-okhttp-3.8.1.jar 有冲突了,不过这还是比较简单的信息,下面介绍使用 gradlew 分析。
使用 gradlew 分析
查看依赖关系需要用到的命令为:
gradlew :[module_name]:dependencies
如需分析工程中app这个module的依赖关系行命令则为 :
gradlew :app:dependencies --configuration releaseRuntimeClasspath
从下面的关系树可以看到各个依赖之间的关系,以及依赖版本号合并后的最终版本号
+--- com.android.support:support-core-utils:28.0.0 (*)
|    |    |    +--- com.android.support:customview:28.0.0
|    |    |    |    +--- com.android.support:support-annotations:28.0.0
|    |    |    |    \--- com.android.support:support-compat:28.0.0 (*)
|    |    |    +--- com.android.support:viewpager:28.0.0
|    |    |    |    +--- com.android.support:support-annotations:28.0.0
|    |    |    |    +--- com.android.support:support-compat:28.0.0 (*)
|    |    |    |    \--- com.android.support:customview:28.0.0 (*)
|    |    |    +--- com.android.support:coordinatorlayout:28.0.0
如果你不想在命令终端中查看,而是想把依赖关系输出到文件中,则可以使用以下命令:gradlew :[module_name]:dependencies > [output_file]
例如将app module的依赖关系输出到dependence.txt文件中:gradlew :app:dependencies > dependence.txt
简单小结
实际上这些内容应该写在最前面的,但是我觉得解决问题优先,实际上上面得内容看起来还是有点摸不着头脑的,虽然可能能解决你的问题。
依赖
上面我们通过 gradlew 命令能够看到,实际上我们项目的依赖是一种树的关系,每个模块、每个库都会直接或间接地引用别的库,最后汇总到我们地安卓项目中。
点开顶部地 Project Structure ,选择 Dependencies ,我们可以看到自己地一些库

而选择 Project 目录后,我们可以看到所有的库(aar/jar)

为什么会冲突,实际上就是这个汇总问题,当所有库都放一起了,加入有两个版本不一致的库,岂不是有两个jar(aar) 包?所以有了我们上面的解决办法,去掉一个,或者全去掉。
冲突
我们一直讲的冲突,却没有说到为何冲突,实际上冲突有下面这些形式:
-  项目自己引用的 jar 包重复 
-  项目中 jar 包和第三方库(module、远程库、aar、jar)冲突 
-  第三方库之间的冲突 
如果是我们自己的,很好办,可以自己随便操作(删除或修改),如果是第三方的就改不了,只能在引入库的时候排除掉。(如果功能都用不到,删除了也没问题)
结语
以上就是解决依赖冲突的一些办法,这里有两点内容,希望读者再了解了解,说不定对依赖有更深的理解:
-  Gradle 导入方式(implementation、api、compileOnly等) 
-  混淆 
相关文章:
 
解决 Android 依赖冲突
解决办法 问题原因就是,各个模块所有的依赖(递归)的 jar 包最后都会加载到安卓的项目中,你可以选择 project 形式查看 External Libraries,都在这了。所以解决问题关键就是干掉冲突,剩下一个就行了…...
 
前端设计模式基础笔记
前端设计模式是指在前端开发中经常使用的一些解决问题的模式或思想。它们是经过实践证明的最佳实践,可以帮助我们更好地组织和管理我们的代码。 一、单例模式(Singleton Pattern) 单例模式是一种创建型模式,它保证一个类只有一个…...
 
Python项目开发:Flask基于Python的天气数据可视化平台
目录 步骤一:数据获取 步骤二:设置Flask应用程序 步骤三:处理用户输入和数据可视化 步骤四:渲染HTML模板 总结 在这个数字化时代,数据可视化已经成为我们理解和解释信息的重要手段。在这个项目中,我们…...
 
Dell 服务器常见报错信息汇总
Dell 服务器常见报错汇总 如果有别的报错信息欢迎补充...
算法通关村-----贪心面试大热门之区间问题
判断区间是否重叠 问题描述 给定一个会议时间安排数组intervals,每个会议时间都包括开始时间和结束时间,intervals[i] [starti,endi],请你判断一个人是否能够参加这里面的全部会议。详见leetcode252 问题分析 先将会议安排数组按照开始时间排序&…...
OAK相机:自动或手动设置相机参数
OAK相机:自动或手动设置相机参数 硬件软件 硬件 使用硬件如下: 4✖️ov9782相机OAK-FFC-4P驱动板 硬件接线参考博主的一篇博客:OAK相机:多相机硬件同步拍摄 软件 博主使用的是Ubuntu18.04系统,首先配置所需的pytho…...
 
百家宴焕新上市,持续深耕100-300元价位段
执笔 | 尼 奥 编辑 | 古利特 4月8日,长江酒道曾在《百家宴谋划“晋级”之路,多措并举切分宴席市场“蛋糕”》一文中提到:“百家宴主力新品即将登场,市场政策灵活焕新。” 如今,百家宴新品及市场新政,正…...
 
Linux Debian12使用git将本地项目上传到码云(gitee)远程仓库
一、注册码云gitee账号 这个可以参考其他教程,本文不做介绍。 gitee官网:https://gitee.com/ 二、Linux Debian12安装git 如果Linux系统没有安装git,可以使用下面命令安装git sudo apt install git 三、gitee新建仓库 我这只做测试&…...
 
电子烟行业常用的英文表达
1. 电子烟的各种表达 a) 电子烟 i. Electronic-cigarette, ii. Electronic smoke, iii. electronic cigarettes iv. Electric cigarette, v. E-Cigarettes vi. e-cigarette, vii. e-Cig viii. E cigar,e-cigar 电子烟雪茄 2. 电子烟特指词汇及衍生 a) VAPE i. Vapo…...
 
【SpringMvc 丨跨域】
Spring MVC 支持跨域处理(CORS)。 CORS 简介处理CORS 过滤器CrossOrigin注解java配置xml配置 主页传送门:📀 传送 简介 跨域是指在浏览器的同源策略下,不能执行其他网站的脚本。它是由浏览器的安全限制造成的…...
【C语言】【strlen函数的使用与模拟实现】
1.strlen函数的使用和模拟实现 1.1使用: size_t strlen(const char* str)返回类型为无符号整型,参数是字符指针 计算的是字符串中到“\0"之前的字符个数 1.2模拟实现: 方法一:计数器式遍历 #include<stdio.h> #in…...
 
类和对象【基础概念】
全文目录 类的定义定义方式 类的访问限定符封装(面向对象的三大特性之一) 类对象模型类对象的存储方式类对象的大小计算 this指针this指针的特性**this指针可以为空吗?** 类的定义 在C中,C语言中的结构体struct中除了定义变量外还…...
如何测试生成式人工智能(AIGC)
简介:在人工智能日趋普及的今天,生成式人工智能(AIGC)已经成为不可忽视的一个分支。从自动化生成新闻、编写代码到图像和音频生成,AIGC几乎无处不在。但如何确保这些生成的内容达到预期标准、安全可靠,同时…...
 
机器学习算法详解3:逻辑回归
机器学习算法详解3:逻辑回归 前言  本系列主要对机器学习上算法的原理进行解读,给大家分享一下我的观点和总结。 本篇前言  本篇对逻辑回归的算法原理进行解读。 目录结构 文章目录 机器学习算法详解3:逻辑回归1. 引子2. sigmoid函数3. 原…...
linux命令集合
cd:切换文件路径 pwd:显示当前所处的路径 mkdir:创建目录比如mkdir test touch:创建一个空文件touch test.txt in:用于指定文件夹在另一个位置建立同步的链接in -s /lib/test1 /user/lj 在user目录下建立指向/lib/test1 目录的lj文件 cat:cat file(查看文件内…...
 
实现卓越供应链:RFID技术的革命性应用
在现代制造业中,供应链和物流的高效运作至关重要,它不仅影响着生产效率,还直接关系到企业的竞争力和客户满意度。为了应对这些挑战,越来越多的企业开始关注智能制造RFID智能设备,将其应用于供应链和物流管理࿰…...
 
从JVM角度看继承
从JVM角度看继承 最近重读了周志明老师的《深入理解JAVA虚拟机》一书,看完大有收获,但仍对继承情况下对象内存布局有所疑惑,所以查阅资料,结合本书进行分析 参考文档: 【深入理解JVM】:Java类继承关系中…...
 
基于Python和mysql开发的看图猜成语微信小程序(源码+数据库+程序配置说明书+程序使用说明书)
一、项目简介 本项目是一套基于Python和mysql开发的看图猜成语微信小程序,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Python学习者。 包含:项目源码、项目文档、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都…...
 
Unity入门教程||创建项目(上)
一、介绍 目的:通过尝试制作一款使用玩家角色把小球弹飞的简单小游戏,熟悉使用Unity进行游戏开发的基本流程。 软件环境:Unity 2017.3.0f3,Visual Studio 2013 二、创建新项目 1,启动Unity后将出现一个并列显示Pro…...
Openbmc编译
1.网址的问题解决 原文 Modifying /conf/local.conf was the only solution that worked for me. Simply add one of the two options:#check connectivity using google CONNECTIVITY_CHECK_URIS "https://www.google.com/"#skip connectivity checks CONNECTIVI…...
 
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
 
Module Federation 和 Native Federation 的比较
前言 Module Federation 是 Webpack 5 引入的微前端架构方案,允许不同独立构建的应用在运行时动态共享模块。 Native Federation 是 Angular 官方基于 Module Federation 理念实现的专为 Angular 优化的微前端方案。 概念解析 Module Federation (模块联邦) Modul…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
 
学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...
Java 二维码
Java 二维码 **技术:**谷歌 ZXing 实现 首先添加依赖 <!-- 二维码依赖 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>3.5.1</version></dependency><de…...
 
MFC 抛体运动模拟:常见问题解决与界面美化
在 MFC 中开发抛体运动模拟程序时,我们常遇到 轨迹残留、无效刷新、视觉单调、物理逻辑瑕疵 等问题。本文将针对这些痛点,详细解析原因并提供解决方案,同时兼顾界面美化,让模拟效果更专业、更高效。 问题一:历史轨迹与小球残影残留 现象 小球运动后,历史位置的 “残影”…...
 
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
 
抽象类和接口(全)
一、抽象类 1.概念:如果⼀个类中没有包含⾜够的信息来描绘⼀个具体的对象,这样的类就是抽象类。 像是没有实际⼯作的⽅法,我们可以把它设计成⼀个抽象⽅法,包含抽象⽅法的类我们称为抽象类。 2.语法 在Java中,⼀个类如果被 abs…...
 
《信号与系统》第 6 章 信号与系统的时域和频域特性
目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...
