【问题标题】:Kotlin AAR library w/ proguard: how to keep extension methods?带有 proguard 的 Kotlin AAR 库:如何保留扩展方法?
【发布时间】: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 之间的唯一区别。某事正在删除此文件...或阻止其生成。

【问题讨论】:

    标签: android kotlin


    【解决方案1】:

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

    【讨论】:

    • 嗨,汤姆!看来这仍然是一个问题。您能否描述一下您为让您的扩展程序被看到所执行的所有步骤?
    • 另外感谢您的帖子)在我添加 @file:JvmName("Extensions") 后,至少我的 kotlin 文件在混淆后可见
    • edit:仅 JvmName 不足以查看 Kotlin 文件,还应添加 JvmMultifileClass。而且它只在java中可见
    • 不好意思打扰了,我发现问题出在R8上,android.enableR8 = false解决了这个问题
    • 会记住这一点)更新:这是在最新版本 2.1.75 中修复的 R8 错误。您可以在 gradle build tools 依赖项之上添加 - "classpath 'com.android.tools:r8:2.1.75" 或将 gradle build tools 升级到 4.1.1+
    猜你喜欢
    • 2020-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-06
    • 2015-09-20
    • 1970-01-01
    • 1970-01-01
    • 2016-07-13
    相关资源
    最近更新 更多