gpt4 book ai didi

android - 使用 Kotlin 1.6.0 的 proguard/R8 删除了数据类元数据

转载 作者:行者123 更新时间:2023-12-04 23:43:29 30 4
gpt4 key购买 nike

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

-keep class kotlin.reflect.**

-keep class kotlin.Metadata { *; }
但仍然没有运气,知道出了什么问题或如何解决这个问题吗?
Sample Repo
提前致谢。

最佳答案

原来的问题是与 AGP 7.0 bundle 在一起的 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 bundle 在一起。
要使用 R8 3.0.77,请将以下内容添加到您的 settings.gradlesettings.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 编译器的版本。

关于android - 使用 Kotlin 1.6.0 的 proguard/R8 删除了数据类元数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70315232/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com