夜深人靜,遠離了城市的喧囂,開啓了個人的狂歡。
前言
本文扯皮話較多,主要記錄下心路歷程,勿噴。
事情的開始,源於某天下發了一個維護老項目的任務。
當時那個頭大,依稀記得剛入職便在這個項目哼哧哼哧搞了好久,而最後因爲某些原因,項目直接跑不起來了,索性直接本地幹掉,專心整現有項目了。
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,能腦補下當時尷尬的畫面麼?
Fuck 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,
versionCode : 10,
versionName : "2.0.0",
ucropVersionCode : 22,
ucropVersionName : "2.2.0-native",
//open version control
androidSupportVersion: "27.1.1",
glide : "4.5.0",
rxjava : "2.0.5",
rxandroid : "2.0.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'
implementation "com.github.bumptech.glide:glide:${cfgs.glide}"
}
再次 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,如有不正或更好的方式,歡迎交流學習~