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 (将#修改为@)