如何解决java.lang.NoClassDefFoundError: 在 Android 6 上
应用在运行 android 9 的 nexus6P 上运行良好。我试图在 Nexus 5 (Android 6) 上运行应用,但出现以下错误:
Caused by: java.lang.NoClassDefFoundError: org.openmined.syft.networking.datamodels.syft.AuthenticationResponseSerializer$deserialize$data$1$1
05-08 12:57:26.776 15456-15592/org.openmined.syft.demo W/System.err: at org.openmined.syft.networking.datamodels.syft.AuthenticationResponseSerializer$deserialize$data$1.invoke(AuthenticationDataModels.kt:66)
05-08 12:57:26.776 15456-15592/org.openmined.syft.demo W/System.err: at org.openmined.syft.networking.datamodels.syft.AuthenticationResponseSerializer$deserialize$data$1.invoke(AuthenticationDataModels.kt:55)
05-08 12:57:26.776 15456-15592/org.openmined.syft.demo W/System.err: at kotlinx.serialization.json.JsonElementBuildersKt.json(JsonElementBuilders.kt:14)
05-08 12:57:26.776 15456-15592/org.openmined.syft.demo W/System.err: at org.openmined.syft.networking.datamodels.syft.AuthenticationResponseSerializer.deserialize(AuthenticationDataModels.kt:65)
05-08 12:57:26.776 15456-15592/org.openmined.syft.demo W/System.err: at org.openmined.syft.networking.datamodels.syft.AuthenticationResponseSerializer.deserialize(AuthenticationDataModels.kt:55)
05-08 12:57:26.776 15456-15592/org.openmined.syft.demo W/System.err: at kotlinx.serialization.json.internal.polymorphicKt.decodeSerializableValuepolymorphic(polymorphic.kt:34)
05-08 12:57:26.776 15456-15592/org.openmined.syft.demo W/System.err: at kotlinx.serialization.json.internal.StreamingJsonInput.decodeSerializableValue(StreamingJsonInput.kt:33)
05-08 12:57:26.776 15456-15592/org.openmined.syft.demo W/System.err: at kotlinx.serialization.CoreKt.decode(Core.kt:80)
05-08 12:57:26.776 15456-15592/org.openmined.syft.demo W/System.err: at kotlinx.serialization.json.Json.parse(Json.kt:126)
05-08 12:57:26.776 15456-15592/org.openmined.syft.demo W/System.err: at kotlinx.serialization.json.Json$Companion.parse(Json.kt:178)
05-08 12:57:26.776 15456-15592/org.openmined.syft.demo W/System.err: at com.jakewharton.retrofit2.converter.kotlinx.serialization.Serializer$FromString.fromresponseBody(Serializer.kt:18)
05-08 12:57:26.776 15456-15592/org.openmined.syft.demo W/System.err: at com.jakewharton.retrofit2.converter.kotlinx.serialization.DeserializationStrategyConverter.convert(DeserializationStrategyConverter.kt:11)
05-08 12:57:26.776 15456-15592/org.openmined.syft.demo W/System.err: at com.jakewharton.retrofit2.converter.kotlinx.serialization.DeserializationStrategyConverter.convert(DeserializationStrategyConverter.kt:7)
05-08 12:57:26.776 15456-15592/org.openmined.syft.demo W/System.err: at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:225)
05-08 12:57:26.776 15456-15592/org.openmined.syft.demo W/System.err: at retrofit2.OkHttpCall.execute(OkHttpCall.java:188)
05-08 12:57:26.776 15456-15592/org.openmined.syft.demo W/System.err: at retrofit2.adapter.rxjava2.CallExecuteObservable.subscribeActual(CallExecuteObservable.java:45)
05-08 12:57:26.776 15456-15592/org.openmined.syft.demo W/System.err: at io.reactivex.Observable.subscribe(Observable.java:12267)
05-08 12:57:26.776 15456-15592/org.openmined.syft.demo W/System.err: at retrofit2.adapter.rxjava2.BodyObservable.subscribeActual(BodyObservable.java:34)
05-08 12:57:26.776 15456-15592/org.openmined.syft.demo W/System.err: at io.reactivex.Observable.subscribe(Observable.java:12267)
05-08 12:57:26.776 15456-15592/org.openmined.syft.demo W/System.err: at io.reactivex.internal.operators.observable.ObservableSingleSingle.subscribeActual(ObservableSingleSingle.java:35)
05-08 12:57:26.776 15456-15592/org.openmined.syft.demo W/System.err: at io.reactivex.Single.subscribe(Single.java:3603)
05-08 12:57:26.776 15456-15592/org.openmined.syft.demo W/System.err: at io.reactivex.internal.operators.single.SingleSubscribeOn$SubscribeOnObserver.run(SingleSubscribeOn.java:89)
05-08 12:57:26.776 15456-15592/org.openmined.syft.demo W/System.err: at io.reactivex.Scheduler$disposeTask.run(Scheduler.java:578)
05-08 12:57:26.777 15456-15592/org.openmined.syft.demo W/System.err: at io.reactivex.internal.schedulers.ScheduledRunnable.run(ScheduledRunnable.java:66)
05-08 12:57:26.777 15456-15592/org.openmined.syft.demo W/System.err: ... 6 more
数据模型
@Serializer(forClass = AuthenticationResponse::class)
internal class AuthenticationResponseSerializer : KSerializer<AuthenticationResponse> {
private val json = Json(JsonConfiguration.Stable)
override val descriptor: SerialDescriptor
get() = SerialClassDescImpl("AuthResponseSerializer")
override fun deserialize(decoder: Decoder): AuthenticationResponse {
val input = decoder as? JsonInput
?: throw SerializationException("This class can be loaded only by Json")
val response = input.decodeJson() as? JsonObject
?: throw SerializationException("Expected JsonObject")
val data = json {
response.forEach { key,value ->
if (key != "status")
key to value
}
}
return if (response.getPrimitive("status").content == AUTH_SUCCESS)
json.parse(
AuthenticationResponse.AuthenticationSuccess.serializer(),data.toString()
)
else
json.parse(AuthenticationResponse.AuthenticationError.serializer(),data.toString())
}
override fun serialize(encoder: Encoder,obj: AuthenticationResponse) {
val output = encoder as? JsonOutput
?: throw SerializationException("This class can be saved only by Json")
when (obj) {
is AuthenticationResponse.AuthenticationSuccess -> output.encodeJson(
json.toJson(
AuthenticationResponse.AuthenticationSuccess.serializer(),obj
)
)
is AuthenticationResponse.AuthenticationError ->
output.encodeJson(
json.toJson(
AuthenticationResponse.AuthenticationError.serializer(),obj
)
)
}
}
}
任何人都可以评论一下可能是什么问题吗? kotlinx.serialization
库在 Android 6 上不受支持?
谢谢
解决方法
尝试在您的 Serializable 类中添加注释 @Keep。
@Serializable
@Keep
class AuthenticationResponse {
// ...
}...
编译器可能认为代码未使用。 @Keep 表示在构建时缩小代码时不应删除带注释的元素
其他解决方案
- 到您的 proguard-rules.pro(更多 info):
kotlinx-serialization-json 特定。如果您有 java.lang.NoClassDefFoundError kotlinx.serialization.json.JsonObjectSerializer
,请添加此项-keepclassmembers class kotlinx.serialization.json.** {
*** Companion;
}
-keepclasseswithmembers class kotlinx.serialization.json.** {
kotlinx.serialization.KSerializer serializer(...);
}
- mismatches Kotlin 和 Kotlinx 之间的序列化
- 和另一个link
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。