Android开发之——依赖冲突Program type already present

时间:2022-02-09 20:19:29

前言

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

问题

依赖

下面是一个项目build.gradle中的依赖,我们简单做一下分类
Android开发之——依赖冲突Program type already present

网络相关

  1. okhttp
  2. retrofit
  3. http-legacy

    常用类库

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

不常用

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

异常

当我们运行时,会发生异常
Android开发之——依赖冲突Program type already present

查看异常

自带工具查看

如果你觉得标识的不太清晰,可以点击如图所示图标,展开信息
Android开发之——依赖冲突Program type already present

通过指令将异常保存

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

编译前,请确认gradle环境变量已配置,关于build Task请查看Gradle总结。
Android开发之——依赖冲突Program type already present

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

  1. logs.txt:编译过程信息
  2. logErrors.txt:异常信息

logs、logErrors信息如下:
Android开发之——依赖冲突Program type already present

分析异常

在logErrors中看到Program type already present: okio.AsyncTimeout$1,如何查看是否有多个的Okio文件呢?

通过搜索栏查看

双击Shift,在搜索框中输入Okio,可以看到有2条okio的信息
Android开发之——依赖冲突Program type already present

在Terminal中输入指令

gradlew -q app:dependencies

Android开发之——依赖冲突Program type already present

在External Libraries中查看对应依赖

Android开发之——依赖冲突Program type already present

解决

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分别是哪些呢?
Android开发之——依赖冲突Program type already present

在Terminal中输入指令

gradlew -q app:dependencies

Android开发之——依赖冲突Program type already present

在 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

Android开发之——依赖冲突Program type already present

解决依赖

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

exclude方式

特点:

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

Android开发之——依赖冲突Program type already present

通过configurations方式

特点:

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

Android开发之——依赖冲突Program type already present

通过configurations.all同一版本

Android开发之——依赖冲突Program type already present