首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlin反射:使用R8混淆找不到primaryConstructor

Kotlin反射:使用R8混淆找不到primaryConstructor
EN

Stack Overflow用户
提问于 2019-07-26 00:49:21
回答 1查看 560关注 0票数 4

在我目前的Kotlin Android项目中,我不得不面对以下问题:

对于这个类层次结构

代码语言:javascript
复制
abstract class MyClass {
...
}

class MySubClassA: MyClass() {
...
}

class MySubClassB: MyClass() {
...
}

class MySubClassC: MyClass() {
...
}

我编写了一个创建者函数,如下所示:

代码语言:javascript
复制
private fun <T : MyClass> createMyClass(myClassType: KClass<T>): T? {
    val constructor = myClassType.primaryConstructor

    return constructor?.call()?.apply {
    ...
    }
}

这在调试版本中工作得很好,但对于启用了R8混淆的发布版本,构造函数始终是null。我对R8的设置如下:

代码语言:javascript
复制
-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进行了一些反向工程之后,我想出了以下解决方法:

代码语言:javascript
复制
private fun <T : MyClass> createMyClass(myClassType: KClass<T>): T? {
    val constructor = myClassType.constructors.firstOrNull() {
        it.valueParameters.isEmpty()
    }

    return constructor?.call()?.apply {
    ...
    }
}

这似乎表明,类的构造函数信息由R8保留,但有关作为主要构造函数的元信息会丢失。

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

EN

回答 1

Stack Overflow用户

发布于 2020-07-11 00:07:23

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

代码语言:javascript
复制
abstract class MyClass {
}

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

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

class MySubClassC @Keep constructor(): MyClass() {
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57206792

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档