Kotlin协程混淆问题

4,373 阅读1分钟

问题: 当你在项目中添加了 kotlin协程,需要混淆时报错

    Module with the Main dispatcher is missing

思考1:有人说是没有引入kotlinx-coroutines-android,或者版本不一致,如下引入版本确认没有问题。

    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-android:${kotlinCoroutinesVersion}"
    implementation "org.jetbrains.kotlinx:kotlinx-coroutines-core:${kotlinCoroutinesVersion}"
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
    

思考2:如果只是混淆问题,那么这个库其实并不大,不混淆影响也不大,所以完全keep也没问题,完美解决

解决:keep kotlinx-coroutines-android

-keep class kotlinx.coroutines.android.** {*;}

解决:完整的kotlin混淆方案


   #kotlin
-keep class kotlin.** { *; }
-keep class kotlin.Metadata { *; }
-dontwarn kotlin.**
-keepclassmembers class **$WhenMappings {
    <fields>;
}
-keepclassmembers class kotlin.Metadata {
    public <methods>;
}
-assumenosideeffects class kotlin.jvm.internal.Intrinsics {
    static void checkParameterIsNotNull(java.lang.Object, java.lang.String);
}
-keep class kotlinx.coroutines.android.** {*;}
# ServiceLoader support
-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>;
}