前言
實際開發中,為了提高開發速度和效率,總避免不了引用第三方提供的依賴和類庫,如果含有相同依賴的類庫被我們引用時,而他們的版本又不相同,就有可能會導致一系列問題和異常,本文結合本人時間總結和他人經驗,稍作總結。
問題
依賴
下面是一個項目build.gradle中的依賴,我們簡單做一下分類
網絡相關
- okhttp
- retrofit
- http-legacy
常用類庫
- rxpermission(權限監測)
- leakcanary(內存泄漏)
- BaseRecycleViewAdapterHelper(star較多的Adapter)
- rxjava2
- smartRefreshLayout(刷新)
不常用
- bmob(消息推送)
- jsoup(html解析器)
異常
查看異常
自帶工具查看
通過指令將異常保存
gradlew build --stacktrace > logs.txt 2>logErrors.txt
編譯前,請確認gradle環境變量已配置,關於build Task請查看Gradle總結。
通過上述指令,將信息分別保存到上述文件中(默認項目根目錄):
- logs.txt:編譯過程信息
- logErrors.txt:異常信息
分析異常
在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
- 具有獨立功能的模塊
- Module中可能還包含有Module
- implementation分號之后的部分
Group
- Module的集合
- 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為下面的內容:
- support-v4
- appcompat-v7
- recyclerview-v7
- transition
解決依賴
解決依賴本文提供兩種方式
exclude方式
特點:
- 配置較為麻煩,需要在引起沖突的每個依賴上進行exclude操作
- 配置繁瑣,不美觀
通過configurations方式
特點:
- 在configurations中,統一指定要配置的方式
- 配置簡單,較為整潔
通過configurations.all同一版本