带有 proguard 的 Kotlin AAR 库:如何保留扩展方法?

Tom*_*Tom 5 android kotlin

我正在编写一个新的 Kotlin 库模块来添加常用的类和扩展方法。我正在使用以下命令将每个扩展文件(例如 BitmapExtensions.kt)编译成一个名为“Extensions”的文件JvmMultifileClass

@file:JvmName("Extensions")
@file:JvmMultifileClass

fun Bitmap.crop(cropRect: Rect) = ...
Run Code Online (Sandbox Code Playgroud)

作为我们公司 IP 政策的一部分,我需要在库进入任何消费者项目之前通过 proguard对其进行混淆。因此,我需要一个 proguard 规则来保留这些扩展方法,以免它们被丢弃。

乍一看,下面似乎可行,检查生成的 AAR 的 classes.jar 表明扩展方法仍然存在,并且它们的内部结构已被混淆。但是在消费者项目中实际编译时,我得到了对我所引用的任何扩展方法的未解析引用。

-keepclassmembernames class mycompany.kotlin.util.Extensions {
    <methods>;
}
Run Code Online (Sandbox Code Playgroud)

当我禁用缩小时,项目构建正确。

如何混淆我的库并保留我的 kotlin 扩展?

编辑:似乎keep在整个包上使用,甚至指定-dontshrink是不够的。这些方法根本无法在消费者应用程序中引用。

edit2:我相信我已经将范围缩小到.kotlin_module/META-INF/ 下的文件在minifyEnabled=true. 这似乎是我的缩小和非缩小 classes.jar 之间的唯一区别。有些东西正在删除这个文件......或阻止它的生成。

Tom*_*Tom 2

我升级到 gradle 4.1 里程碑 1。当我的消费者应用程序现在可以正确使用库中的扩展方法.kotlin_module时,元数据文件不再被删除。minifyEnabled=true