欢迎光临散文网 会员登陆 & 注册

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

2021-05-26 23:40 作者:GCC酱_0ff1c1a1  | 我要投稿

在 IDEA 中打开 Android 项目的时候,有时候会报这个错

报错堆栈如下

我们来分析一下源码,找 Android Gradle Plugin 源码来分析
此处使用 4.2.0 版本

那我们就去对应的文件位置里看看

agp-version-detect

那么我们应该去了解一下这个版本是如何解析的.
此时关注 parseVersion() 方法

0x00 IDEA 插件版本解析

根据调试器可以得知这里输入的版本号就是 Android 插件的版本号

android-plugin-ver-idea

对于 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站编辑器代码块过于奇葩,这里就截图了

plugin.xml

这个版本号解析出来是 202.7660 走一遍就是 0.202.7660

0x03 版本号比较

此处重写了 compareTo 函数来实现.逻辑如下

首先判断年份是否相同
然后判断主要版本
再判断次要版本
都是按照数字大小匹配

那你 0.4.1 肯定比 0.4.2 小,所以这里炸了

agp-debug-version-diff

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 大的,这就直接结束了比较.


AS或IDEA报Android Support插件版本不匹配问题分析及解决的评论 (共 条)

分享到微博请遵守国家法律