Proguard 不会删除某些类

Posted

技术标签:

【中文标题】Proguard 不会删除某些类【英文标题】:Proguard does not remove certain classes 【发布时间】:2013-09-23 01:05:17 【问题描述】:

全部

我正在使用 proguard 来混淆 scala 应用程序。

此时我使用的 scala-library 很少,但我的 jar 仍然是 ~300KB,其中 99% 是 scala-library 类。

使用 -whyareyoukeeping 选项,我看到它保留了任何覆盖 java.lang.Object 方法的类,例如“toString”或“equals”。 例如

scala.Some
  is invoked by    scala.Some.equals (300:300)
  implements       java.lang.Object.equals
  is a library method.

所以 scala.Some 类被保留,尽管我没有在我的代码中使用它。

有没有办法解决这个问题,所以我只保留我在代码中实际使用的类?

谢谢 阿米尔

【问题讨论】:

【参考方案1】:

不幸的是,ProGuard 对-whyareyoukeeping 的回答有时包含循环推理。收缩操作是正确的。该类没有被保留,因为它覆盖了 equals(),而是因为它实际上被某些其他所需的类引用。通过查询其他类,你可能会得到更好的印象。

由于传递依赖,即使是一小块 Scala 也可以拖入许多基本类(乍一看常常令人惊讶)。与数兆字节的原始大小相比,300k 的最终大小似乎并不少见。

【讨论】:

以上是关于Proguard 不会删除某些类的主要内容,如果未能解决你的问题,请参考以下文章

如何排除一个类被proguard保留

使用 ProGuard 删除日志不会删除正在记录的字符串 [重复]

Android ProGuard - 只有混淆

Android ProGuard - 只有混淆

使用 proguard / R8 删除数据类元数据

proguard 不会忽略引用的库