5

是否有任何工具可以从 Java .class 文件中删除调试信息,就像/usr/bin/strip可以从 Linux 上的 C/C++ 对象文件中删除一样?

编辑:我喜欢 Thilo 和 Peter Mmm 的回答:Peter 的回答很简短,直言不讳地暴露了我对 JDK 附带的内容的无知;Thilo 的 ProGuard 建议无论如何我肯定会检查它似乎提供的所有额外功能。谢谢蒂洛和彼得!

4

1 回答 1

4

ProGuard(例如,Android SDK 附带以减少代码大小)可以执行各种操作来缩小 JAR 文件:

  • 评估常量表达式。
  • 删除不必要的字段访问和方法调用。
  • 删除不必要的分支。
  • 删除不必要的比较和 instanceof 测试。
  • 删除未使用的代码块。
  • 合并相同的代码块。
  • 减少变量分配。
  • 删除只写字段和未使用的方法参数。
  • 内联常量字段、方法参数和返回值。
  • 短的或只调用一次的内联方法。
  • 简化尾递归调用。
  • 合并类和接口。
  • 尽可能将方法设为私有、静态和最终的。
  • 尽可能将类设为静态和最终类。
  • 替换具有单一实现的接口。
  • 执行 200 多个窥视孔优化,例如将 ...*2 替换为 ...<<1。
  • (可选)删除日志记录代码。

他们没有提到删除该列表中的调试信息,但我想他们也可以这样做。

更新:是的,确实:

默认情况下,编译后的字节码仍然包含大量调试信息:源文件名、行号、字段名、方法名、参数名、变量名等。这些信息可以直接反编译字节码和对整个程序进行逆向工程。有时,这是不可取的。诸如 ProGuard 之类的混淆器可以删除调试信息并用无意义的字符序列替换所有名称,从而使对代码进行逆向工程变得更加困难。它进一步压缩代码作为奖励。除了在异常堆栈跟踪中给出的类名、方法名和行号之外,该程序在功能上保持相同。

于 2011-03-10T09:59:27.083 回答