首页 > 解决方案 > moshi android 出错,无法在 kitkat 设备上运行

问题描述

该项目可以生成apk,可以从kitkat到oreo使用,但是在升级android studio并开始使用androidx后,出现以下问题。它仅在启用 minifyEnabled=true shrinkResources=true 后发生在 kitkat 中

java.lang.VerifyError: com/squareup/moshi/kotlin/reflect/KotlinJsonAdapter$IndexedParameterMap
    at com.squareup.moshi.kotlin.reflect.KotlinJsonAdapter.fromJson(KotlinJsonAdapter.kt:111)
    at com.squareup.moshi.internal.NullSafeJsonAdapter.fromJson(NullSafeJsonAdapter.java:40)
    at com.squareup.moshi.kotlin.reflect.KotlinJsonAdapter.fromJson(KotlinJsonAdapter.kt:84)
    at com.squareup.moshi.internal.NullSafeJsonAdapter.fromJson(NullSafeJsonAdapter.java:40)
    at com.squareup.moshi.JsonAdapter$2.fromJson(JsonAdapter.java:161)
    at com.squareup.moshi.JsonAdapter$3.fromJson(JsonAdapter.java:197)
    at com.squareup.moshi.JsonAdapter$1.fromJson(JsonAdapter.java:108)
    at retrofit2.converter.moshi.MoshiResponseBodyConverter.convert(MoshiResponseBodyConverter.java:45)
    at retrofit2.converter.moshi.MoshiResponseBodyConverter.convert(MoshiResponseBodyConverter.java:27)
    at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:223)
    at retrofit2.OkHttpCall.execute(OkHttpCall.java:186)
    at com.jakewharton.retrofit2.adapter.rxjava2.CallObservable.subscribeActual(CallObservable.java:41)
    at io.reactivex.Observable.subscribe(Observable.java:12267)
    at com.jakewharton.retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:34)
    at io.reactivex.Observable.subscribe(Observable.java:12267)
    at io.reactivex.internal.operators.observable.ObservableSingleSingle.subscribeActual(ObservableSingleSingle.java:35)
    at io.reactivex.Single.subscribe(Single.java:3603)
    at io.reactivex.internal.operators.single.SingleSubscribeOn$SubscribeOnObserver.run(SingleSubscribeOn.java:89)
    at io.reactivex.Scheduler$DisposeTask.run(Scheduler.java:578)
    at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:66)
    at io.reactivex.internal.schedulers.ScheduledRunnable.call(ScheduledRunnable.java:57) 
    at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:152) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:265) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1112) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:587) 
    at java.lang.Thread.run(Thread.java:864) 

这是我的proguard规则

-dontwarn kotlin.**
-dontwarn kotlin.reflect.jvm.internal.**
-keep class kotlin.reflect.jvm.internal.** { *; }

-keep class kotlin.Metadata { *; }

-keepclassmembers class kotlin.Metadata {
    public <methods>;
}

-dontwarn org.jetbrains.annotations.**

-keep class kotlin.** { *; }
-dontwarn kotlin.**
-keepclassmembers class **$WhenMappings {
    <fields>;
}

-keep class com.squareup.moshi.kotlin.reflect.** { *; }
-keep class com.squareup.moshi.internel.** { *; }

-keepclassmembers class com.squareup.moshi.kotlin.reflect.** { *; }
-keepclassmembers class com.squareup.moshi.internel.** { *; }

-keepclassmembers class * {
    @com.squareup.moshi.FromJson <methods>;
    @com.squareup.moshi.ToJson <methods>;
}

-dontwarn javax.annotation.**

-keepclasseswithmembers class * {
    @com.squareup.moshi.* <methods>;
}

-keep class **JsonAdapter {
    <init>(...);
    <fields>;
}

-keep @com.squareup.moshi.JsonQualifier interface *

-keepclassmembers @com.squareup.moshi.JsonClass class * extends java.lang.Enum {
    <fields>;
    **[] values();
}

-keep public class kotlin.reflect.jvm.internal.impl.builtins.* { public *; }

-keep public class kotlin.reflect.jvm.internal.impl.** { public *; }

我尝试过其他参考资料,例如https://github.com/square/moshi/issues/803,但我没有找到答案。请帮我解决一下这个。

标签: kotlinmoshi

解决方案


这似乎是 Kotlin 问题,作为一种解决方法使用Moshi 1.6.0Proguard而不是R8->android.enableR8=false


推荐阅读