這可能是解決 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,如有不正或更好的方式,歡迎交流學習~