微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Proguard 不喜欢 Scala 对象

如何解决Proguard 不喜欢 Scala 对象

运行 proguard 后,当我检查新项目中的混淆 jar 上是否有可用的方法时,这取决于最后一个。所需的类在那里,但我无法访问伴随对象。

图书馆方面

trait KeepOpen
trait KeepOpenObj


trait MyTrait extends KeepOpen {
  def a: Int
}
object MyTrait extends KeepOpenObj {
  def apply(arg: Int): MyTrait = new MyTrait { val a = 1 }
}

取决于项目测试。

import aaa.MyTrait

val arg = 1

def myTraitImpl: MyTrait = ??? // Type is well infered
def myTraitImpl2: MyTrait = MyTrait(arg) // MyTrait companion object is not detected preventing apply method usage

// But this works
def myTraitImpl3: MyTrait = (new MyTrait$)(arg) // Works

以下是我的课程保留选项:

  "-keep !final class * extends aaa.KeepOpen","-keep !final class * extends aaa.KeepOpen {*;}","-keep class * implements aaa.KeepOpenObj","-keep class * implements aaa.KeepOpenObj {*;}",

库的特性继承自 KeepOpen,对象包括伴随对象扩展 KeepOpenObj。

探索jar non obfuscate 和obfuscate,它们都显示了两个文件MyTrait 和MyTrait$ 带有期望的方法,但在混淆的情况下不可能使用伴随对象。

此外,像 main 那样的非伴随对象似乎可以正常工作。

更新

我成功地使推断伴随对象类型及其关联方法添加了以下选项:

-keepattributes Exceptions,InnerClasses,Signature,Deprecated,SourceFile,LineNumberTable,*Annotation*,EnclosingMethod

但不幸的是,我在编译时遇到了以下错误

val myTrait = MyTrait(arg) // error : class aaa.MyTrait is not a value

如何以与非混淆 jar 相同的方式访问伴随对象?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。