Android開發之——依賴沖突Program type already present


前言

實際開發中,為了提高開發速度和效率,總避免不了引用第三方提供的依賴和類庫,如果含有相同依賴的類庫被我們引用時,而他們的版本又不相同,就有可能會導致一系列問題和異常,本文結合本人時間總結和他人經驗,稍作總結。

問題

依賴

下面是一個項目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同一版本

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM