AS或IDEA報(bào)Android Support插件版本不匹配問(wèn)題分析及解決

在 IDEA 中打開(kāi) Android 項(xiàng)目的時(shí)候,有時(shí)候會(huì)報(bào)這個(gè)錯(cuò)
報(bào)錯(cuò)堆棧如下
我們來(lái)分析一下源碼,找 Android Gradle Plugin 源碼來(lái)分析
此處使用 4.2.0 版本
那我們就去對(duì)應(yīng)的文件位置里看看

那么我們應(yīng)該去了解一下這個(gè)版本是如何解析的.
此時(shí)關(guān)注?parseVersion()
?方法
0x00 IDEA 插件版本解析
根據(jù)調(diào)試器可以得知這里輸入的版本號(hào)就是 Android 插件的版本號(hào)

對(duì)于 IDEA 來(lái)說(shuō)是?10.4.1.1.211.7142.45
首先是這么一段
在這一行代碼里,主版本號(hào)被解析為 10
接下來(lái),因?yàn)闅v史原因,這個(gè) 10 不應(yīng)該被解析為主要版本號(hào),所以進(jìn)入這個(gè) if 塊
這里把主版本號(hào)設(shè)定為第二個(gè)部分,也就是 4 年份為 10
在這里取第三部分作為次要版本號(hào),這里是 1
下面兩個(gè)都是給歷史版本處理用的,不管他
精彩的部分是這里,由于年份為 10 不匹配大于 2000 的條件,所以走了最下面的處理
然后使用 Kotlin 的命名函數(shù),在創(chuàng)建對(duì)象的時(shí)候砍掉了年份,只留下主要和次要版本
所以得到的插件版本是 0.4.1
0x01 AGP 版本解析
再來(lái)看看 AGP 自己的版本號(hào)是如何操作的,已知傳入為?4.2.0
主版本為 4
那些邏輯都沒(méi)有被觸發(fā),所以次要版本是 2
年份為 0
走一遍會(huì)變成 0.4.2
0x02 AS 插件版本解析
AS 里面插件版本跟 IDEA 不一樣,拆開(kāi)插件 jar 之后可以得到
文件在?android/adnroid.jar/META-INF/plugin.xml
部分內(nèi)容如下
由于B站編輯器代碼塊過(guò)于奇葩,這里就截圖了

這個(gè)版本號(hào)解析出來(lái)是 202.7660 走一遍就是 0.202.7660
0x03 版本號(hào)比較
此處重寫了 compareTo 函數(shù)來(lái)實(shí)現(xiàn).邏輯如下
首先判斷年份是否相同
然后判斷主要版本
再判斷次要版本
都是按照數(shù)字大小匹配
那你 0.4.1 肯定比 0.4.2 小,所以這里炸了

0x04 解決方案
手工關(guān)閉檢查
在最開(kāi)始?verifyIDEIsNotOld()
?中有這么一段
去看看這個(gè)?BooleanOption.ENABLE_STUDIO_VERSION_CHECK
發(fā)現(xiàn)他的選項(xiàng)是這個(gè)?android.injected.studio.version.check
也就是我們?cè)?properties 文件里設(shè)定這個(gè) Key 為 false 即可跳過(guò)檢測(cè)
等待 IDEA 版本更新
根據(jù) IDEA 官方的 YouTrack 下面的討論.這個(gè)插件版本將會(huì)在 IDEA 2021.2 中升級(jí).各位可以等待高版本
下面是一些參考
https://youtrack.jetbrains.com/issue/IDEA-264255
https://youtrack.jetbrains.com/issue/IDEA-268850
https://youtrack.jetbrains.com/issue/IDEA-252823
使用 AGP7+
另外還可以嘗試一下 AGP7+ 版本
在 AGP7+ 中獲取最小要求版本的邏輯有變化
可以看到這里不再是用 AGP 版本號(hào)了,而是定義了一個(gè)年份開(kāi)頭的版本
在這個(gè)情況下比較的時(shí)候,年份設(shè)定為 2020
出來(lái)的版本號(hào)是 2020.3.1
在比較的時(shí)候 2020 一定是比 0 大的,這就直接結(jié)束了比較.