Kotlin 1.6.0 的 proguard / R8 删除了数据 class 元数据
Data class metadata is removed with proguard / R8 for Kotlin 1.6.0
我有一个包含一些数据的包 类,我正在尝试使用 Kotlin 反射在运行时访问构造函数 clazz.primaryConstructor
,
一切都按预期工作,但是当我启用 R8 时,数据 类 元数据被删除,例如当我检查 KClass isData
是否为 returns false 并且主构造函数也为 null 时,这只会发生启用 R8 时。
我尝试了所有方法,包括将 @keep
注释添加到所有数据 类 并添加规则以将所有内容保留在模型包中,我还添加了这些规则
-keep class kotlin.reflect.**
-keep class kotlin.Metadata { *; }
但仍然不走运,知道出了什么问题或如何解决这个问题吗?
提前致谢。
原来的问题是与 AGP 7.0 捆绑在一起的 R8(与 Android Studio - Arctic Fox 一起发布)没有正确处理 Kotlin 的 Kotlin 元数据1.6.0.
如果将 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.gradle
或 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 编译器的版本保持一致。
我有一个包含一些数据的包 类,我正在尝试使用 Kotlin 反射在运行时访问构造函数 clazz.primaryConstructor
,
一切都按预期工作,但是当我启用 R8 时,数据 类 元数据被删除,例如当我检查 KClass isData
是否为 returns false 并且主构造函数也为 null 时,这只会发生启用 R8 时。
我尝试了所有方法,包括将 @keep
注释添加到所有数据 类 并添加规则以将所有内容保留在模型包中,我还添加了这些规则
-keep class kotlin.reflect.**
-keep class kotlin.Metadata { *; }
但仍然不走运,知道出了什么问题或如何解决这个问题吗?
提前致谢。
原来的问题是与 AGP 7.0 捆绑在一起的 R8(与 Android Studio - Arctic Fox 一起发布)没有正确处理 Kotlin 的 Kotlin 元数据1.6.0.
如果将 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.gradle
或 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 编译器的版本保持一致。