AS或IDEA报Android Support插件版本不匹配问题分析及解决

在 IDEA 中打开 Android 项目的时候,有时候会报这个错
报错堆栈如下
我们来分析一下源码,找 Android Gradle Plugin 源码来分析
此处使用 4.2.0 版本
那我们就去对应的文件位置里看看

那么我们应该去了解一下这个版本是如何解析的.
此时关注 parseVersion()
方法
0x00 IDEA 插件版本解析
根据调试器可以得知这里输入的版本号就是 Android 插件的版本号

对于 IDEA 来说是 10.4.1.1.211.7142.45
首先是这么一段
在这一行代码里,主版本号被解析为 10
接下来,因为历史原因,这个 10 不应该被解析为主要版本号,所以进入这个 if 块
这里把主版本号设定为第二个部分,也就是 4 年份为 10
在这里取第三部分作为次要版本号,这里是 1
下面两个都是给历史版本处理用的,不管他
精彩的部分是这里,由于年份为 10 不匹配大于 2000 的条件,所以走了最下面的处理
然后使用 Kotlin 的命名函数,在创建对象的时候砍掉了年份,只留下主要和次要版本
所以得到的插件版本是 0.4.1
0x01 AGP 版本解析
再来看看 AGP 自己的版本号是如何操作的,已知传入为 4.2.0
主版本为 4
那些逻辑都没有被触发,所以次要版本是 2
年份为 0
走一遍会变成 0.4.2
0x02 AS 插件版本解析
AS 里面插件版本跟 IDEA 不一样,拆开插件 jar 之后可以得到
文件在 android/adnroid.jar/META-INF/plugin.xml
部分内容如下
由于B站编辑器代码块过于奇葩,这里就截图了

这个版本号解析出来是 202.7660 走一遍就是 0.202.7660
0x03 版本号比较
此处重写了 compareTo 函数来实现.逻辑如下
首先判断年份是否相同
然后判断主要版本
再判断次要版本
都是按照数字大小匹配
那你 0.4.1 肯定比 0.4.2 小,所以这里炸了

0x04 解决方案
手工关闭检查
在最开始 verifyIDEIsNotOld()
中有这么一段
去看看这个 BooleanOption.ENABLE_STUDIO_VERSION_CHECK
发现他的选项是这个 android.injected.studio.version.check
也就是我们在 properties 文件里设定这个 Key 为 false 即可跳过检测
等待 IDEA 版本更新
根据 IDEA 官方的 YouTrack 下面的讨论.这个插件版本将会在 IDEA 2021.2 中升级.各位可以等待高版本
下面是一些参考
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 版本号了,而是定义了一个年份开头的版本
在这个情况下比较的时候,年份设定为 2020
出来的版本号是 2020.3.1
在比较的时候 2020 一定是比 0 大的,这就直接结束了比较.