前言

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

问题

依赖

下面是一个项目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. Qt 学习之路 2(23):自定义事件

    Qt 学习之路 2(23):自定义事件  豆子  2012年10月23日  Qt 学习之路 2  21条评论 尽管 Qt 已经提供了很多事件,但对于更加千变万化的需求来说,有限的事件都是不够的.例如, ...

  2. C3算法之我见

    C3算法说到底就是merge算法,看了一些帖子,总结说得莫名其妙,大家也是抄来抄去,我试着用自己的话来把这个东西怎么操作的说清楚.当然了我也要抄一些别人的,但是我会 尽量把我认为别人没有讲清楚的那一部 ...

  3. Navicat安装教程、建表教程

    1.安装教程: 转自:https://www.jianshu.com/p/5f693b4c9468 2.使用教程(建表操作): https://jingyan.baidu.com/article/e6 ...

  4. Linux磁盘分区管理

    1.分区步骤          fdisk -l                                  查看系统中的磁盘 fdisk /dev/vdb                   ...

  5. 设定计划的SMART原则

    SMART: Specific,Measurable, Attainable,Result-based, Time-based 设定计划,如果不去执行,设定目标,而不去实现,那也算是背叛自己的诺言,终 ...

  6. Sqlite和mysql的区别及优缺点

    小型嵌入式,跟mysql差不多,但更小,功能也少,属于本地数据库多用于读多写少,100W以下的数据压力不大,不支持分布式.   真正开源的小型嵌入式数据库,支持事务.触发器器  性能至少优于mysql ...

  7. Spring配置问题:The prefix "util" for element "util:map" is not bound.

    在spring的头部文件中没有引入: xmlns:util=”http://www.springframework.org/schema/util” 原文:https://blog.csdn.net/ ...

  8. win7旗舰版+caffe+vs2013+matlab2014b(无GPU版)

    参考网站: http://www.cnblogs.com/njust-ycc/p/5776286.html 无法找到gpu/mxGPUArray.h: No such file or director ...

  9. sscanf()分割字符数组

    sscanf与scanf类似,都是用于输入的,只是后者以键盘(stdin)为输入源,前者以固定字符串为输入源. 头文件: #include<stdio.h> 或者 #include < ...

  10. 数据库版本管理工具flyway

    引入flyway_core  jar包 java 代码实现 public class FlywayMigration { @Resource private DataSource dataSource ...