问题
最近新开了一个项目,沿用了此前项目的基本依赖配置,但是将Kotlin版本从1.5.30升级到了1.6.10,然后当使用了Moshi之后,编译失败,报错如下
Execution failed for task ':app:kaptDebugKotlin'.
> A failure occurred while executing org.jetbrains.kotlin.gradle.internal.KaptWithoutKotlincTask$KaptExecutionWorkAction
> java.lang.reflect.InvocationTargetException (no error message)
此时我的AGP版本为7.0.2
每次遇到这种报错都是一脸懵逼,毫无排查的头绪,又小熬了个夜,下面先提供解决方案。
解决方案
先简述一下,上文的报错,根本原因是Kotlin与Moshi以及AGP三者之间的版本出现了一些不兼容问题,那么解决思路也自然就是:
-
将
Kotlin版本改回1.6.0或以下其实可以从
Moshi的 Change Log 中看到,Moshi将Kotlin的版本升级到了1.6.0,因此,只需要将Kotlin版本降级至1.6.0或以下即可解决此时的不兼容问题 -
我就想用
Kotlin-1.6.0+怎么办,没问题,升级AGP升级
AGP对我来说是一个风险很高的操作,我并未做尝试,看到文章中说7.2.0版本可以解决,可以自行升级尝试解决 -
我既想用
Kotlin-1.6.0+,又不想升级AGP到7.1+安排!
此时你需要在项目目录下
gradle.properties下添加一行配置android.jetifier.ignorelist=moshi-1.13.0此时便能顺利
Build并install了。
总结
那么对于这个毫无头绪的问题,我是怎么排查的呢,很简单,我平时coding之后commit&push的颗粒度足够小,所以,我就一个节点一个节点往回checkout,然后就发现再使用Moshi之后的节点,均报错,此时Moshi版本为1.12.0,随后我就尝试升级到1.13.0,然后又迎来了新的报错
Records requires ASM8
无计可施了,Google一下吧。。。
于是我就看到了下面这些资料
Records requires ASM8 · Issue #1463 · square/moshi - GitHub
Records requires ASM8 - java - Stack Overflow
Moshi 1.13.0 with Kotlin 1.6 compatibility now available - Reddit
Clean Android Architecture: Take a layered approach to ...
他们的结论均指向了三者之间的版本不兼容问题,至于具体怎么解决,上述方案任君挑选!