Android开发之——依赖冲突Program type already present
前言
实际开发中,为了提高开发速度和效率,总避免不了引用第三方提供的依赖和类库,如果含有相同依赖的类库被我们引用时,而他们的版本又不相同,就有可能会导致一系列问题和异常,本文结合本人时间总结和他人经验,稍作总结。
问题
依赖
下面是一个项目build.gradle中的依赖,我们简单做一下分类
网络相关
- okhttp
- retrofit
- http-legacy
常用类库
- rxpermission(权限监测)
- leakcanary(内存泄漏)
- BaseRecycleViewAdapterHelper(star较多的Adapter)
- rxjava2
- smartRefreshLayout(刷新)
不常用
- bmob(消息推送)
- jsoup(html解析器)
异常
当我们运行时,会发生异常
查看异常
自带工具查看
如果你觉得标识的不太清晰,可以点击如图所示图标,展开信息
通过指令将异常保存
gradlew build --stacktrace > logs.txt 2>logErrors.txt
编译前,请确认gradle环境变量已配置,关于build Task请查看Gradle总结。
通过上述指令,将信息分别保存到上述文件中(默认项目根目录):
- logs.txt:编译过程信息
- logErrors.txt:异常信息
logs、logErrors信息如下:
分析异常
在logErrors中看到Program type already present: okio.AsyncTimeout$1,如何查看是否有多个的Okio文件呢?
通过搜索栏查看
双击Shift,在搜索框中输入Okio,可以看到有2条okio的信息
在Terminal中输入指令
gradlew -q app:dependencies

在External Libraries中查看对应依赖

解决
Group与module的区别
要解决上述问题,首先要明白Group与module的区别,然而搜索了一遍,好像网上没有给出比较清晰的解释,而这些又是解决依赖冲突这些问题首先要明白的问题,本人在摸索中,稍微总结了一下(如有问题,还请包含)
Module
- 具有独立功能的模块
- Module中可能还包含有Module
- implementation分号之后的部分
Group
- Module的集合
- implementation分号之前的部分
实例分析
以下图为例,加入我们要了解com.android.support:design:26.1.0中,group和module分别是哪些呢?
在Terminal中输入指令
gradlew -q app:dependencies

在 Maven Repository中查找com.android.support:design:26.1.0
可以清晰的看到,group为:com.android.support,
module为下面的内容:
- support-v4
- appcompat-v7
- recyclerview-v7
- transition

解决依赖
解决依赖本文提供两种方式
exclude方式
特点:
- 配置较为麻烦,需要在引起冲突的每个依赖上进行exclude操作
- 配置繁琐,不美观

通过configurations方式
特点:
- 在configurations中,统一指定要配置的方式
- 配置简单,较为整洁

通过configurations.all同一版本

Android开发之——依赖冲突Program type already present的更多相关文章
- Android Studio 编译: Program type already present: XXX 解决方案
3情况1:个例 build.gradle 中 dependencies { classpath 'com.android.tools.build:gradle:3.1.1' // } 改成 depen ...
- Android开发——View滑动冲突解决方案
0. 前言 我们在Android开发--事件分发机制详解中深入学习了事件分发机制,为我们解决Android开发中的滑动冲突问题做了初步准备.针对滑动冲突这里给出两种解决方案:外部拦截法和内部拦截法 ...
- Error : Program type already present: android.support.design.widget.CoordinatorLayout$
背景 因为公司一个app项目需要扩展,因为功能较多且较完整的流程与业务,而且和以前的业务关系不大,所以我整合到了 另外一个分包中(代号:newFunc,请注意是代号)进行依赖. 当我写完这部分业务开始 ...
- Android Studio Gradle依赖冲突
版本冲突 Gradle提供了两种解决版本冲突的策略:Newest和Fail.默认策略是Newest,配置Fail模式: configurations.all { resolutionStrategy. ...
- Program type already present: android.support.v4.widget.EdgeEffectCompat
1.确保所有依赖包的 implementation 'com.android.support:appcompat-v7:25.4.0'是一样的 2.确保最外层的build.gradle中增加如下代码: ...
- android:Program type already present: android.support.v4.app.INotificationSideChannel
背景 这个错误的原因是:androidx和 android.support同时存在. 首先,网上有很多解答说这样处理: 在 gradle.properties 添加: android.useAndro ...
- Android studio Program type already present: com.****.BuildConfig
Android studio 抛错,是因为有2个module在 AndroidManifest.xml 里面具有一样的package name,修改不同名字即可. 还有一种情况是多个module对同一 ...
- Error: Program type already present: android.arch.lifecycle.LifecycleRegistry$1
com.firebaseui:firebase-ui-firestore:3.1.0 depends on android.arch.lifecycle:extensions:1.0.0-beta1. ...
- Error:Program type already present: android.arch.lifecycle.LiveData
Apparently, this is intended behavior: com.firebaseui:firebase-ui-firestore:3.1.0 depends on android ...
随机推荐
- SP18637 LAWRENCE - Lawrence of Arabia
\(\color{#0066ff}{ 题目描述 }\) 给定一个长度为n的序列,至多将序列分成m+1段,每段序列都有权值,权值为序列内两个数两两相乘之和.求序列权值和最小为多少? \(\color{# ...
- 树链剖分【洛谷P1505】 [国家集训队]旅游
P1505 [国家集训队]旅游 题目描述 Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T 城 ...
- USACO 1.1.1 YOUR RIDE IS HERE
众所周知,在每一个彗星后都有一只UFO.这些UFO时常来收集地球上的忠诚支持者.不幸的是,他们的飞碟每次出行都只能带上一组支持者.因此,他们要用一种聪明的方案让这些小组提前知道谁会被彗星带走.他们为每 ...
- 分析mybatis和jdbc的作用,已经原理
从jdbc的操作数据库来看:主要分为几步: 1 注冊载入JDBC驱动程序: 2 得到连接对象 Connection 3 创建 Statement对象 4 运行sql语句 5 处理结果 6 关闭资源释放 ...
- centos yum命令找不到包
https://blog.csdn.net/joe_le/article/details/80107832 yum install epel-release //扩展包更新包 yum updat ...
- eclipse安装阿里规范模板
https://github.com/alibaba/p3c/tree/master/p3c-formatter 1.代码模板(含注释等) 2.代码格式化
- ubuntu同时装有MXNet和Caffe框架
我阐述一下我遇到的问题:因为之前装过caffe,最近装了MXNet.MXNet可以运行,但import caffe就不行了,找不到模块. 那应该怎么处理呢??? 参考了一下这个网站:https://i ...
- /var 目录下文件系统
/var :日志文件/var/log:各种系统日志存放地*/var/log/message :系统信息默认日志文件 (非常重要)按周自动轮循/var/log/secure :记录登入系统信息文 ...
- my17_Mysql 主从切换
注意事项: 从库提升为主库read_only要设置为OFF原主库改为从库后,read_only要设置ONread_only=ON并不能对root生效,确保root不会进行数据写入从主库进行 flush ...
- ES6使用常量做为函数名
重点是 要给常量加一个中括号 就是这么任性~ [SET_INFO](state) { state.userInfo = { name: cookie.getCookie('name'), token: ...