2

我有一个包含一些数据类的包,我试图在运行时使用 Kotlin 反射访问构造函数clazz.primaryConstructor,一切都按预期工作,但是当我启用 R8 时,数据类元数据被删除,例如当我检查KClass isData它是否返回 false并且主构造函数也是空的,只有在启用 R8 时才会发生。我尝试了一切,包括将@keep注释添加到所有数据类并添加规则以将所有内容保留在模型包中,我还添加了这些规则

-keep class kotlin.reflect.**

-keep class kotlin.Metadata { *; }

但仍然没有运气,知道出了什么问题或如何解决这个问题吗?

示例回购

提前致谢。

4

1 回答 1

9

原来的问题是与 AGP 7.0 捆绑在一起的 R8(与Android Studio -Arctic Fox 一起发布)无法正确处理 Kotlin 1.6.0 的 Kotlin 元数据。

如果将 Kotlin 1.6.0 ( classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:1.6.0") 与 AGP 7.0 一起使用,则需要 R8 版本 3.0.77 来缩小 Kotlin 库和使用kotlin-reflect. 更新到 AGP 7.0.4 是不够的,因为该版本与 R8 3.0.76 捆绑在一起。

要使用 R8 3.0.77,请将以下内容添加到您的settings.gradleor中settings.gradle.kts

pluginManagement {
    buildscript {
        repositories {
            mavenCentral()
            maven {
                url = uri("https://storage.googleapis.com/r8-releases/raw")
            }
        }

        dependencies {
            classpath("com.android.tools:r8:3.0.77")
            classpath('com.google.guava:guava:30.1.1-jre')
        }
    }
}

AGP 7.0 的另一个选择是使用 Kotlin 1.5.31。

还要考虑使您kotlin-reflect的版本与 Kotlin 编译器的版本保持一致。

于 2021-12-13T07:22:26.040 回答