在我目前的Kotlin Android项目中,我不得不面对以下问题:
对于这个类层次结构
abstract class MyClass {
...
}
class MySubClassA: MyClass() {
...
}
class MySubClassB: MyClass() {
...
}
class MySubClassC: MyClass() {
...
}我编写了一个创建者函数,如下所示:
private fun <T : MyClass> createMyClass(myClassType: KClass<T>): T? {
val constructor = myClassType.primaryConstructor
return constructor?.call()?.apply {
...
}
}这在调试版本中工作得很好,但对于启用了R8混淆的发布版本,构造函数始终是null。我对R8的设置如下:
-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 kotlin.reflect.jvm.internal.impl.builtins.BuiltInsLoaderImpl在对Kotlin反射API进行了一些反向工程之后,我想出了以下解决方法:
private fun <T : MyClass> createMyClass(myClassType: KClass<T>): T? {
val constructor = myClassType.constructors.firstOrNull() {
it.valueParameters.isEmpty()
}
return constructor?.call()?.apply {
...
}
}这似乎表明,类的构造函数信息由R8保留,但有关作为主要构造函数的元信息会丢失。
有没有人知道如何解决这个问题?
发布于 2020-07-11 00:07:23
我遇到了这个问题,并且能够使用@Keep注释来解决它。
abstract class MyClass {
}
class MySubClassA @Keep constructor(): MyClass() {
}
class MySubClassB @Keep constructor(): MyClass() {
}
class MySubClassC @Keep constructor(): MyClass() {
}https://stackoverflow.com/questions/57206792
复制相似问题