這可能是解決 Could not resolve X 問題有效方式之一
- 2019 年 12 月 5 日
- 筆記
前言
本文扯皮話較多,主要記錄下心路歷程,勿噴。
事情的開始,源於某天下發了一個維護老項目的任務。
當時那個頭大,依稀記得剛入職便在這個項目哼哧哼哧搞了好久,而最後因為某些原因,項目直接跑不起來了,索性直接本地幹掉,專心整現有項目了。
The start
行雲流水般導入,編譯,準備 build 成功後開始一通霍霍。事實告訴我,小夥子還是忒年輕。
喏。
ERROR: Unable to resolve dependency for ':app@debug/compileClasspath': Could not resolve com.android.support:appcompat-v7:26.+. Show Details Affected Modules: app ERROR: Unable to resolve dependency for ':app@debugAndroidTest/compileClasspath': Could not resolve com.android.support:appcompat-v7:26.+. Show Details Affected Modules: app ERROR: Unable to resolve dependency for ':app@debugUnitTest/compileClasspath': Could not resolve com.android.support:appcompat-v7:26.+. Show Details Affected Modules: app ERROR: Unable to resolve dependency for ':app@release/compileClasspath': Could not resolve com.android.support:appcompat-v7:26.+. Show Details Affected Modules: app ERROR: Unable to resolve dependency for ':app@releaseUnitTest/compileClasspath': Could not resolve com.android.support:appcompat-v7:26.+. Show Details Affected Modules: app INFO: Configuration 'compile' is obsolete and has been replaced with 'implementation' and 'api'. It will be removed at the end of 2018. For more information see: http://d.android.com/r/tools/update-dependency-configurations.html Affected Modules: app
ummm,能腦補下當時尷尬的畫面么?
XX Road
第一想法,肯定又是哪兒依賴了低版本的庫了。問下 Google 老兄,得到幾乎大部分的解決方案如下:
- 將項目中所有 support 庫版本指定為 26.+,並且將項目 compileSdkVersion 以及 targetSdkVersion 指定為 26。(哎,指標不治本啊,有的 api 引用的高版本的啊)
- 將 gradle 設置為離線模式。(我就很是納悶,依賴的事兒,咋和 gradle 相關呢)
- 還有重裝 AS。。。(聽着不靠譜,Bye)
也可能是對於基本的搜索技能還處於小 low B 一個,經過一天的掙扎,成功給我干鬱悶了。
Google 估計對我都無奈了。
遂只能自己看看哪兒塊依賴使用了 com.android.support:appcompat-v7:26.+,檢查很久,當時項目 support 相關配置如下:
implementation 'com.android.support:appcompat-v7:27.1.1' implementation 'com.android.support:recyclerview-v7:27.1.1' implementation 'com.android.support:design:27.1.1' implementation 'com.android.support:support-v4:27.1.1'
都是引入的 27.1.1 版本庫,接着繼續在項目中翻騰,翻騰。。。
突然看到一個 Version Config Gradle,內容如下:
ext { cfgs = [ compileSdkVersion : 27, buildToolsVersion : "27.1.1", minSdkVersion : 21, targetSdkVersion : 27, // 。。。 //open version control androidSupportVersion: "27.1.1", // 。。。 ] }
也是雞老大提醒,是否引入依賴未生效呢?
為了防止配置版本引用失效,這裡直接講其他依賴庫修改為制定版本(此處原先應用配置文件中的版本,現已修改為指定版本號):
dependencies { // 此處為某個依賴 Module 中引入的依賴 //noinspection GradleCompatible implementation 'com.android.support:appcompat-v7:27.1.1' //noinspection GradleCompatible implementation 'com.android.support:recyclerview-v7:27.1.1' }
再次 Build,依舊傲然挺立,我能怎麼辦?
忽然想起雞老大說,有沒有可能是引入第三方 Module 中又引入了其他的依賴源呢?
一臉懵逼的繼續在項目中翻騰,翻騰。忽然想到,Android Studio 不是為我們提供了很多現有強大的小插件么?直接打印項目中的所有依賴流檢查一邊不就好了嗎?
右側找到 app —> help —> dependencies,狂點:

隨後聽到 Air 不堪重負的風扇狂飆,???
身為雞老大弟子,怎會一個個找,多 low 呀,直接查找 26.+

折騰我好半天的罪魁禍首終於現身了,迫不期待的向雞老大彙報進度咯。
真兇,我們已經抓到,那麼怎麼處理它方能以解心頭恨呢?當然直接恁死。
// 起先是這樣子 implementation 'com.github.JiangAndroidwork:MyImagePicker:1.3.0' // 修改後如下 implementation ('com.github.JiangAndroidwork:MyImagePicker:1.3.0'){ // 排除 support 庫 exclude group: 'com.android.support' }
隨後,項目終於成功的跑起來咯,可想我當時激動的心,顫抖的手,真想摟着我雞老大香一個,???
獎勵自己抽根煙緩緩後,回來繼續點擊 Android Studio 插件,查看下排除之後的樣子又是怎樣?

美滋滋的和雞老大彙報成果後,雞老大摸了摸小鬍子淡淡的來了一句:
這樣會有個問題吶。萬一低版本在高版本中 api 被移除了,你這會崩潰呀,巴拉巴拉。。。
ummm,腦瓜子想了想,哈哈,木事,船到橋頭自然直。??? (各位道友莫學我,我還有其他任務沒開搞。。。)
The end
在解決這個問題的過程中,發現了自己對於解決問題的方式的欠缺,以及對於我摯愛的 Android 的表面愛,絲毫未深入感受其魅力。不由得膜拜已封神的雞老大,我雞老大萬壽無疆~!!!
很多時候,一定要透過問題看本質,一點點來,說不定哪兒天就可以追趕上我雞老大四分之一的功力呢?
以前的自己,追求完成任務即可,而今追隨雞老大,我想了解更多,比如這個 exclude Google 又是怎麼解釋的?
以下內容節選自 Google Developers,文末附上地址:
隨着應用的範圍不斷擴大,它可能會包含許多依賴項,包括直接依賴項和傳遞依賴項(應用中導入的庫所依賴的庫)。要排除不再需要的傳遞依賴項,您可以使用 exclude 關鍵字,如下所示:
dependencies { implementation('some-library') { exclude group: 'com.example.imgtools', module: 'native' } }
其中列舉下個人理解:
- exclude:要排除的依賴組,例如我只是排除了使用 support:26.+ 依賴;
- module:這個我沒有實際使用,大體猜測為排除某個 module 下的指定依賴組。
The end,如有不正或更好的方式,歡迎交流學習~