繁体   English   中英

Kotlin 反射:在 R8 混淆中找不到 primaryConstructor

[英]Kotlin Reflection: primaryConstructor not found with R8 obfuscation

在我目前的 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 保留,但有关主构造函数的元信息丢失了。

有人知道如何解决这个问题吗?

我遇到了这个问题,并且能够使用@Keep注释解决它。

abstract class MyClass {
}

class MySubClassA @Keep constructor(): MyClass() {
}

class MySubClassB @Keep constructor(): MyClass() {
}

class MySubClassC @Keep constructor(): MyClass() {
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM