当前位置: 首页 > news >正文

解决 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 中最外层就可以,亲测有用。
pic
在不清楚在那里引入的库的话,切换到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) 包?所以有了我们上面的解决办法,去掉一个,或者全去掉。

冲突

我们一直讲的冲突,却没有说到为何冲突,实际上冲突有下面这些形式:

  1. 项目自己引用的 jar 包重复

  2. 项目中 jar 包和第三方库(module、远程库、aar、jar)冲突

  3. 第三方库之间的冲突

如果是我们自己的,很好办,可以自己随便操作(删除或修改),如果是第三方的就改不了,只能在引入库的时候排除掉。(如果功能都用不到,删除了也没问题)

结语

以上就是解决依赖冲突的一些办法,这里有两点内容,希望读者再了解了解,说不定对依赖有更深的理解:

  1. Gradle 导入方式(implementation、api、compileOnly等)

  2. 混淆

相关文章:

解决 Android 依赖冲突

解决办法 问题原因就是,各个模块所有的依赖(递归)的 jar 包最后都会加载到安卓的项目中,你可以选择 project 形式查看 External Libraries,都在这了。所以解决问题关键就是干掉冲突,剩下一个就行了&#xf…...

前端设计模式基础笔记

前端设计模式是指在前端开发中经常使用的一些解决问题的模式或思想。它们是经过实践证明的最佳实践,可以帮助我们更好地组织和管理我们的代码。 一、单例模式(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配置 主页传送门:📀 传送 简介 跨域是指在浏览器的同源策略下,不能执行其他网站的脚本。它是由浏览器的安全限制造成的&#xf…...

【C语言】【strlen函数的使用与模拟实现】

1.strlen函数的使用和模拟实现 1.1使用&#xff1a; size_t strlen(const char* str)返回类型为无符号整型&#xff0c;参数是字符指针 计算的是字符串中到“\0"之前的字符个数 1.2模拟实现&#xff1a; 方法一&#xff1a;计数器式遍历 #include<stdio.h> #in…...

类和对象【基础概念】

全文目录 类的定义定义方式 类的访问限定符封装&#xff08;面向对象的三大特性之一&#xff09; 类对象模型类对象的存储方式类对象的大小计算 this指针this指针的特性**this指针可以为空吗&#xff1f;** 类的定义 在C中&#xff0c;C语言中的结构体struct中除了定义变量外还…...

如何测试生成式人工智能(AIGC)

简介&#xff1a;在人工智能日趋普及的今天&#xff0c;生成式人工智能&#xff08;AIGC&#xff09;已经成为不可忽视的一个分支。从自动化生成新闻、编写代码到图像和音频生成&#xff0c;AIGC几乎无处不在。但如何确保这些生成的内容达到预期标准、安全可靠&#xff0c;同时…...

机器学习算法详解3:逻辑回归

机器学习算法详解3&#xff1a;逻辑回归 前言 ​ 本系列主要对机器学习上算法的原理进行解读&#xff0c;给大家分享一下我的观点和总结。 本篇前言 ​ 本篇对逻辑回归的算法原理进行解读。 目录结构 文章目录 机器学习算法详解3&#xff1a;逻辑回归1. 引子2. sigmoid函数3. 原…...

linux命令集合

cd:切换文件路径 pwd:显示当前所处的路径 mkdir&#xff1a;创建目录比如mkdir test touch:创建一个空文件touch test.txt in:用于指定文件夹在另一个位置建立同步的链接in -s /lib/test1 /user/lj 在user目录下建立指向/lib/test1 目录的lj文件 cat:cat file(查看文件内…...

实现卓越供应链:RFID技术的革命性应用

在现代制造业中&#xff0c;供应链和物流的高效运作至关重要&#xff0c;它不仅影响着生产效率&#xff0c;还直接关系到企业的竞争力和客户满意度。为了应对这些挑战&#xff0c;越来越多的企业开始关注智能制造RFID智能设备&#xff0c;将其应用于供应链和物流管理&#xff0…...

从JVM角度看继承

从JVM角度看继承 最近重读了周志明老师的《深入理解JAVA虚拟机》一书&#xff0c;看完大有收获&#xff0c;但仍对继承情况下对象内存布局有所疑惑&#xff0c;所以查阅资料&#xff0c;结合本书进行分析 参考文档&#xff1a; 【深入理解JVM】&#xff1a;Java类继承关系中…...

基于Python和mysql开发的看图猜成语微信小程序(源码+数据库+程序配置说明书+程序使用说明书)

一、项目简介 本项目是一套基于Python和mysql开发的看图猜成语微信小程序&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Python学习者。 包含&#xff1a;项目源码、项目文档、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都…...

Unity入门教程||创建项目(上)

一、介绍 目的&#xff1a;通过尝试制作一款使用玩家角色把小球弹飞的简单小游戏&#xff0c;熟悉使用Unity进行游戏开发的基本流程。 软件环境&#xff1a;Unity 2017.3.0f3&#xff0c;Visual Studio 2013 二、创建新项目 1&#xff0c;启动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…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

STM32标准库-DMA直接存储器存取

文章目录 一、DMA1.1简介1.2存储器映像1.3DMA框图1.4DMA基本结构1.5DMA请求1.6数据宽度与对齐1.7数据转运DMA1.8ADC扫描模式DMA 二、数据转运DMA2.1接线图2.2代码2.3相关API 一、DMA 1.1简介 DMA&#xff08;Direct Memory Access&#xff09;直接存储器存取 DMA可以提供外设…...

【Java_EE】Spring MVC

目录 Spring Web MVC ​编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 ​编辑参数重命名 RequestParam ​编辑​编辑传递集合 RequestParam 传递JSON数据 ​编辑RequestBody ​…...

接口自动化测试:HttpRunner基础

相关文档 HttpRunner V3.x中文文档 HttpRunner 用户指南 使用HttpRunner 3.x实现接口自动化测试 HttpRunner介绍 HttpRunner 是一个开源的 API 测试工具&#xff0c;支持 HTTP(S)/HTTP2/WebSocket/RPC 等网络协议&#xff0c;涵盖接口测试、性能测试、数字体验监测等测试类型…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

day36-多路IO复用

一、基本概念 &#xff08;服务器多客户端模型&#xff09; 定义&#xff1a;单线程或单进程同时监测若干个文件描述符是否可以执行IO操作的能力 作用&#xff1a;应用程序通常需要处理来自多条事件流中的事件&#xff0c;比如我现在用的电脑&#xff0c;需要同时处理键盘鼠标…...

文件上传漏洞防御全攻略

要全面防范文件上传漏洞&#xff0c;需构建多层防御体系&#xff0c;结合技术验证、存储隔离与权限控制&#xff1a; &#x1f512; 一、基础防护层 前端校验&#xff08;仅辅助&#xff09; 通过JavaScript限制文件后缀名&#xff08;白名单&#xff09;和大小&#xff0c;提…...

HTTPS证书一年多少钱?

HTTPS证书作为保障网站数据传输安全的重要工具&#xff0c;成为众多网站运营者的必备选择。然而&#xff0c;面对市场上种类繁多的HTTPS证书&#xff0c;其一年费用究竟是多少&#xff0c;又受哪些因素影响呢&#xff1f; 首先&#xff0c;HTTPS证书通常在PinTrust这样的专业平…...

C++11 constexpr和字面类型:从入门到精通

文章目录 引言一、constexpr的基本概念与使用1.1 constexpr的定义与作用1.2 constexpr变量1.3 constexpr函数1.4 constexpr在类构造函数中的应用1.5 constexpr的优势 二、字面类型的基本概念与使用2.1 字面类型的定义与作用2.2 字面类型的应用场景2.2.1 常量定义2.2.2 模板参数…...