使用Gradle開發(fā)中,或多或少都會(huì)引入三方庫(kù)工育,但是三方庫(kù)又會(huì)有自己的子依賴,那么真正依賴到版本中的版本是多少呢搓彻?其實(shí)官方也有給出查看方法如绸,官方說(shuō)明點(diǎn)這里嘱朽,采用以下方式可查看:
一. 查看依賴版本
(一) 在studio上右側(cè)的task中adroid里點(diǎn)擊運(yùn)行androidDepencies
release
releaseCompileClasspath - Dependencies for compilation
+--- MyDemo/FtpClientDemo/Ftplibrary/libs/commons-net-3.3-ftp.jar
+--- io.reactivex.rxjava2:rxandroid:2.0.1@aar
+--- com.squareup.retrofit2:adapter-rxjava2:2.3.0@jar
+--- io.reactivex.rxjava2:rxjava:2.1.3@jar
+--- com.squareup.retrofit2:retrofit:2.3.0@jar
+--- com.squareup.okhttp3:logging-interceptor:3.9.0@jar
+--- com.squareup.okhttp3:okhttp:3.9.0@jar
+--- org.reactivestreams:reactive-streams:1.0.1@jar
\--- com.squareup.okio:okio:1.13.0@jar
這樣子可以看到各個(gè)狀態(tài)下依賴的版本,比如這里截出來(lái)的是releaseCompileClasspath的
(二) 用命令
(1) 利用dependencies查看依賴樹
$ ./gradlew :Ftplibrary:dependencies --configuration releaseCompileClasspath
> Task :Ftplibrary:dependencies
------------------------------------------------------------
Project :Ftplibrary
------------------------------------------------------------
releaseCompileClasspath - Resolved configuration for compilation for variant: release
+--- io.reactivex.rxjava2:rxandroid:2.0.1
| \--- io.reactivex.rxjava2:rxjava:2.0.1 -> 2.1.3
| \--- org.reactivestreams:reactive-streams:1.0.1
+--- io.reactivex.rxjava2:rxjava:2.1.3 (*)
+--- com.squareup.retrofit2:retrofit:2.3.0
| \--- com.squareup.okhttp3:okhttp:3.8.0 -> 3.9.0
| \--- com.squareup.okio:okio:1.13.0
+--- com.squareup.retrofit2:adapter-rxjava2:2.3.0
| +--- com.squareup.retrofit2:retrofit:2.3.0 (*)
| \--- io.reactivex.rxjava2:rxjava:2.0.0 -> 2.1.3 (*)
\--- com.squareup.okhttp3:logging-interceptor:3.9.0
\--- com.squareup.okhttp3:okhttp:3.9.0 (*)
(*) - dependencies omitted (listed previously)
PS:方式一和二還是有區(qū)別的怔接,比如看在window中點(diǎn)擊androidDepencies搪泳,能看到依賴的本地jar包,但是通過(guò)命令查看依賴扼脐,則查看的沒有本地jar文件依賴岸军。
通過(guò)--configuration可以配置要查看哪個(gè)variant下的版本,比如這里是releaseCompileClasspath看的就是release的依賴瓦侮。
看打印就能更清晰的看到依賴的版本艰赞,是為什么依賴到了,比如okhttp依賴到的是3.9.0版本肚吏,是因?yàn)閏om.squareup.okhttp3:logging-interceptor:3.9.0中的依賴是3.9.0 (*)方妖,這樣子就替換掉了retrofit中的3.8.0的依賴
- 依賴說(shuō)明如下:
- 版本:唯一的依賴。
- 版本(*):還存在該庫(kù)其他版本的依賴或者間接依賴须喂,并且默認(rèn)選擇()所標(biāo)注的版本。
- 版本1->版本2(*):還存在該庫(kù)其他版本的依賴或者間接依賴趁蕊,并且選擇 版本2坞生。
(2) 利用dependencyInsight 詳細(xì)查看某個(gè)庫(kù)(采用模糊過(guò)濾的方式,比如下面查看的是com.squareup.okhttp)的版本依賴掷伙。
$ ./gradlew :FTPlibrary:dependencyInsight --dependency com.squareup.okhttp --configuration releaseCompileClasspath
> Task :Ftplibrary:dependencyInsight
com.squareup.okhttp3:logging-interceptor:3.9.0
\--- releaseCompileClasspath
com.squareup.okhttp3:okhttp:3.9.0 (conflict resolution)
\--- com.squareup.okhttp3:logging-interceptor:3.9.0
\--- releaseCompileClasspath
com.squareup.okhttp3:okhttp:3.8.0 -> 3.9.0
\--- com.squareup.retrofit2:retrofit:2.3.0
+--- releaseCompileClasspath
\--- com.squareup.retrofit2:adapter-rxjava2:2.3.0
\--- releaseCompileClasspath
(*) - dependencies omitted (listed previously)
這里就能很明顯的看到是己,依賴的okhttp的版本是3.9.0了,interceptor中的3.9.0解決了retrofit中的3.8.0
二. 刷新依賴緩存
自己上傳maven庫(kù)之后任柜,可能是覆蓋的形式更新的maven庫(kù)卒废,如果不刷新,則一直都會(huì)使用本地緩存的依賴宙地,我試過(guò)從文件中找到依賴刪除掉他摔认,但是一sync,就自己又生成出來(lái)了宅粥,很奇怪参袱。
(一) 全部刷新
在android右側(cè)gradle選項(xiàng),隨便找一個(gè)tasks下的build里面秽梅,執(zhí)行cleanBuildCache
(一) 強(qiáng)制刷新依賴
./gradlew --refresh-dependencies assemble
Gradle沖突說(shuō)明
gradle是比較智能的了抹蚀,也能智能的處理相同包不同版本的沖突,會(huì)默認(rèn)依賴較新的一個(gè)版本企垦。但是如果是不同包之間的沖突环壤,那么就會(huì)報(bào)錯(cuò),得需要人為來(lái)解決了钞诡,比如:
依賴:
implementation 'com.android.support:design:26.1.0'
//glide
implementation 'com.github.bumptech.glide:glide:4.7.1'
這兩個(gè)依賴在一起會(huì)報(bào)錯(cuò):
Program type already present: android.support.design.widget.CoordinatorLayout$Behavior
Message{kind=ERROR, text=Program type already present: android.support.design.widget.CoordinatorLayout$Behavior, sources=[Unknown source file], tool name=Optional.of(D8)}
那么我們通過(guò)前面的命令可以查 com.github.bumptech.glide:glide下面的依賴樹郑现,但是解決這種沖突光看依賴樹還不行湃崩,得結(jié)合報(bào)錯(cuò),CoordinatorLayout$Behavior懂酱,我們?cè)诔鰡栴}的情況下全局搜索(雙擊shift,記得夠上從選擇框)一下CoordinatorLayout竹习,就能看到是在哪兩個(gè)庫(kù)中存在了,再結(jié)合依賴樹就能看出來(lái)com.github.bumptech.glide:glide依賴了:
com.android.support:support-fragment:27.1.1
而support-fragment:27.1.1下面依賴了
com.android.support:support-core-ui
在這個(gè)庫(kù)里也有android.support.design.widget.CoordinatorLayout列牺,就與默認(rèn)的com.android.support:design的沖突了整陌。
所以處理下即可:
implementation 'com.android.support:design:26.1.0'
//glide
implementation('com.github.bumptech.glide:glide:4.7.1') {
/*排除依賴,這下面的依賴會(huì)與design報(bào)錯(cuò)
* 所以處理方式如下
* */
exclude group : "com.android.support" , module: "support-fragment"
}
吐槽:google大法更新庫(kù)是有可能不考慮兼容性的瞎领,所以建議都使用同一個(gè)版本泌辫。出現(xiàn)這個(gè)根本原因就是因?yàn)閮蓚€(gè)支持庫(kù)的版本不一致,一個(gè)是26.1.0一個(gè)是27.1.1九默,如果兩個(gè)都是同一個(gè)版本則不會(huì)存在這個(gè)問題