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 ...
随机推荐
- 「NOI.AC」Leaves 线段树合并
题目描述 现在有一棵二叉树,所有非叶子节点都有两个孩子.在每个叶子节点上有一个权值(有\(n\)个叶子节点,满足这些权值为\(1\dots n\)的一个排列).可以任意交换每个非叶子节点的左右孩子. ...
- 各平台安装和使用Docker的差异
在Mac上运行Docker 使用Docker for Mac 系统要求 开启虚拟化的硬件支持,可以通过命令来检查:sysctl kern.hv_support OS X 10.10.3 或者更高版本 ...
- 解决spring使用动态代理
解决spring使用动态代理类型转换失败的问题--java.lang.ClassCastException: com.sun.proxy.$Proxy$ cannot be cast to ... 转 ...
- Rhino-- JavaScript
Rhino是JDK1.6里自带的一个Javascript Engine,不过他的书写风格好像有点不是很一样. importPackage(Packages.groovy.util); var o = ...
- 阿里云 Ubuntu14.04 部署 LAMP
1.更新软件源 sudo apt-get update 2.安装Apache sudo apt-get install apache2 3.查看Apache是否安装成功 apache2 –v 如下所示 ...
- Object与String
Object转为String的几种形式 在java项目的实际开发和应用中,常常需要用到将对象转为String这一基本功能.本文将对常用的转换方法进行一个总结.常用的方法有Object.toString ...
- SpringBoot中使用Servlet
1.在入口Application类上加入注解@ServletComponentScan @SpringBootApplication @ServletComponentScan public clas ...
- 2018.6.1学习CSS5里顺丰盒子小问题
在制作下面这样的小盒子时 编写的代码 首先要对li元素设置浮动. 在设置这个li元素下面的a元素时, 因为没有转行内块,inline-block,结果显示出来的页面,鼠标在经过这个选择时(:hover ...
- 使用ServletContainerInitializer动态注册组件
1.背景 在web容器(例如tomcat)启动时为提供给第三方组件机会做一些初始化的工作,例如注册servlet或者filtes等.对此servlet规范提供了ServletContainerInit ...
- python fork函数
import os print('---父进程id:%s----'%(os.getpid())) pid=os.fork()#只能在liunx环境下执行 print('---%s---' % (os. ...