返回

解决 Google Play 中 QuickSelectionViewModel 的 \

Android

Google Play Crash: Troubleshooting "java.lang.NoSuchFieldError" in QuickSelectionViewModel

问题简介

应用程序在 Google Play 内部测试中崩溃,并显示以下错误消息:

java.lang.NoSuchFieldError: No field Key of type Lkotlinx/coroutines/CoroutineExceptionHandler$Key; in class Lkotlinx/coroutines/CoroutineExceptionHandler; or its superclasses

成因分析

该错误通常是由 ProGuard 优化错误删除 Kotlinx Coroutines 库中字段导致的。

解决方案

要解决此问题,请将以下行添加到 proguard-rules.pro 文件中:

-keep interface kotlinx.coroutines.CoroutineExceptionHandler { *; }
-keep class kotlinx.coroutines.android.AndroidExceptionPreHandler
-keep class kotlinx.coroutines.android.AndroidDispatcherFactory

-keep class kotlinx.coroutines.** { *; }
-keepclassmembers class kotlinx.coroutines.* {
    <fields>;
    <init>();
    <methods>;
}

其他注意事项

  • 如果添加 ProGuard 规则后问题仍然存在,请检查是否有任何自定义 ProGuard 规则可能导致冲突。
  • 将所有库更新到最新版本,因为旧版本可能与 Coroutines 库不兼容。
  • 在开发环境中启用完整堆栈跟踪,以获取更详细的错误信息。
  • 为开发版本禁用 ProGuard 优化,以便于调试。

示例 build.gradle 文件

以下是包含必要 ProGuard 规则和库更新的示例 build.gradle 文件:

android {
    ...
    buildTypes {
        ...
        release {
            ...
            proguardFiles(getDefaultProguardFile("proguard-android-optimize.txt"), "proguard-rules.pro")
        }
    }
    ...
}

dependencies {
    ...
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:1.8.0"
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:1.8.0"
    ...
}

ProGuard 规则文件

-keep interface kotlinx.coroutines.CoroutineExceptionHandler { *; }
-keep class kotlinx.coroutines.android.AndroidExceptionPreHandler
-keep class kotlinx.coroutines.android.AndroidDispatcherFactory

-keep class kotlinx.coroutines.** { *; }
-keepclassmembers class kotlinx.coroutines.* {
    <fields>;
    <init>();
    <methods>;
}

结论

通过遵循这些步骤,您可以解决 QuickSelectionViewModeljava.lang.NoSuchFieldError 导致的崩溃问题。

常见问题解答

  1. 为什么 ProGuard 会移除字段? ProGuard 旨在通过删除未使用的代码来优化应用程序,但有时它可能会错误地移除必要的字段。
  2. 我需要更新到 Kotlinx Coroutines 的最新版本吗? 是的,建议更新到最新版本以确保兼容性和解决任何已知问题。
  3. 为什么启用堆栈跟踪对于调试很有用? 堆栈跟踪提供有关错误发生位置及其原因的详细信息,有助于缩小问题范围。
  4. 为什么为开发版本禁用 ProGuard 优化? ProGuard 优化会混淆代码,这可能使调试变得困难。禁用优化可以更容易地识别错误。
  5. 是否有任何其他方法可以解决此错误? 除了提供的解决方案之外,您还可以尝试其他修复方法,例如添加代码混淆规则或使用不同的 ProGuard 版本。