技巧篇 之 這可能是解決 Could not resolve X 最有效的辦法之一咯。

夜深人靜,遠離了城市的喧囂,開啓了個人的狂歡。

前言

本文扯皮話較多,主要記錄下心路歷程,勿噴。

事情的開始,源於某天下發了一個維護老項目的任務。

當時那個頭大,依稀記得剛入職便在這個項目哼哧哼哧搞了好久,而最後因爲某些原因,項目直接跑不起來了,索性直接本地幹掉,專心整現有項目了。

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

參考資料

  1. 添加編譯依賴項
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章