前言

实际开发中,为了提高开发速度和效率,总避免不了引用第三方提供的依赖和类库,如果含有相同依赖的类库被我们引用时,而他们的版本又不相同,就有可能会导致一系列问题和异常,本文结合本人时间总结和他人经验,稍作总结。

问题

依赖

下面是一个项目build.gradle中的依赖,我们简单做一下分类

网络相关

  1. okhttp
  2. retrofit
  3. http-legacy

    常用类库

  4. rxpermission(权限监测)
  5. leakcanary(内存泄漏)
  6. BaseRecycleViewAdapterHelper(star较多的Adapter)
  7. rxjava2
  8. smartRefreshLayout(刷新)

不常用

  1. bmob(消息推送)
  2. jsoup(html解析器)

异常

当我们运行时,会发生异常

查看异常

自带工具查看

如果你觉得标识的不太清晰,可以点击如图所示图标,展开信息

通过指令将异常保存

gradlew build --stacktrace > logs.txt 2>logErrors.txt

编译前,请确认gradle环境变量已配置,关于build Task请查看Gradle总结。

通过上述指令,将信息分别保存到上述文件中(默认项目根目录):

  1. logs.txt:编译过程信息
  2. 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

  1. 具有独立功能的模块
  2. Module中可能还包含有Module
  3. implementation分号之后的部分

Group

  1. Module的集合
  2. 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为下面的内容:

  1. support-v4
  2. appcompat-v7
  3. recyclerview-v7
  4. transition

解决依赖

解决依赖本文提供两种方式

exclude方式

特点:

  1. 配置较为麻烦,需要在引起冲突的每个依赖上进行exclude操作
  2. 配置繁琐,不美观

通过configurations方式

特点:

  1. 在configurations中,统一指定要配置的方式
  2. 配置简单,较为整洁

通过configurations.all同一版本

 

Android开发之——依赖冲突Program type already present的更多相关文章

  1. Android Studio 编译: Program type already present: XXX 解决方案

    3情况1:个例 build.gradle 中 dependencies { classpath 'com.android.tools.build:gradle:3.1.1' // } 改成 depen ...

  2. Android开发——View滑动冲突解决方案

    0. 前言   我们在Android开发--事件分发机制详解中深入学习了事件分发机制,为我们解决Android开发中的滑动冲突问题做了初步准备.针对滑动冲突这里给出两种解决方案:外部拦截法和内部拦截法 ...

  3. Error : Program type already present: android.support.design.widget.CoordinatorLayout$

    背景 因为公司一个app项目需要扩展,因为功能较多且较完整的流程与业务,而且和以前的业务关系不大,所以我整合到了 另外一个分包中(代号:newFunc,请注意是代号)进行依赖. 当我写完这部分业务开始 ...

  4. Android Studio Gradle依赖冲突

    版本冲突 Gradle提供了两种解决版本冲突的策略:Newest和Fail.默认策略是Newest,配置Fail模式: configurations.all { resolutionStrategy. ...

  5. Program type already present: android.support.v4.widget.EdgeEffectCompat

    1.确保所有依赖包的 implementation 'com.android.support:appcompat-v7:25.4.0'是一样的 2.确保最外层的build.gradle中增加如下代码: ...

  6. android:Program type already present: android.support.v4.app.INotificationSideChannel

    背景 这个错误的原因是:androidx和 android.support同时存在. 首先,网上有很多解答说这样处理: 在 gradle.properties 添加: android.useAndro ...

  7. Android studio Program type already present: com.****.BuildConfig

    Android studio 抛错,是因为有2个module在 AndroidManifest.xml 里面具有一样的package name,修改不同名字即可. 还有一种情况是多个module对同一 ...

  8. 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. ...

  9. 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 ...

随机推荐

  1. ios对new Date() 的兼容问题

    移动开发的一个小坑 我们一般这样创建一个日期变量 var d = new Date("2017-08-11 12:00:00"); 但是在ios上却是返回 invalid Date ...

  2. 设置SQL脚本大小敏感

    1.设置SQL脚本大小写不敏感 USE [master]  GO  ALTER DATABASE [DatabaseName] COLLATE Chinese_PRC_CI_AI  GO 2.设置大S ...

  3. Could not instantiate bean class [org.springframework.data.mongodb.core.MongoTemplate]

    org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'repositoryDa ...

  4. POJ1053 Set Me

    题目来源:http://poj.org/problem?id=1053 题目大意: 有一种牌,共有81张.每张牌有四个属性,每种属性有三种可能取值:形状(D,O,S),数字(1,2,3),颜色(R,G ...

  5. BAPC 2014:Button Bashing(暴力+bfs)

    题意: 给出n,m,代表微波炉有n个按钮,要求达到总时间为m 然后给出n个数,代表n个按钮能增加的时间,问最少几步,能够使得按出的总时间大于等于要求的时间,并且相差最小 输出最小的步数与相差的最小值 ...

  6. Codeforces Round #339 (Div. 2) A

    Description Programmer Rostislav got seriously interested in the Link/Cut Tree data structure, which ...

  7. pandas关于其他merge用法(df1的的列索引和df2的行索引对应时候的)

  8. md5,base64加密

    import java.security.MessageDigest; import org.apache.commons.codec.binary.Base64;import org.apache. ...

  9. SQL注入工具sqlmap的注入过程记录

    1.sqlmap的get注入 假设目标是 https://www.baidu.com/news.php?id=1&data=2 sqlmap语句 列库 sqlmap.py -u "h ...

  10. 提取SQL中用到的表

    dos2unix * for i in `ls` do :}` awk '{print tolower($0)}' "${i}"|grep -Eiw "from" ...