Moshi 与 Kotlin 特定版本的不兼容问题

874 阅读2分钟

问题

最近新开了一个项目,沿用了此前项目的基本依赖配置,但是将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

每次遇到这种报错都是一脸懵逼,毫无排查的头绪,又小熬了个夜,下面先提供解决方案。

解决方案

先简述一下,上文的报错,根本原因是KotlinMoshi以及AGP三者之间的版本出现了一些不兼容问题,那么解决思路也自然就是:

  1. Kotlin版本改回1.6.0或以下

    其实可以从MoshiChange Log 中看到,MoshiKotlin的版本升级到了1.6.0,因此,只需要将Kotlin版本降级至1.6.0或以下即可解决此时的不兼容问题

  2. 我就想用Kotlin-1.6.0+怎么办,没问题,升级AGP

    升级AGP对我来说是一个风险很高的操作,我并未做尝试,看到文章中说7.2.0版本可以解决,可以自行升级尝试解决

  3. 我既想用Kotlin-1.6.0+,又不想升级AGP7.1+

    安排!

    此时你需要在项目目录下gradle.properties下添加一行配置

    android.jetifier.ignorelist=moshi-1.13.0
    

    此时便能顺利Buildinstall了。

总结

那么对于这个毫无头绪的问题,我是怎么排查的呢,很简单,我平时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 ...

他们的结论均指向了三者之间的版本不兼容问题,至于具体怎么解决,上述方案任君挑选!