前言

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

问题

依赖

下面是一个项目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. loj #6235. 区间素数个数 min_12.5筛

    \(\color{#0066ff}{ 题目描述 }\) 求 \(1\sim n\) 之间素数个数. \(\color{#0066ff}{输入格式}\) 一行一个数 n . \(\color{#0066 ...

  2. 「产品经理全连接系列1」Epic/Feature/Story/Task/Bug到底是什么

    大家好,我是华为云的产品经理 恒少: 作为布道师和产品经理,出差各地接触客户是常态,经常和华为云的客户交流.布道.技术沙龙,但是线下交流,覆盖的用户总还是少数. 我希望可以借线上的平台,和用户持续交流 ...

  3. Buy or Build UVA - 1151 Kruskal+枚举

    题意: 大概意思是有 n 个点,现在有 q 个方案 ,第 i 个方案耗费为 ci ,使 Ni 个点联通 ,当然也可以直接使两点联通 ,现求最小生成树的代价. 两点直接联通的代价是欧几里得距离的平方: ...

  4. pytorch tensor与numpy转换

    从官网拷贝过来的,就是做个学习记录.版本 0.4 tensor to numpy a = torch.ones(5) print(a) 输出 tensor([1., 1., 1., 1., 1.]) ...

  5. Common Subsequence(最长公共子序列)

    A subsequence of a given sequence is the given sequence with some elements (possible none) left out. ...

  6. linux学习3(vim)

    一.文档编辑 1. vi和vim命令 Vim的打开文件的方式(4种,要求掌握的就前三种): 1. vim 文件路径                                            ...

  7. Linux磁盘分区管理

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

  8. python3 repr()函数笔记

    a=[1,2,3,4]print(repr(a))print(type(repr(a)))for i in repr(a): print(i)#repr函数是将对象转换成string类型

  9. spring boot 入参方式

    方式: 1).直接写,如public User index2(String name) 2).@RequestParam 与直接写的区别是,可以写默认值. 3).@RequestBody 因为传入的是 ...

  10. 创建第一个vue工程

    vue创建项目(npm安装→初始化项目) 第一步npm安装 首先:先从nodejs.org中下载nodejs   图1 双击安装,在安装界面一直Next   图2   图3   图4 直到Finish ...