【问题标题】:How to prevent kotlin.Unit object from being stripped by Proguard如何防止 kotlin.Unit 对象被 Proguard 剥离
【发布时间】:2017-01-04 17:13:02
【问题描述】:

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

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

我们像这样使用 Unit 类型:

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

是否有解决此问题的方法或者我遗漏了什么?

【问题讨论】:

    标签: proguard kotlin


    【解决方案1】:

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

    -keep class kotlin.Unit { *; }
    

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

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

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

    所有的函数和属性声明在一个文件example.kt里面 将包 org.foo.bar 放入名为 Java 的类中 org.foo.bar.ExampleKt.

    可以使用@JvmName 更改生成的Java 类的名称 注释。

    同样不要在此处的类名后面使用.** 通配符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-30
      • 2013-04-10
      • 1970-01-01
      • 1970-01-01
      • 2014-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多