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 ...
随机推荐
- Tarjan缩点+LCA【洛谷P2416】 泡芙
P2416 泡芙 题目描述 火星猫经过一番努力终于到达了冥王星.他发现冥王星有 N 座城市,M 条无向边.火星猫准备出发去找冥王兔,他听说有若干泡芙掉落在一些边上,他准备采集一些去送给冥王兔.但是火星 ...
- 页面加载完成前的loading加载效果
/*loading.js*/ // 加载HTML图 var _LoadingHtml = '<div id="loadingDiv" style="position ...
- P3613 睡觉困难综合征(码力)
Luogu3613 实现细节较多,详见代码 #include<cstdio> #include<iostream> #include<cstring> #inclu ...
- Experimental Educational Round: VolBIT Formulas Blitz C
Description The numbers of all offices in the new building of the Tax Office of IT City will have lu ...
- HDU计算机学院大学生程序设计竞赛(2015’12)Happy Value
Problem Description In an apartment, there are N residents. The Internet Service Provider (ISP) want ...
- echarts和highcharts
highcharts是基于svg技术的 echarts基于canvas 后者可以在浏览器中实现3D图形 链接 ,这种效果highcharts是完全不可能做得到的.
- BeautifulSoup4模块的使用
1. 安装 pip3 install beautifulsoup42. 使用 from bs4 import BeautifulSoup obj = BeautifulSoup("HTML内 ...
- CROSS APPLY和 OUTER APPLY 区别详解
SQL Server 2005 新增 cross apply 和 outer apply 联接语句,增加这两个东东有啥作用呢? 我们知道有个 SQL Server 2000 中有个 cross joi ...
- my24_mysql索引-使用篇
索引提示 SELECT * FROM table1 USE INDEX (col1_index,col2_index) ; SELECT * FROM table1 IGNORE INDEX (col ...
- JS中==、===和Object.is()的区别
JS中==.===和Object.is()的区别 首先,先粗略了解一下这三个玩意儿: ==:等同,比较运算符,两边值类型不同的时候,先进行类型转换,再比较: ===:恒等,严格比较运算符,不做类型转换 ...