Kotlin AAR库w/proguard:如何保持扩展方法?

问题描述:

我在写一个新的Kotlin库模块来添加常用的类和扩展方法。我编译“扩展”使用JvmMultifileClass每个扩展文件(如BitmapExtensions.kt)到一个文件名为:Kotlin AAR库w/proguard:如何保持扩展方法?

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

fun Bitmap.crop(cropRect: Rect) = ... 

由于我们公司的知识产权政策的一部分,我需要通过proguard的之前混淆库它使任何消费者项目。因此,我需要一个proguard规则来保持这些扩展方法,以便它们不会被丢弃。

乍一看,以下似乎工作,检查生成的AAR的classes.jar显示,扩展方法仍然存在,其内部已被obfusecated。但是,当在一个消费者项目中实际编译时,我得到的未解决的对我引用的任何扩展方法的引用。

-keepclassmembernames class mycompany.kotlin.util.Extensions { 
    <methods>; 
} 

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

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

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

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

我升级到了gradle 4.1里程碑1.当minifyEnabled=true和我的客户端应用程序现在可以正确使用来自lib的扩展方法时,.kotlin_module元数据文件不再被剥离。