proguard - 如何防止 kotlin.Unit 对象被 Proguard 剥离

标签 proguard kotlin

Proguard 会条纹 kotlin.Unit 独立对象(在 Kotlin 运行时库中),如果您使用此类型,则会导致编译错误。以下规则无助于保留此元素(可能是因为 Unit 不是一个,它是一个对象):

-keep class kotlin.Unit.** { *; }

我们使用这样的 Unit 类型:

fun assert(func : Assert.() -> Unit) = Assert().apply(func)

这个问题有解决方法吗还是我遗漏了什么?

最佳答案

在 Progaurd 规则中,类名称后面的通配符表示嵌套类。因此,去掉 Kotlin.Unit 之后的 .**:

-keep class kotlin.Unit { *; }

不直接相关,但如果您使用 Kotlin 的集合,则还需要添加以下 Proguard 规则:

-keep class kotlin.collections.CollectionsKt { *; }

由于 Kotlin 的标准库有自己的 Collections 文件,并且包含顶级函数,并且具有顶级函数的文件不是直接的 Java 类,因此您应该使用 Kotlin 通常用来存储的名称该文件作为 Java 类。来自 Kotlin 的文档:

All the functions and properties declared in a file example.kt inside a package org.foo.bar are put into a Java class named org.foo.bar.ExampleKt.

The name of the generated Java class can be changed using the @JvmName annotation.

再次强调,不要在此处的类名后面使用 .** 通配符。

关于proguard - 如何防止 kotlin.Unit 对象被 Proguard 剥离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41469596/

相关文章:

android - Eclipse 导出的 apk 崩溃

java - 构建失败 : org. codehaus.groovy.control.MultipleCompilationErrorsException

kotlin - 使用具有不同名称的构造函数参数覆盖接口(interface)属性

android - Kotlin 文件无法使用 R.java

java - 如何满足kotlin中Class<T>的嵌套泛型要求

java - 使用混淆器时不显示自定义弹出菜单图标

android - 使用 ProGuard 混淆后应用程序崩溃

android - 如何将资源保留在 proguard_rules.pro 中?

android - 在android中使用proguard的有效方法

Kotlin 和不可变集合?