启用了防护功能后,withTimeout的Kotlin协程不会引发TimeoutCancellationException

时间:2019-11-08 15:40:30

标签: android kotlin proguard kotlin-coroutines

启用带有时间限制的proguard时似乎不会引发TimeoutCancellationException。

以下代码在不缩小或不使用R8的情况下都能很好地工作。 withTimeout会在预期的3秒后触发TimeoutCancellationException。

CoroutineScope(Dispatchers.Main + SupervisorJob()).launch {
                try {
                    withTimeout(3000) {
                      delay(4000)
                    }
                } catch (e: TimeoutCancellationException) {
                    Log.e(TAG, e.message)
                }
            }

但是当我启用proguard时,不再抛出异常,并且delay暂停功能正常完成。

我在proguard-rule.pro中使用以下规则:

-dontwarn kotlinx.coroutines.flow.**inlined**
-keepnames class kotlinx.coroutines.internal.MainDispatcherFactory {}
-keepnames class kotlinx.coroutines.CoroutineExceptionHandler {}
-keepnames class kotlinx.coroutines.android.AndroidExceptionPreHandler {}
-keepnames class kotlinx.coroutines.android.AndroidDispatcherFactory {}

# Most of volatile fields are updated with AFU and should not be mangled
-keepclassmembernames class kotlinx.** {
    volatile <fields>;
}

我使用以下版本:

  • AS gradle插件版本:3.5.1
  • 科特琳版本:1.3.50
  • Kotlin协程版本:
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.0'
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.3.2'

有人遇到过同样的问题吗?我是否错过了保护者规则?

谢谢

0 个答案:

没有答案