【发布时间】:2017-07-02 23:43:03
【问题描述】:
我正在编写一个新的 Kotlin 库模块来添加常用的类和扩展方法。我正在使用JvmMultifileClass 将每个扩展文件(例如 BitmapExtensions.kt)编译成一个名为“Extensions”的文件:
@file:JvmName("Extensions")
@file:JvmMultifileClass
fun Bitmap.crop(cropRect: Rect) = ...
作为我们公司知识产权政策的一部分,我需要通过 proguard 对库进行模糊处理,然后才能将其用于任何消费者项目。因此,我需要一个 proguard 规则来保留这些扩展方法,以免它们被丢弃。
乍一看,下面的内容似乎有效,检查生成的 AAR 的 classes.jar 显示扩展方法仍然存在,并且它们的内部结构已被混淆。但是当实际在消费者项目中编译时,我会得到对我引用的任何扩展方法的未解析引用。
-keepclassmembernames class mycompany.kotlin.util.Extensions {
<methods>;
}
当我禁用缩小时,项目会正确构建。
如何混淆我的库并保留我的 kotlin 扩展?
编辑:似乎在整个包上使用keep,甚至指定-dontshrink 是不够的。这些方法根本无法在消费者应用程序中引用。
edit2:我相信我已将其范围缩小到 /META-INF/ 下的 .kotlin_module 文件在 minifyEnabled=true 时被删除。这似乎是我的缩小和非缩小 classes.jar 之间的唯一区别。某事正在删除此文件...或阻止其生成。
【问题讨论】: